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))

おすすめ記事