lsof でIPを指定する
lsof で探すときに、指定したIPでリッスンしているものを見たいときにどうするのか、複数のIPがあると明示的に指定したいですね。
ポートを使ってるプロセスを見る
たとえば、22番を使ってるプロセスを探す。
lsof -i :22 -n
実例
$lsof -i :22 -n COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME dropbear 3272 root 3u IPv4 618 0t0 TCP 192.168.1.1:ssh (LISTEN) dropbear 18793 root 0u IPv4 853114 0t0 TCP 192.168.1.1:ssh->172.16.4.3:54401 (ESTABLISHED)
ip を@マークで指定する。
lsof では @マークで ip アドレスを指定することができる。
アドレス指定
lsof -i @192.168.1.201
アドレス・ポート指定
lsof -i @192.168.1.201:10000
IPv6の場合
いい感じに囲む必要がある。
ls of -i @[2001::::97c]:22
また、v6のIPすべてでリッスンしている場合は、次のようにv4/v6ともに具体的なIPなく表示される。
$sudo lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 946 root 5u IPv4 23026 0t0 TCP *:ssh (LISTEN) sshd 946 root 6u IPv6 23028 0t0 TCP *:ssh (LISTEN)
実際にやってみた例。
アドレス・ポート指定でどのアプリがリッスンしているか見ることができた。
root@jitsi:~# lsof -i @10.185.93.136:3479 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME turnserve 569 turnserver 36u IPv4 17368603 0t0 UDP jitsi.lxd:3479 turnserve 569 turnserver 37u IPv4 17368604 0t0 UDP jitsi.lxd:3479 turnserve 569 turnserver 38u IPv4 17368605 0t0 UDP jitsi.lxd:3479 turnserve 569 turnserver 39u IPv4 17368606 0t0 UDP jitsi.lxd:3479
root@jitsi:~# lsof -i @10.185.93.136:10000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1341 jvb 155u IPv6 17592832 0t0 UDP jitsi.lxd:10000
ss コマンドとの違い
lsof だと「プロセス」を探すので、wireguardのようなカネールモジュールのリッスンは見えない。
該当プロセスが見つからないとき、正確にポートをリッスンしているかどうかをみたいなら ss -nlu
(udp) ss -nlt
(tcp)を使ってもいいと思う。
2023-04-19 追記
IPv6の場合について追記。
2023-05-16 追記
ポートのみの場合と、ssとの違いについて言及