多くのプロセスを生成するネットワーク集約的なアプリケーションを実行しているコンピュータがあります。私は最近、コンピュータが存在しない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.100
(netstat -np | grep 1.1.1.100
疑問に思う人のためにnetstat
もう使用されていないと見なされ、ほとんど同じオプションがあり、同じ機能を実行するように設計されています)。これらのどれも結果を返しません。おそらく、開いているソケットがリストされておらず、ARP要求はソケットが生成される前に発生するためです。ss
ss
ss
netstat
もしそうなら、ARP要求を引き起こしたプロセスを識別する方法は何ですか?
ベストアンサー1
ss
arpによってまだ解決されていない接続が表示されます。彼らはゾーンにいます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))