web-dev-qa-db-ja.com

iptables FORWARDチェーントラフィックがtcpdumpに表示されない

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のトラフィックを取得する)?

5
Matan Levy

転送されたトラフィックを明確にリッスンするには、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の範囲の整数で識別されるカーネル内部マルチキャストグループにログを記録します。フレームワークが見るデータグラムの一部のみがキャプチャされます。 IPv4パケットであるiptablesの場合。

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

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

4
Rui F Ribeiro