treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Linuxでポートが使われているかどうか調べるlsofコマンド

Linuxのサーバをメンテしているときに、ポートが使われているかどうかをパッと知りたいことがあったので、未来の自分用のご報告です。
lsofコマンドを使います。

lsofコマンド

最近のLinuxにはnetstatコマンドが標準で入っていないこともあるようで、netstatを実行するとコマンドが見つかりません、となってしまいました。
ポートが使われているかどうか、空いている(使って良い)かどうか、という点をパッと確認したかったのですが、lsofコマンドというコマンドで望んでいたことができたので記録しておきたいと思います。

参考:
https://www.atmarkit.co.jp/ait/articles/1904/18/news033.html

ポートの確認には「-i」

lsofコマンドをパッと使うには、「lsof -i」で全体の一覧を画面に表示させることができます。テスト用のDebianで実行してみました。(※実行には「sudo lsof -i」とするかrootで実行しています。

f:id:treedown:20210615005807p:plain
画面から切れていますが、sshの接続が詳細に分ります。※一部改変しています。
--------------------------------------------------------------
# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 416 avahi 12u IPv4 14947 0t0 UDP *:mdns
avahi-dae 416 avahi 13u IPv6 14948 0t0 UDP *:mdns
avahi-dae 416 avahi 14u IPv4 14949 0t0 UDP *:46867
avahi-dae 416 avahi 15u IPv6 14950 0t0 UDP *:51772
sshd 465 root 3u IPv4 17443 0t0 TCP *:ssh (LISTEN)
sshd 465 root 4u IPv6 17454 0t0 TCP *:ssh (LISTEN)
dhclient 492 root 6u IPv4 17753 0t0 UDP *:bootpc
sshd 1064 root 3u IPv4 22068 0t0 TCP 192.168.0.11:ssh->192.168.0.12:51122 (ESTABLISHED)
sshd 1070 TestUser 3u IPv4 22068 0t0 TCP 192.168.0.11:ssh->192.168.0.12:51122 (ESTABLISHED)
--------------------------------------------------------------

ssh接続が存在しているので、接続元となる「192.168.0.11:ssh」が「192.168.0.12」からのssh接続を受けていることも表現されています。また接続しているユーザ名(TestUserというユーザ名)で接続していることも表示されています。

「-i」単体で実行した結果ではポート番号は数字でなく名前で表示されています。
そこで、-iオプションに続いて「-P」オプションも付加することでポート番号で情報表示ができます。

--------------------------------------------------------------
# lsof -i -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 416 avahi 12u IPv4 14947 0t0 UDP *:5353
avahi-dae 416 avahi 13u IPv6 14948 0t0 UDP *:5353
avahi-dae 416 avahi 14u IPv4 14949 0t0 UDP *:46867
avahi-dae 416 avahi 15u IPv6 14950 0t0 UDP *:51772
sshd 465 root 3u IPv4 17443 0t0 TCP *:22 (LISTEN)
sshd 465 root 4u IPv6 17454 0t0 TCP *:22 (LISTEN)
dhclient 492 root 6u IPv4 17753 0t0 UDP *:68
sshd 1064 root 3u IPv4 22068 0t0 TCP 192.168.0.11:22->192.168.0.12:51122 (ESTABLISHED)
sshd 1070 TestUser 3u IPv4 22068 0t0 TCP 192.168.0.11:22->192.168.0.12:51122 (ESTABLISHED)
--------------------------------------------------------------

mdnsと表記されていたMulticast DNS (mDNS)はポート番号「5353」で表示されています。sshはデフォルトポート22番、という具合にポート番号ベースで表示されます。

別のサーバで実行してみる

テスト用のDebianでは特に何も動作させていないので、ちょっと実行結果の出力が寂しい。sambaサーバでも実行してみることにしました。

sambaサーバで「lsof -i」を実行した一部抜粋が以下。

f:id:treedown:20210615005902p:plain
アラートメール用に使っているexim4とか、サーバのデータを同期するために利用しているrsyncと並んで、smbdプロセスが表示されています。

これを「lsof -i -P」でポート番号にすると、

f:id:treedown:20210615005922p:plain
exim4で使っているSMTPポートが25番とか、サーバのデータを同期するために利用しているrsyncが使っているポートは873ですよ、とかが表示されます。
sambaサーバでは定番の445、139がsmbdプロセスで使われており、nmbdでは137、138が使われていることが見て取れます。
続いて、このサーバのIPアドレスでUDP/137やUDP/138が使われており、画面外の別の行では、

smbd 30128 TestUser 38u IPv4 28751830 0t0 TCP 192.168.0.100:445->192.168.0.101:49922 (ESTABLISHED)

このような感じで、sambaサーバに接続しているユーザ名(ここではTestUserというユーザ)と一緒に接続しているサーバとクライアントのIPアドレスが表示されます。

ポート番号個別に確認

ポート番号を個別に確認するには、「-i」オプションに続いてポート番号を指定することで確認可能です。
例えば、ポート80番を確認したければ「lsof -i:80」と指定しますし、443を確認する場合には「lsof -i:443」という具合に指定します。

前述のサーバではhttp/httpsであるポート80や443は使われていないので、

f:id:treedown:20210615005952p:plain
このような感じで、何も表示されず、コマンドは終了します。つまり80や443は使われていない状況である、ということが分ります。
一方で使っているポート(例で445)であれば、445で使われている状態が一覧表示されます。

別のサーバ(Webサーバ)であれば、逆にポート80や443の指定で一覧表示がされそうです。

lsofコマンド、今回初めて知ったコマンドでしたが、今使われているポートをパッと表示させるコマンドとして有用だと思いました。