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 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 ルールであるため、必要なトラフィックを正確に取得するには、ルールに適切な一致部分とターゲット部分が必要です。また、必要なパケットを取得するには、ルールを正しい場所に配置する必要があります。