使用 conntrack 標記將 Iptables 移植到 Nftables 防火牆
嗨,尊敬的社區,
我很難將功能非常強大的 iptables 防火牆移植到 nftables。輸入/輸出/轉發的東西沒有問題,主要是 conntrack 標記。我目前做的是以下幾點:
1/ 我使用命令創建三個路由表
ip
,以及規則和連接標記。他們每個人都有一個預設路由,我的 FDDI、我的 VPN 或我的 4G 連接。ip route add table maincnx default dev $WAN via 192.168.1.2 ip route add table maincnx 192.168.0.0/24 dev $LAN src 192.168.0.1 ip route add table maincnx 192.168.1.0/24 dev $WAN src 192.168.1.1 ip rule add from 192.168.1.2 table maincnx [[ $VPN ]] && ip route add table vpnclient default dev $VPNIF via $VPNCLIENTIP [[ $VPN ]] && ip route add table vpnclient $VPNCLIENTROUTE dev $VPNIF src $VPNCLIENTIP [[ $VPN ]] && ip route add table vpnclient 192.168.0.0/24 dev $LAN src 192.168.0.1 [[ $VPN ]] && ip route add table vpnclient 192.168.1.0/24 dev $WAN src 192.168.1.1 ip rule add from $VPNCLIENTIP table vpnclient ip route add table altcnx default dev $WAN2 via 192.168.2.2 ip route add table altcnx 192.168.0.0/24 dev $LAN src 192.168.0.1 ip route add table altcnx 192.168.1.0/24 dev $WAN src 192.168.1.1 ip route add table altcnx 192.168.2.0/24 dev $WAN2 src 192.168.2.1 ip rule add from 192.168.2.2 table altcnx ip rule add from all fwmark 1 table maincnx [[ $VPN ]] && ip rule add from all fwmark 2 table vpnclient ip rule add from all fwmark 3 table altcnx ip route flush cache
2 / 然後,我將一些 iptables 規則放在一起:(如果有人已經在為 iptables 版本苦苦掙扎,我會留下評論)
$IPTABLES -t mangle -A PREROUTING -j CONNMARK --restore-mark # Restore mark previously set $IPTABLES -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT # If a mark exists: skip $IPTABLES -t mangle -A PREROUTING -s 192.168.0.5 -p tcp --sport 50001 -j MARK --set-mark 2 # route through VPN $IPTABLES -t mangle -A PREROUTING -s 192.168.0.3 -j MARK --set-mark 2 $IPTABLES -t mangle -A PREROUTING -s 192.168.0.4 -j MARK --set-mark 3 # route through 4G $IPTABLES -t mangle -A POSTROUTING -j CONNMARK --save-mark # save marks to avoid retagging
3/ 相關的後路由:
$IPTABLES -t nat -A POSTROUTING -o $WAN -j SNAT --to-source 192.168.1.1 $IPTABLES -t nat -A POSTROUTING -o $WAN2 -j SNAT --to-source 192.168.2.1 [[ $VPN ]] && $IPTABLES -t nat -A POSTROUTING -o $VPNIF -j SNAT --to-source $VPNCLIENTIP
ps:如果腳本啟動時 VPN 已啟動並執行,$VPN 顯然是一個設置為 1 的變數。還有一些其他的事情可以讓這個工作,比如 IP 規則清理和一些預路由/轉發,但這不是這裡的重點,如果你有興趣,評論,我會完整地發布它們。
類型:網關有 3 個 eth:0/1/2,使用 ips 192.168.1.1 (FDDI)、192.168.0.1 (LAN)、192.168.2.1 (4G),網關為 192.168.1.2 用於 FDDI,192.168.2.2 用於在 4G 中,VPN 位於 IP 大約為 10.8.0.x 的 TUN0 設備上。
所以基本上,當 192.168.0.5 向 50001:tcp 埠發起連接時,它是通過 VPN 路由的。192.168.0.3 一直在使用 VPN,無論它試圖連接什麼,192.168.0.4 正在通過 4G 連接,而所有其他預設情況下,使用路由表 1 並通過 FDDI 連接。
問題:我猜工作的 Ip 部分與 nftables 保持相同,但是 nftables 中的等效命令是什麼,可以像 iptables 一樣在這裡完成修改和路由後處理?
iptables-translate
隨任何現代iptables
安裝提供(或可能單獨打包,搜尋它)。它將(嘗試)將iptables規則轉換為nftables規則。如果不想閱讀所有文件(包括使用此工具)和手冊頁,這是一種簡單的方法。它不需要使用root。對於這種情況(使用虛擬資訊完成一些變數以應對 OP 創建規則的方式):
$ export IPTABLES=/usr/sbin/iptables-translate $ $IPTABLES -V iptables-translate v1.8.7 (nf_tables) $ export WAN=wan WAN2=wan2 VPNIF=vpnif VPNCLIENTIP=192.0.2.2 VPN=1
$ cat > /tmp/rules.bash <<'EOF' $IPTABLES -t mangle -A PREROUTING -j CONNMARK --restore-mark # Restore mark previously set $IPTABLES -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT # If a mark exists: skip $IPTABLES -t mangle -A PREROUTING -s 192.168.0.5 -p tcp --sport 50001 -j MARK --set-mark 2 # route through VPN $IPTABLES -t mangle -A PREROUTING -s 192.168.0.3 -j MARK --set-mark 2 $IPTABLES -t mangle -A PREROUTING -s 192.168.0.4 -j MARK --set-mark 3 # route through 4G $IPTABLES -t mangle -A POSTROUTING -j CONNMARK --save-mark # save marks to avoid retagging $IPTABLES -t nat -A POSTROUTING -o $WAN -j SNAT --to-source 192.168.1.1 $IPTABLES -t nat -A POSTROUTING -o $WAN2 -j SNAT --to-source 192.168.2.1 [[ $VPN ]] && $IPTABLES -t nat -A POSTROUTING -o $VPNIF -j SNAT --to-source $VPNCLIENTIP EOF
結果:
$ bash /tmp/rules.bash nft add rule ip mangle PREROUTING counter meta mark set ct mark nft add rule ip mangle PREROUTING mark != 0x0 counter accept nft add rule ip mangle PREROUTING ip saddr 192.168.0.5 tcp sport 50001 counter meta mark set 0x2 nft add rule ip mangle PREROUTING ip saddr 192.168.0.3 counter meta mark set 0x2 nft add rule ip mangle PREROUTING ip saddr 192.168.0.4 counter meta mark set 0x3 nft add rule ip mangle POSTROUTING counter ct mark set mark nft add rule ip nat POSTROUTING oifname "wan" counter snat to 192.168.1.1 nft add rule ip nat POSTROUTING oifname "wan2" counter snat to 192.168.2.1 nft add rule ip nat POSTROUTING oifname "vpnif" counter snat to 192.0.2.2
翻譯者可能不知道或無法翻譯某些部分,並且在發生這種情況時會將該行註釋掉,例如:
$ /usr/sbin/iptables-translate -A INPUT -s 192.0.2.2 -j LED --led-trigger-id test nft # -A INPUT -s 192.0.2.2 -j LED --led-trigger-id test
由於這個轉儲的翻譯沒有包含任何評論,因此可以假設翻譯沒問題。只需正確重命名表、鏈(和內容回變數)以與nftables規則集中選擇的內容兼容並重用它。如果需要,改進或簡化(例如:
counter
表達式僅用於調試或統計,而不用於實際操作)。如果需要,通常可以使用nftables提供的新功能(例如:使用地圖進行更好的分解)對其進行改進,但這不在此答案的範圍內。
警告:不要只是盲目地相信翻譯,nftables的特性仍然必須知道。
翻譯工具不知道使用的上下文,所以 OP 仍然必須理解,即使檢查後才從翻譯中發現的表達式和語句。我只是給出一個 OP 不需要的範例:當在 OUTPUT 掛鉤中為重新路由的特定目的設置(conn)標記時(對於 PREROUTING 中設置的標記沒有什麼特別之處,因為它是在路由之前完成的,這不適用於 FORWARD ),使用nftables執行此操作的正確方法是在鏈中
type route hook output
設置一個標記,而type filter hook output
不是觸發重新路由:支持的鏈類型
$$ … $$
…為了有一個重新路由發生在所有。這裡
nft add rule ip mangle OUTPUT
不會講述這個細節,因為通常mangle在使用nftables時只是轉換為過濾器。人們必須了解它是如何工作的:翻譯不能做所有事情。