Firewall
nftables 表和鏈優先級
我的 nftables 設置有問題。
我有兩張桌子,每一張都有一個帶有相同鉤子但名稱和優先級不同的鏈。
這些表位於由包含參數載入的不同文件中。
由於優先級,我認為 VPN-POSTROUTING 鏈將在 INTERNET 鏈之前執行。但在我的設置中,首先執行 INTERNET 鏈。
table ip nat { chain INTERNET { type nat hook postrouting priority srcnat + 1; policy accept; oifname br2 masquerade } }
table ip vpn { chain VPN-POSTROUTING { type nat hook postrouting priority srcnat - 1; policy accept; oifname br2 ip saddr 10.0.0.0/24 ip daddr 192.168.0.0/24 accept } }
我的錯誤在哪裡?
編輯:我更改了規則並將所有鏈添加到同一個表中,結果相同。
在下一步中,我按照 AB 的建議將計數器和日誌添加到規則中。
鏈的順序與優先級相對應,但不會觸發 VPN 的接受規則。
當我將 VPN 接受規則添加到 INTERNET 鏈中時,就在偽裝規則之前,它按預期工作。
從歷史上看,在給定的鉤子中曾經有一個 NAT 鏈(預路由、輸入、輸出……)。執行 nat 語句或簡單地接受作為鏈的終端的數據包,對於單個鏈,它也結束了鉤子內的處理。由於nftables允許在同一個鉤子中使用多個鏈,終止一個鏈將繼續到下一個鏈。因此,如果第一個鏈不做任何事情(通過接受),下一個鏈就有機會去做,這不是預期的。
為了解決這個問題,第一個鏈(或任何其他鏈)可以將消息傳遞給每個下一個鏈,以便它可以對其採取行動:為下一個鏈設置一個標記(任意值)以改變其行為。
設置一個標記,而不是
accept
具有零效果(將鏈VPN-POSTROUTING
留空也執行預設策略:)。accept
所以VPN-POSTROUTING
用這個替換規則:nft add rule ip vpn VPN-POSTROUTING oifname br2 ip saddr 10.0.0.0/24 ip daddr 192.168.0.0/24 mark set 0xdeaf
設置此標記後,可以在另一條鏈上使用它來通過不執行剩餘規則來更改行為。首先將此規則插入
ip nat INTERNET
:nft insert rule ip nat INTERNET mark 0xdeaf accept