タップインターフェースでiptablesを使用してパケットをフィルタリングする

タップインターフェースでiptablesを使用してパケットをフィルタリングする

ゲスト マシンがインターネットにアクセスできないようにファイアウォール ルールを作成しようとしています。サーバー (Ubuntu サーバー 22.0、KVM を使用) には、ルーターに接続された物理接続 (enp34s0) とブリッジ インターフェイス (br0) があり、ゲストは br0 と同じネットワークにブリッジされたタップ デバイス (vnet0) を使用しています。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 を送信できます。(https を防ぐために -p tcp --dport 443 も試しました) 何か間違っているのでしょうか? TAP デバイスであることと関係があるかどうかはわかりませんが、Web 上で関連する情報は見つかりませんでした。

答え1

FORWARDICMP トラフィックをキャプチャするためのログ ルールをテーブルに追加すると...

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 デバイスが表示されますPHYSINphysdev次のようにモジュールを使用してこれを一致させることができます。

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

(反対方向のトラフィックを一致させる必要がある場合は、--physdev-out マッチもあります。)

関連情報