在 Tap 介面上使用 iptables 過濾封包

在 Tap 介面上使用 iptables 過濾封包

我正在嘗試編寫防火牆規則以防止訪客電腦存取互聯網。伺服器(Ubuntu伺服器22.0,使用KVM)有一個實體連接(enp34s0),它連接到路由器,一個橋接介面(br0),並且來賓使用一個tap設備(vnet0),它橋接到同一網路br0。我嘗試在 vnet0 上應用的任何規則都不起作用。

例如,我嘗試使用以下命令阻止 ping: iptables -I FORWARD -i vnet0 -o br0 -p icmp -j DROP iptables -I FORWARD -o vnet0 -i br0 -p icmp -j DROP iptables -I FORWARD -i vnet0 -o enp34s0 -p icmp -j DROP iptables -I FORWARD -o enp34s0 -i br0 -p icmp -j DROP

我仍然可以向客人發送 ping。 (也嘗試使用 -p tcp --dport 443 來阻止 https)我做錯了什麼嗎?無法弄清楚它是否與它是 TAP 設備這一事實有關,並且在網路上沒有找到任何相關資訊。

答案1

如果您將日誌記錄規則新增至表中FORWARD以擷取任何 ICMP 流量...

iptables -I FORWARD -p icmp -j LOG --log-prefix 'FORWARD_ICMP '

....您會看到輸入介面是橋接器,而不是 TAP 設備:

Sep 09 19:19:20 fizzgig kernel: FORWARD_ICMP IN=virbr0 OUT=wlp0s20f3
PHYSIN=vnet1 MAC=52:54:00:f7:70:2a:52:54:00:18:f8:12:08:00 SRC=192.168.122.210
DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=59668 DF PROTO=ICMP TYPE=8
CODE=0 ID=5 SEQ=1 

這意味著您的規則-i vnet0永遠不會匹配。

您可以在屬性中看到 TAP 設備PHYSIN。我們可以使用physdev模組來匹配它,如下所示:

iptables -A FORWARD -m physdev --physdev-in vnet1 -j DROP

(如果您需要符合另一個方向的流量,則還有一個 --physdev-out 匹配。)

相關內容