iptables/nftables:如何從路由器上的連線追蹤中排除所有轉送的流量?

iptables/nftables:如何從路由器上的連線追蹤中排除所有轉送的流量?

Linux 機器有多個網路介面。為 IPv4 和 IPv6 啟用 IP 轉送。

我想透過狀態防火牆保護路由器本身運作的服務。為此,需要啟用連線追蹤。同時,我想從連線追蹤中排除從一個介面轉送到另一個介面的所有流量。

對於狀態防火牆,我通常會使用過濾器表的 INPUT 和 OUTPUT 鏈。轉送的流量將進入 FORWARD 鏈。但據我所知,沒有辦法將 FORWARD 鏈中的流量標記為未追蹤。這樣的邏輯必須進入原始表中的 PREROUTING 鏈。但是,我相信,在 PREROUTING 鏈中,還沒有決定是否轉送流量。

連線追蹤有很多缺點,例如當追蹤的連線清單達到最大大小時,封包會遺失。

從連線追蹤中排除轉送流量(並且僅排除轉送流量)的最簡單方法是什麼?

答案1

對於通用規則集,可以詢問nftables使用以下命令提前進行路由查找fib表達式而不是等待路由堆疊執行此操作。這允許涉及(未來)輸出介面儘管還不存在(路由決策沒有發生),但代價是額外的查找。然後,如果結果表明資料包將被路由,則使用notrack陳述。

FIB 表達式

fib {saddr | daddr | mark | iif | oif} [. ...] {oif | oifname | type}

A謊言表達式查詢謊言(轉送資訊庫)取得特定位址將使用的輸出介面索引等資訊。輸入是用作輸入的元素元組謊言尋找功能。

不追蹤聲明

notrack 語句允許停用某些資料包的連線追蹤。

notrack

請注意,為了使該語句有效,必須在執行之前將其應用於資料包連線發生查找。因此,它需要與以下任一者處於一個鏈中:預路由或者輸出鉤子並且鉤子優先級為-300或更低。

因此,應該從以下位置進行“簡單”的路線檢查預路由,僅使用目標位址作為選擇器並檢查輸出介面是否存在(不可路由的封包或發送到主機的封包不會解析任何封包)。有一個例外(環回)介面以保持追蹤:雖然它代表本地流量,但發送的資料包(透過輸出從主機到自身的路徑)透過預路由路徑並且有一個輸出接口也。由於傳出資料包已經創建了連線條目,最好保持一致。

nft add table ip stateless
nft add chain ip stateless prerouting '{ type filter hook prerouting priority -310; policy accept; }'
nft add rule ip stateless prerouting iif != lo fib daddr oif exists notrack

ip用組合系列替換該系列inet應將相同的通用行為擴展到 IPv4+IPv6。

更具體地說,可以指定未來的輸出接口,fib daddr oif eth1例如,它或多或少相當於oif eth1,但也可以在預路由

當然,如果事先知道拓撲,則可以透過使用基於位址測試的一個或多個規則來避免 FIB 查找,因為管理員可以事先知道路由。可能需要對結果進行基準測試才能知道這是否比保留通用方法更有趣。

例如,根據OP提供的信息,將先前的規則替換為:

nft add rule ip stateless prerouting 'ip daddr != { 192.168.1.1, 192.168.2.1, 127.0.0.0/8 } notrack'

應該有近乎同等的效果。 127.0.0.0/8 的存在原因與上述相同介面.

處理廣播(如 192.168.1.255 收到的乙太網路0)和多播(例如在介面上接收到的鏈路本地224.0.0.1)可能在兩種方法中都無法以相同的方式工作,也不如預期的那樣,並且可能需要針對特定需求的附加規則,特別是對於第二種方法。由於追蹤廣播和多播很少有用,因為回應來源不會(也不能)是原始廣播或多播位址目的地,因此 conntrack 條目永遠不會「看到」雙向流量,因此對於國家規則。


筆記

  • 這通常與狀態 NAT 不相容。

    我的理解是,發送到遠端主機的 DNAT 將獲得未取消 NAT 的回覆流量並失敗,並且轉送的 SNAT 不會觸發,因為沒有連線條目已建立。輸入路徑中很少使用的 SNAT 應該沒問題,並且 DNAT+SNAT(使用本地地址源)的組合也可能起作用,因為那時在原始和回複方向上都涉及本地目的地,因此連線然後應該始終正確地建立或查找條目。

  • 標準規則集

    實際規則使用iptables或者nftables(在它自己的不同表中)然後可以照常完成,包括主機本身的狀態規則。由於路由流量不會創建連線條目、規則(如果涉及此類流量)應僅是無狀態的,並且不使用任何ct表達式,因為它永遠不會匹配。

  • 驗證行為

    即使沒有適當的防火牆規則,也可以透過以下方式檢查整體行為:

    • 使用虛擬ct規則來確保連線設施在目前網路命名空間中註冊。

      nft add table ip mytable
      nft add chain ip mytable mychain '{ type filter hook prerouting priority -150; policy accept; }'
      nft add rule ip mytable mychain ct state new
      
    • 使用conntrack追蹤事件的工具:

      conntrack -E
      
    • 從遠端產生流量

      新的連線然後將為路由器接收的流量建立條目,但不會為路由的流量建立條目。

相關內容