tcpdumpはTAPインターフェースから着信パケットを見ることができますが、iptablesは見えないのはなぜですか?

tcpdumpはTAPインターフェースから着信パケットを見ることができますが、iptablesは見えないのはなぜですか?

Linuxにパケットを注入するプログラム蛇口インターフェイス(これらのパケットは仮想マシンから来ます)。特にこれはDHCP要求です(したがってUDPです)。存在するパケットは表示できますが、存在tcpdumpするパケットは表示されず、iptablesローカルDHCPサーバーに到達しません。なぜできないのですか、どうすればこの問題を解決できますか?

修正する:インターフェースアドレスにIPパケットを注入しようとしていますtap0。仮想マシンからARP要求が到着するのを見ることができますが、tcpdump -i tap0ネットワーク層には応答がありません。仮想マシンにARP要求を送信すると、仮想マシンはそれを確認してホストに応答します(応答は表示されますがtcpdump失われます)。

別の観察:ifconfig tap0ホストに注入されたすべてのパケットに対してTXドロップパケット数が増加することを示しています。なぜテキサスですか?

# ifconfig tap0
          TX packets:0 errors:0 dropped:958 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

簡単に言うと:Linuxホスト(Ubuntu 10.04を実行)でエミュレートされたイーサネットカードを持つ仮想マシンを実行しています。ホストのネットワークスタックにイーサネットパケットを注入してキャプチャするのに役立つヘルパープログラムと通信してこれを行います。仮想マシンはARMチップエミュレータであり、ヘルパープログラムを呼び出しますnicserver。私が知っているのは次のとおりです。ARM文書

仮想マシンとホストの間にイーサネットリンクを設定し、その上にIPリンクを設定したいと思います。 VM は DHCP を介して IP アドレスを取得します。仮想マシンと残りの世界との間の通信は望ましくなく、ホストマシンだけを通信したいので、仮想ネットワークtap0インターフェイスを作成しました。

tunctl -u gilles
ifconfig tap0 192.168.56.1 netmask 255.255.255.0 up
nicserver -p 7801 -a tap0 &

VMを起動すると、DHCP要求を送信することがわかりますtcpdump -n -i tap0 -vv(DHCPクライアントはタイムアウトせず、ここにはサンプル要求が表示されます)。

tcpdump: listening on tap0, link-type EN10MB (Ethernet), capture size 96 bytes
18:29:23.941574 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 576)
    0.0.0.0.68 > 255.255.255.255.67: [no cksum] BOOTP/DHCP, Request from 02:52:56:47:50:03, length 548, xid 0x238a7979, secs 46, Flags [none] (0x0000)
          Client-Ethernet-Address 02:52:56:47:50:03 [|bootp]

要求を処理するためにホストにDnsmasqを設定しましたが、着信要求は表示されません。 Dnsmasqサーバーは着信要求さえ見ません(私はそれを追跡しました)。それで、Iptablesを使ってパケットを観察してみました。 (すべてのフィルタ/入力ルールを表示します。mangleまたはnatルールは表示されません。)

Chain INPUT (policy ACCEPT 2366K packets, 5334M bytes)
 pkts bytes target     prot opt in     out     source               destination 
  119 39176 LOG        udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:67 LOG flags 4 level 4 prefix `[DHCP request] '
  119 39176 DROP       udp  --  eth1   *       0.0.0.0/0            0.0.0.0/0           udp dpt:67
    2   490 LOG        udp  --  tap0   *       0.0.0.0/0            0.0.0.0/0           LOG flags 4 level 4 prefix `[in=tap0] '
   26  6370 ACCEPT     udp  --  tap0   *       0.0.0.0/0            0.0.0.0/0   
    0     0 ACCEPT     all  --  tap0   *       0.0.0.0/0            0.0.0.0/0   
 3864  457K ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0   

これらの着信DHCP要求はすべてオンになっていますeth1(同僚とネットワーク管理者を怒らないように、この要求を無視しないように注意してください)。これらのUDPパケットはtap0ローカルSambaサーバーから提供されます。 tcpdumpを使用して見たDHCP要求パケットがパケットフィルタを通過できないようです!

tap0tcpdumpwithから着信ブロードキャストパケットが表示されますが、withでは表示されないのはなぜですかiptables(コンピュータでリッスンするプログラムはありません)。これらのパケットがイーサネットインターフェイスから来るように見えるようにするには、何を変更する必要がありますか?

ベストアンサー1

これは追加の推測です。これが役に立つことを願っていますが、間違っている可能性があります。

tap0には、カーネルネットワークスタックの終わりとプログラムインタフェースの終わりの2つの端があります。 "nicserver"を提供するためにtap0を使用している場合、Tapデバイスは意図した方法で接続するためにプログラムインターフェイスを使用しないようです。代わりに、nicserver はネットワークスタック側でのみ書き込み、プログラムインタフェース側ではアプリケーションを読み取らないため、最終的にデバイスキューがオーバーフローします。これは、ドロップされたパケットについて説明します。また、iptables の結果を記述できるパケットは転送されません。

私の意見では、tap0でtcpdumpキャプチャを許可すると、実際にはtap0のプログラムインターフェイスの側面に接続され、組み込み、パケットが表示されます。インターネットで検索しましたが、この動作を確認するソースが見つかりませんでした。この理論に反論するには、tap0をキャプチャして、パケット損失とiptablesログにどのような影響があるかを確認してください。

最後に、元の質問に対する提案:ループバックデバイスを使用するのはどうですか?このように:

nicserver -p 7801 -a lo

おすすめ記事