利用しているポート番号からどのプロセスが利用しているか確認する

既にたくさん記事がありますが、メモ。

# 参考

+ [特定のポート番号をLISTENしているプロセスが知りたい](http://qiita.com/cubicdaiya/items/003e36e17519ef32ac8a)
+ [Linuxでアプリケーションが使用中のポート番号を調べるAdd Starwengtadashi](http://d.hatena.ne.jp/stakizawa/20080324/t1)
+ [LSOF：知ってます → 使えます にする為の記事](http://www.hachim.jp/linux-command/how-to-use-lsof.html)

# 環境

以下の環境のLinuxサーバーで調べてみました。

+ nginxで80ポートを利用
+ sshdで22ポートを利用
+ PostgreSQLで5432ポートを利用

# lsofコマンドで調べる

lsofコマンドは「list open files」ということでプロセスが開いているファイルやディレクトリ(ライブラリなどを含む)とネットワークファイル(インターネットソケットやUNIXドメインソケット)を表示することができるので、ネットワーク調査に使うことができます。

`-i`オプションを使うことでネットワークで特定ポート番号を使っているものやTCPやUDPプロトコルを使っているプロセスのみの絞り込みが出来ます。

```bash
# TCPプロトコルを利用しているものを表示
$sudo lsof -i TCP

# UDPプロトコルを利用しているものを表示
$sudo lsof -i UDP

# 22ポートを使っているものを表示
$sudo lsof -i :22
```

実際に22ポートを使っているプロセスを確認します。

```bash
$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アドレスが分かるようです。

```bash
# 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アドレスで表示する(名前解決しない)

```bash
$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ドメインソケットとは?

[調べなきゃ寝れない！と調べたら余計に寝れなくなったソケットの話](http://qiita.com/kuni-nakaji/items/d11219e4ad7c74ece748)

netstatコマンドを確認するとTCP/UDPプロトコル以外でもUNIXドメインソケットというものが確認できます。

```bash
$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`を利用している事が分かります。

時間のある時にもう少し調べてみます。