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要求パケットがパケットフィルタを通過できないようです!
tap0
tcpdump
withから着信ブロードキャストパケットが表示されますが、withでは表示されないのはなぜですかiptables
(コンピュータでリッスンするプログラムはありません)。これらのパケットがイーサネットインターフェイスから来るように見えるようにするには、何を変更する必要がありますか?
答え1
これは追加の推測です。これが役に立つことを願っていますが、間違っている可能性があります。
tap0には、カーネルネットワークスタックの終わりとプログラムインタフェースの終わりの2つの端があります。 "nicserver"を提供するためにtap0を使用している場合、Tapデバイスは意図した方法で接続するためにプログラムインターフェイスを使用しないようです。代わりに、nicserver はネットワークスタック側でのみ書き込み、プログラムインタフェース側ではアプリケーションを読み取らないため、最終的にデバイスキューがオーバーフローします。これは、ドロップされたパケットについて説明します。また、iptables の結果を記述できるパケットは転送されません。
私の意見では、tap0でtcpdumpキャプチャを許可すると、実際にはtap0のプログラムインターフェイスの側面に接続され、組み込み、パケットが表示されます。インターネットで検索しましたが、この動作を確認するソースが見つかりませんでした。この理論に反論するには、tap0をキャプチャして、パケット損失とiptablesログにどのような影響があるかを確認してください。
最後に、元の質問に対する提案:ループバックデバイスを使用するのはどうですか?このように:
nicserver -p 7801 -a lo
答え2
これiptable
テーブルあなたが印刷しているのはフィルターテーブル。
これフィルターチェックリストマッチルーティング決定が行われた後にのみ可能です。
このブログの図を確認してください。 https://www.garron.me/en/linux/iptables-manual.html
トラフィックを転送するときにパケット数が増えるかどうかを確認するには、別のテーブルを確認してください。
iptables -nvL -t raw;
iptables -nvL -t nat;
iptables -nvL -t mangle;