Iptables FORWARD チェーンのトラフィックが tcpdump で確認できない

Iptables FORWARD チェーンのトラフィックが tcpdump で確認できない

KVM と 3 つの NIC を搭載したベアメタルで Ubuntu サーバー 16.04 を実行しており、これらはブリッジ br1、br2、br3 によって、同じく Ubuntu サーバー 16.04 を実行しているゲスト VM に接続されています。

最初の NIC (br1) はインターネットに接続されており、そのルーター アドレスはゲストのデフォルト ゲートウェイとして定義されています。

ゲスト上で実行されているコードでは、br2とbr3が受信したパケットをリッスンする必要がありますが、コードは1つのNICのみをリッスンする必要があります。

en2(br2経由でブリッジされているゲストNICの名前)からen3(br3と同じ)にトラフィックを転送しようとしました。これに続いて:

sudo nano /etc/sysctl.conf
uncomment net.ipv4.ip_forward = 1

sudo sysctl -p
sudo iptables -t nat -A POSTROUTING --out-interface en3 -j MASQUERADE  
sudo iptables -A FORWARD --in-interface en2 --out-interfac en3 -j ACCEPT

しかし、使用時に何も記録されずsudo tpcdump -i en3、NIC2にpingメッセージを送信します(実行するとsudo tpcdump -i en2pingメッセージが表示されます)。

ここで何が欠けているのでしょうか? 望ましい結果 (コードが 1 つの NIC をリッスンし、両方の NIC のトラフィックを取得する) を得るためのより良い方法はありますか?

答え1

転送されたトラフィックを具体的にリッスンするには、nflogルール/インターフェースを作成することをお勧めします。

Linux でトラフィックダンプを取得する

そこで、インターフェースを作成しますnflog

sudo iptables -t filter -I FORWARD -j NFLOG --nflog-group 6

そしてそれを聞いてください:

sudo tcpdump -s 0 -n -i nflog:6

この問題の解決策は、iptables フレームワークの nflog インターフェイスを使用して、必要なパケットを正確に取得することです。

nflog ルールは、0 - 2^16-1 の範囲の整数で識別されるカーネル内部マルチキャスト グループにログを記録します。フレームワークが認識するデータグラムの部分のみがキャプチャされます。iptables の場合、これは IPv4 パケットです。

nflog を使用してパケットをダンプすると、tcpdump および wireshark 用の特別なインターフェース構文を使用する必要があります。インターフェースとして nflog:groupnumber を使用する必要があります。

nflog ルールは通常の iptables ルールであるため、必要なトラフィックを正確に取得するには、ルールに適切な一致部分とターゲット部分が必要です。また、必要なパケットを取得するには、ルールを正しい場所に配置する必要があります。

関連情報