![如何在linux網橋上使用nft來阻止對某些ip位址的存取?](https://rvso.com/image/789281/%E5%A6%82%E4%BD%95%E5%9C%A8linux%E7%B6%B2%E6%A9%8B%E4%B8%8A%E4%BD%BF%E7%94%A8nft%E4%BE%86%E9%98%BB%E6%AD%A2%E5%B0%8D%E6%9F%90%E4%BA%9Bip%E4%BD%8D%E5%9D%80%E7%9A%84%E5%AD%98%E5%8F%96%EF%BC%9F.png)
我有一個定義了橋的 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 非常有用,也許你可以像我一樣從中學習: