tcpdumpはIptables FORWARDチェーントラフィックを表示できません

tcpdumpはIptables FORWARDチェーントラフィックを表示できません

KVMを含むUbuntu Server 16.04を実行しているベアメタルと、ブリッジbr1、br2、およびbr3を介してUbuntu Server 16.04を実行しているゲストVMに接続されている3つのNICがあります。

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

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

en2(br2を介してブリッジされたゲストネットワークカードの名前)から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 ルールであるため、目的のトラフィックを正確に取得するには、ルールに正しい一致とターゲット部分が必要です。また、関心のあるパケットを取得できるように、ルールを正しい場所に配置する必要があります。

関連情報