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 en2
pingメッセージを見ることができます)
私がここで何を見逃しているのでしょうか?必要な結果を得るためのより良い方法はありますか(私のコードは1つのNICを受信し、両方のNICからトラフィックを取得します)?
答え1
nflog
転送されたトラフィックを具体的に受信するには、ルール/インターフェースを作成するのが最善です。
したがって、インターフェイスを作成します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 ルールであるため、目的のトラフィックを正確に取得するには、ルールに正しい一致とターゲット部分が必要です。また、関心のあるパケットを取得できるように、ルールを正しい場所に配置する必要があります。