既にたくさん記事がありますが、メモ。
参考
- 特定のポート番号をLISTENしているプロセスが知りたい
- Linuxでアプリケーションが使用中のポート番号を調べるAdd Starwengtadashi
- LSOF:知ってます → 使えます にする為の記事
環境
以下の環境のLinuxサーバーで調べてみました。
- nginxで80ポートを利用
- sshdで22ポートを利用
- PostgreSQLで5432ポートを利用
lsofコマンドで調べる
lsofコマンドは「list open files」ということでプロセスが開いているファイルやディレクトリ(ライブラリなどを含む)とネットワークファイル(インターネットソケットやUNIXドメインソケット)を表示することができるので、ネットワーク調査に使うことができます。
-i
オプションを使うことでネットワークで特定ポート番号を使っているものやTCPやUDPプロトコルを使っているプロセスのみの絞り込みが出来ます。
# TCPプロトコルを利用しているものを表示
$sudo lsof -i TCP
# UDPプロトコルを利用しているものを表示
$sudo lsof -i UDP
# 22ポートを使っているものを表示
$sudo lsof -i :22
実際に22ポートを使っているプロセスを確認します。
$sudo lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 2385 root 3u IPv4 9936 0t0 TCP *:ssh (LISTEN)
sshd 2385 root 4u IPv6 9938 0t0 TCP *:ssh (LISTEN)
sshd 2932 root 3u IPv4 13443 0t0 TCP ip-172-31-30-226.ap-northeast-1.compute.internal:ssh->h101-111-248-034.catv02.itscom.jp:35332 (ESTABLISHED)
sshd 2934 ec2-user 3u IPv4 13443 0t0 TCP ip-172-31-30-226.ap-northeast-1.compute.internal:ssh->h101-111-248-034.catv02.itscom.jp:35332 (ESTABLISHED)
なるほど、COMMAND列でプロセス名が表示されるので、sshdで利用している事が分かります。
また、LISTEN(待ち受けている)ものとESTABLISHED(今現在接続されている)ものが表示されていますね。
PID列でプロセスIDが表示されているのでps
コマンドやpstree
コマンドで対象プロセスの詳細も確認できます。
ちなみにNAME列の部分を見ると受け付けているIPアドレスが分かるようです。
# postgresql.localhost(127.0.0.1)からの接続のみ受付
$sudo lsof -i :5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postmaste 2896 postgres 3u IPv4 12859 0t0 TCP localhost:postgres (LISTEN)
# nginx.全てのIPアドレスから受付
$sudo lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 2640 root 6u IPv4 10923 0t0 TCP *:http (LISTEN)
nginx 2640 root 7u IPv6 10924 0t0 TCP *:http (LISTEN)
nginx 2641 nginx 6u IPv4 10923 0t0 TCP *:http (LISTEN)
nginx 2641 nginx 7u IPv6 10924 0t0 TCP *:http (LISTEN)
netstatコマンドで調べる
以下のようにオプションの指定及びポート番号の指定で確認できます。
- -aオプション->現在の全ての接続を表示。指定しないとESTABLISHEDな接続のみを表示
- -pオプション->プロセスIDとプロセス名を表示する
- -nオプション->ホスト名で表示せず、IPアドレスで表示する(名前解決しない)
$sudo netstat -apn | grep :22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2385/sshd
tcp 0 36 172.31.30.226:22 101.111.248.34:51959 ESTABLISHED 23842/sshd
tcp 0 0 172.31.30.226:22 101.111.248.34:35332 ESTABLISHED 2932/sshd
tcp 0 0 :::22 :::* LISTEN 2385/sshd
一番上に表示されれているのがIPv4、一番下に表示されているのがIPv6ですね。あと2つは既に確立している接続なので先ほどのlsof
コマンドと同じ結果です。
(おまけ)UNIXドメインソケットとは?
調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話
netstatコマンドを確認するとTCP/UDPプロトコル以外でもUNIXドメインソケットというものが確認できます。
$sudo netstat -ap --protocol unix
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 12861 2896/postmaster /tmp/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 12860 2896/postmaster /var/run/postgresql/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 7897 1/init @/com/ubuntu/upstart
unix 2 [ ACC ] SEQPACKET LISTENING 8162 1518/udevd @/org/kernel/udev/udevd
unix 9 [ ] DGRAM 9105 2107/rsyslogd /dev/log
unix 2 [ ACC ] STREAM LISTENING 9240 2147/rpcbind /var/run/rpcbind.sock
unix 2 [ ACC ] STREAM LISTENING 9423 2199/dbus-daemon /var/run/dbus/system_bus_socket
unix 2 [ ] DGRAM 9316 2168/rpc.statd
unix 3 [ ] STREAM CONNECTED 10926 2640/nginx
unix 2 [ ] DGRAM 10004 2414/ntpd
unix 2 [ ] DGRAM 10106 2443/sendmail: Queu
unix 3 [ ] STREAM CONNECTED 40021 24411/sshd
unix 3 [ ] DGRAM 8170 1518/udevd
unix 3 [ ] STREAM CONNECTED 9432 2199/dbus-daemon /var/run/dbus/system_bus_socket
unix 3 [ ] STREAM CONNECTED 40022 24409/sshd
unix 3 [ ] STREAM CONNECTED 9427 2199/dbus-daemon
unix 3 [ ] STREAM CONNECTED 10927 2640/nginx
unix 2 [ ] DGRAM 40017 24409/sshd
unix 3 [ ] STREAM CONNECTED 9431 1/init
unix 2 [ ] DGRAM 40572 24538/sudo
unix 3 [ ] STREAM CONNECTED 9426 2199/dbus-daemon
unix 2 [ ] DGRAM 12443 2034/dhclient
unix 3 [ ] DGRAM 8171 1518/udevd
unix 2 [ ] DGRAM 10127 2455/crond
unix 2 [ ] DGRAM 10085 2434/sendmail
同一マシンのみのプロセス間通信しかできませんが、TCP/UDPと比べて遥かに高速に動作させることができるようです。
IPアドレスの指定ではなく、ファイル名で指定します。
例えば上記ではPostgreSQLでは/tmp/.s.PGSQL.5432
を利用している事が分かります。
時間のある時にもう少し調べてみます。