ARPリクエストを発生させたプロセスを確認するには?

ARPリクエストを発生させたプロセスを確認するには?

多くのプロセスを生成するネットワーク集約的なアプリケーションを実行しているコンピュータがあります。私は最近、コンピュータが存在しないIPアドレスを見つけるためにARP要求を生成していることを発見しました。トラブルシューティングのために、ボックス内のどのプロセスがARP要求を生成するかを追跡したいと思います。したがって、アプリケーションのどの部分が存在しないIPを探しているかを知ることができます。

IPは変更されていますが、とにかく重要ではありません。

tcpdump同じネットワーク上の別のコンピュータで実行して、これらのARP要求を見つけました。

# tcpdump -i eth0 arp -t -n
ARP, Request who-has 1.1.1.100 tell 1.1.1.1, length 46

アドレスがあるデバイスがあるという意味ではないので、どのプロセスがそのデバイスを探しているのかを探したいと1.1.1.100思います。1.1.1.1

私も試してみましたss -np | grep 1.1.1.100netstat -np | grep 1.1.1.100疑問に思う人のためにnetstatもう使用されていないと見なされ、ほとんど同じオプションがあり、同じ機能を実行するように設計されています)。これらのどれも結果を返しません。おそらく、開いているソケットがリストされておらず、ARP要求はソケットが生成される前に発生するためです。ssssssnetstat

もしそうなら、ARP要求を引き起こしたプロセスを識別する方法は何ですか?

答え1

ssarpによってまだ解決されていない接続が表示されます。彼らはゾーンにいますSYN-SENT。問題は、この状態が接続が失敗するのは数秒間しか維持されないため、見えない可能性があることです。高速ポーリングを試すことができます

while ! ss -p state syn-sent | grep 1.1.1.100; do sleep .1; done

この状態を拡張する1つの方法は、arpテーブルのIPアドレスに任意の有線MACアドレスを設定することです。これにより、接続がタイムアウトするのに30秒以上かかり、表示が簡単になりますss

たとえば、私のeth0は192.168.1.1にあります。

$ socat tcp:192.168.1.100:80 - 
$ arp -i eth0 -n | grep 192.168.1.100
192.168.1.100 (incomplete) eth0

Macアドレスを設定すると、socatが簡単に表示されます。

$ sudo arp -i eth0 -s 192.168.1.100 80:ef:00:ff:ff:ff
$ socat tcp:192.168.1.100:80 - &
$ ss -p state syn-sent
Netid  Recv-Q Send-Q Local Address:Port Peer Address:Port                
tcp    0      1      192.168.1.1:46608 192.168.1.100:http users:(("socat",pid=20230,fd=3))

答え2

あなたはそれを使用することができますインターネット豚プロセス固有のネットワークトラフィックを表示するプログラムです。ただし、arpは実行中のプロセスから直接生成されるのではなく、オペレーティングシステムによって生成されます。一部のプログラムは 1.1.1.100 と通信しようとするかもしれませんが、その IP が ARP テーブルに存在しないため、オペレーティングシステムは MAC アドレステーブルを埋めるために ARP パケットを送信します。

DHCPサーバーは1.1.1.1で実行されていますか?私が言うことは、DHCPサーバーがリースの範囲内のアドレスを調べて、それらのどれが無料であるかを確認することです。

答え3

ちょうど同じ問題が発生しました。いくつか試した後、sysdigに戻った。これは私にとってうまくいきます。

sysdig fd.rip=1.1.1.100

私の場合、問題のIPは実際には172.28.210.22であり、出力は次のようになります。

# sysdig fd.rip=172.28.210.22
5987580 15:42:55.952661802 7 dhclient (1232) < sendto res=300 data=...............*............RT..................................................
6318682 15:43:01.237021372 7 dhclient (1232) > sendto fd=6(<4u>172.28.210.22:67->172.28.208.42:68) size=300 tuple=0.0.0.0:68->172.28.210.22:67
6318683 15:43:01.237080305 7 dhclient (1232) < sendto res=300 data=...............*............RT..................................................
6926596 15:43:10.092470330 7 dhclient (1232) > sendto fd=6(<4u>172.28.210.22:67->172.28.208.42:68) size=300 tuple=0.0.0.0:68->172.28.210.22:67
6926608 15:43:10.092541255 7 dhclient (1232) < sendto res=300 data=...............*............RT..................................................
8882391 15:43:31.595024934 7 dhclient (1232) > sendto fd=6(<4u>172.28.210.22:67->172.28.208.42:68) size=300 tuple=0.0.0.0:68->172.28.210.22:67

これは、これがdhclientから来たことを明らかに示しています。

関連情報