更新 nftables 後設定錯誤

更新 nftables 後設定錯誤

過去兩年一直使用 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

  • 可以使用以下方法分解具有不同連接埠值的相同規則匿名集nftables 版本 >= 1.0.2 甚至有-o(最佳化)選項嘗試自動執行此操作。

相關內容