過去兩年一直使用 nftables 相同的配置,前幾天更新了程序,現在它抱怨我的配置無效,儘管所有文件仍然說它是正確的。也許有人能發現流氓符號之類的東西?
這是我的配置:
flush ruleset
# `inet` applies to both IPv4 and IPv6.
table inet filter {
chain input {
type filter hook input priority 0;
# accept any localhost traffic
iif lo accept
# no ping floods:
ip protocol icmp icmp type echo-request limit rate over 10/second burst 4 packets drop
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
# accept traffic originated from us
ct state established,related accept
# ssh
tcp dport 22 accept
# http/https
tcp dport 80 accept
tcp dport 443 accept
# tftp/netboot
udp dport 4011 accept
udp dport 67 accept
tcp dport 69 accept
udp dport 69 accept
# listinator
tcp dport 8080 accept
tcp dport 4343 accept
# smb
tcp dport 139 accept
tcp dport 445 accept
udp dport 137 accept
udp dport 138 accept
# mc
tcp dport 25565 accept
# count and drop any other traffic
counter drop
}
chain output {
type filter hook output priority 0;
policy accept;
}
chain forward {
type filter hook forward priority 0;
nft add rule inet filter forward ct status dnat accept;
policy drop;
}
}
以及啟動時的錯誤:
Starting nftables...
/etc/nftables.conf:57:6-8: Error: syntax error, unexpected add
nft add rule inet filter forward ct status dnat accept;
^^^
nftables.service: Main process exited, code=exited, status=1/FAILURE
nftables.service: Failed with result 'exit-code'.
Failed to start nftables.
答案1
這是在一個nftables 腳本用命令載入nft -f
。這個nft
字裡面沒有任何意義,不應該出現。但同一個地方還有 1 1/2 其他問題。那麼讓我們來看看:
該命令抱怨該行周圍nft
有:
chain forward { type filter hook forward priority 0; nft add rule inet filter forward ct status dnat accept; policy drop; }
nft
即將刪除,已經在
inet filter forward
(鏈)區塊內所以
add rule inet filter forward
也必須去除。實際上這;
是多餘的,因為後面有一個新行。ct status dnat accept
policy drop;
必須與基礎鏈定義放在一起這次是
;
語法的強制部分。關鍵字policy
是的一部分鏈定義,不屬於規則定義。雖然目前這似乎已被接受,透過規則與其基本鏈定義分開,但這不是值得依賴的:這可能會在以後的版本中發生變化。同樣的註解也適用於
output
鏈:不要policy accept;
與其基礎鏈定義分離,這樣以後就不會錯誤地在它們之間插入規則。
該forward
鏈條最終應替換為:
chain forward {
type filter hook forward priority 0; policy drop;
ct status dnat accept
}
什麼是正確的語法,但不是很有趣,是不在區塊內部定義規則,而是完全在結構外部,在腳本末尾,如下所示:
chain forward {
type filter hook forward priority 0; policy drop;
}
}
add rule inet filter forward ct status dnat accept
無論如何,nft list ruleset
它將像以前一樣在鏈塊中顯示出來inet filter forward
。
筆記:
雖然可以使用
ip protocol icmp
,但使用起來並不好ip6 nexthdr ipv6-icmp
原因是,與 IPv4 相反,IPv4 標頭中的協定始終是第 4 層協議,而 IPv6 的下一個標題並不總是第 4 層(icmp、udp、tcp...)標頭:它可以是擴充頭出現在 IPv6 標頭和第 4 層(最終)標頭之間。在這種情況下,規則將不符。
作業系統已經確定了該資料包屬於哪個第 4 層協議,因此該資訊可作為元資訊而不是資料包內容資訊:
meta l4proto ipv6-icmp
。這也是記錄在手冊頁中:
此表達式指的是 ipv6 標頭欄位。使用時請注意
ip6 nexthdr
,該值僅指下一個標頭,即ip6 nexthdr tcp
僅在 ipv6 封包不包含任何擴充標頭時才符合。分段的資料包或包含路由擴充標頭的資料包將不會被匹配。meta l4proto
如果您希望匹配真實的傳輸標頭並忽略任何其他擴充標頭,請使用。但實際上,由於同一條線路確實包含一條
icmpv6 type ...
線路,這已經過濾了第 4 層協定以匹配 ICMPv6,同時使用 ICMPv6 隱含設定第 3 層協定以符合 IPv6: 根本不需要做任何事情來使其正確。同樣,出於同樣的原因,前一行也可以不使用
ip protocol icmp
(但其當前的行為仍然很好)。該行:
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
必須簡單地替換為:
icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
(無需前置
meta nfproto ipv6 meta l4proto icmpv6
)TFTP
-
TCP 連接埠 69 從未使用過,因此不需要規則來允許它。
TFTP 與狀態防火牆
TFTP對於防火牆來說,這是一個與 FTP 一樣困難的協定。初始查詢後,資料傳輸本身不再使用 UDP 連接埠 69。充分利用TFTP 連線追蹤助手
nf_conntrack_tftp
可能需要附加規則(應該自動載入核心模組),除非net.netfilter.nf_conntrack_helper
重新啟用已棄用的 sysctl 設定。在這裡解決這個問題確實會變得偏離主題。請參閱我的答案的開頭(僅)CentOS 8作為帶有nft和firewalld的NAT路由器-如何讓它通過TFTP?有一個範例 TFTP 規則集,可以複製該規則集來替換nftables wiki 中的 FTP 範例。
-
可以使用以下方法分解具有不同連接埠值的相同規則匿名集。nftables 版本 >= 1.0.2 甚至有
-o
(最佳化)選項嘗試自動執行此操作。