KVMおよびブリッジbr1、br2、br3によってゲストに接続されている3つのNICを備えたUbuntuサーバー16.04を実行しているベアメタルがありますVM Ubuntuサーバーも実行しています16.04。
最初のNIC-br1-はインターネットに接続されており、そのルーターアドレスはゲストのデフォルトゲートウェイとして定義されています。
ゲストで実行中のコードで、br2とbr3が受信したパケットをリッスンする必要があります。コードは1 NICのみをリッスンする必要があります。
En2(ゲストの名前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
を使用してpingメッセージをNIC2に送信すると何も記録されません(Sudo tpcdump -i en2
を実行すると、pingメッセージが表示されます)
ここで何が欠けていますか?私が希望する結果を得るためのより良い方法はありますか(私のコードは1 NICをリッスンし、両方のNICのトラフィックを取得する)?
転送されたトラフィックを明確にリッスンするには、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の範囲の整数で識別されるカーネル内部マルチキャストグループにログを記録します。フレームワークが見るデータグラムの一部のみがキャプチャされます。 IPv4パケットであるiptablesの場合。
Nflogを使用してパケットをダンプすると、tcpdumpとWiresharkの特別なインターフェイス構文を使用する必要があります。インターフェイスとしてnflog:groupnumberを使用する必要があります。
Nflogルールは通常のiptablesルールであるため、ルールは適切な一致とターゲット部分を必要とし、必要なトラフィックを正確に取得します。また、目的のパケットを取得するには、ルールを正しい場所に配置する必要があります。