如何在linux網橋上使用nft來阻止對某些ip位址的存取?

如何在linux網橋上使用nft來阻止對某些ip位址的存取?

我有一個定義了橋的 Ubuntu 盒子br0。橋接器已eth0連接至網際網路服務並eth1連接到 PC 的網路連接埠。該橋正在按預期運行,並通過eth0和之間的所有交通eth1

我想新增一條規則來阻止 PC 存取某些外部 IP 位址(例如 1.1.1.1)。我認為nft這是做到這一點的方法。如何寫規則,以便沒有任何內容可以傳入br0/傳出 1.1.1.1。

這裡的目的是能夠模擬某些故障進行測試。

答案1

這是使用完成的nftables'橋樑家族

nftables提供橋系列作為替代品ebtables

在中建立一個表家庭:

# nft add table bridge t

建立一個鏈來過濾轉送的幀:

# nft add chain bridge t c '{ type filter hook forward priority 0; policy accept; }'

建立規則以阻止 IP 封包乙太網路1達到 1.1.1.1:

# nft add rule bridge t c iif eth1 ether type ip ip daddr 1.1.1.1 drop

無狀態防火牆就這樣了。


自從Linux核心5.3 nftables也支援直接狀態防火牆小路:

新增對橋的本機連接追蹤支援。在此補丁集之前,人們進行狀態過濾的唯一機會是使用br_netfilter模擬層,這是棄用它的一個進步[...]

這樣可以輕鬆地在單一方向上隔離系統。例如允許:

  • 透過 SSH 對 PC 進行傳入訪問
  • 從 PC 發出的存取:要使用的 PC和 DNS(th以下分別代表TCP協定UDP協定
  • ARP(沒有它就沒有 IPv4 連線)
  • 一切都需要回覆流量(出於性能原因作為第一條規則)
  • 沒有別的

可以使用:

# nft add rule bridge t c ct state related,established accept
# nft add rule bridge t c oif eth1 ether type ip tcp dport 22 accept
# nft add rule bridge t c iif eth1 ether type ip meta l4proto {tcp, udp} th dport 53 accept
# nft add rule bridge t c iif eth1 ether type ip icmp type echo-request accept
# nft add rule bridge t c ether type arp accept
# nft add rule bridge t c drop

某些分解當然是可能的並且應該考慮(例如:透過使用集合和串聯)。


上面的所有範例都不會影響 Ubuntu 盒子本身,它仍然可以到達並被雙方到達。要影響從 PC 到 Ubuntu 盒子(或從 Ubuntu 盒子到 PC)的流量,可以在鏈鉤子上執行相同類型的規則輸入(分別。輸出) 代替向前


筆記:

br_netfilter不應載入模組(預設啟用 sysctl 屬性net.bridge.bridge-nf-call-iptables = 1)以避免本機之間的意外交互規則和ip家庭規則也影響nftables一樣好iptables。這意味著br_netfilter應避免在同一系統上執行 Docker 或 Kubernetes(這兩個常用使用者)在進行網路實驗時(但仍可以額外小心,例如:透過調整此 UL SE 問答)。

載入br_netfilter( 和net.bridge.bridge-nf-call-iptables = 1) 會誤導您認為正常的操作方式是在ip家庭在篩選/向前鉤。這不是正常情況,而且nftables缺乏利用此功能的附加功能,例如iptables'physdev匹配模組:相反,目標始終是在本機中執行此操作家人並沒有依靠br_netfilter

答案2

如果您的 Linux 主機作為路由器運行,您還需要設定 ip_forwarding。

要回答您的問題,您可以像這樣使用 nftables:

#!/usr/bin/nft 

flush ruleset

table inet my_table {
   chain INPUT {
      iifname br0 saddr 1.1.1.1 drop
      iifname br0 daddr 1.1.1.1 drop
   }

chain FORWARD {
      iifname br0 saddr 1.1.1.1 drop
      iifname br0 daddr 1.1.1.1 drop
   } 

}

並使用 nft -f /path/to/your/nft.file 執行此操作

不過這有點沒用(我知道你正在學習 nftables,不要太嚴厲)。最佳實踐是丟棄所有內容並僅允許所需的內容,因此不會丟棄特定流量,而是允許特定流量。

我發現 red hat 8 文件對於 nftables 非常有用,也許你可以像我一樣從中學習:

rhel 8 nftables 文檔

相關內容