それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

lsof でIPを指定する /v4 or v6 / ポート使ってるプロセスを見る

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との違いについて言及