TCP/IP ネットワーク接続は、ブロック、ドロップ、オープン、またはフィルター処理されている可能性があります。これらのアクションは、通常、システムが使用する IPtables ファイアウォールによって制御され、ネットワーク ポートでリッスンしているプロセスやプログラムとは無関係です。ファイアウォールの向こうでは、プログラムまたはプロセス (サーバーまたはデーモン) がポートでリッスンしている場合と、リッスンしていない場合があります。これは、netstat または ss プログラムを使用して確認できます。ポートが開いているか、ブロックされているか、ドロップされているか、ファイアウォールでフィルタリングされているかどうかを確認するのは簡単ではありません。これには 2 つの方法があります:
- ポートを外部でテストする
- ファイアウォール構成を一覧表示し、出力を調べます
1. netstat を使用してリッスン プロセスを確認する
プログラムまたはプロセスがポートでリッスンしているかどうか、パケットを受け入れる準備ができているかどうかを確認するには、netstat コマンドを使用します。
# netstat -tulnp
netstat コマンドの引数は次のとおりです:
t – TCP を表示
u – UDP を表示
l – リッスンしているプロセスのみを表示する (netstat は、リッスンしている接続と確立されているすべての接続の両方を表示できます。つまり、クライアントとしても表示できます)
n – ネットワークの IP アドレス名またはポート番号を解決しない
p – ポートでリッスンしているプロセス名を表示する
例:
# netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1254/rpcbind tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1484/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1355/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1562/master tcp 0 0 0.0.0.0:44349 0.0.0.0:* LISTEN 1274/rpc.statd udp 0 0 0.0.0.0:111 0.0.0.0:* 1254/rpcbind udp 0 0 0.0.0.0:631 0.0.0.0:* 1355/cupsd udp 0 0 0.0.0.0:44165 0.0.0.0:* 1274/rpc.statd udp 0 0 0.0.0.0:602 0.0.0.0:* 1274/rpc.statd udp 0 0 0.0.0.0:1001 0.0.0.0:* 1254/rpcbind
2. ss を使用してリスニング プロセスを確認する
プログラムまたはプロセスがポートでリッスンしているかどうか、パケットを受け入れる準備ができているかどうかを確認するには、ss プログラムを使用します。
# ss -nutlp
ss プログラムの引数は次のとおりです:
t – TCP ソケットを表示します。u – UDP ソケットを表示します。
l – リッスン ソケットを表示する
n – 今すぐ名前解決を試みてください
p – ソケットを使用してプロセスを表示
例:
# ss -nutlp Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:111 *:* users:(("rpcbind",1254,6)) udp UNCONN 0 0 *:631 *:* users:(("cupsd",1355,9)) udp UNCONN 0 0 *:44165 *:* users:(("rpc.statd",1274,8)) udp UNCONN 0 0 *:602 *:* users:(("rpc.statd",1274,5)) udp UNCONN 0 0 *:1001 *:* users:(("rpcbind",1254,7)) tcp LISTEN 0 128 *:111 *:* users:(("rpcbind",1254,8)) tcp LISTEN 0 128 *:22 *:* users:(("sshd",1484,3)) tcp LISTEN 0 128 127.0.0.1:631 *:* users:(("cupsd",1355,7)) tcp LISTEN 0 100 127.0.0.1:25 *:* users:(("master",1562,12)) tcp LISTEN 0 128 *:44349 *:* users:(("rpc.statd",1274,9))
3. lsof を使用して開いているポートを見つける
システムで開いているすべてのポートを一覧表示するには、次のコマンドを使用して、ポートを開いたプロセス名と番号を一覧表示します。
# lsof -i
以下に出力例を示します:
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1254 rpc 6u IPv4 12592 0t0 UDP *:sunrpc rpcbind 1254 rpc 7u IPv4 12596 0t0 UDP *:1001 rpcbind 1254 rpc 8u IPv4 12597 0t0 TCP *:sunrpc (LISTEN) rpc.statd 1274 rpcuser 5r IPv4 12784 0t0 UDP *:xmlrpc-beep rpc.statd 1274 rpcuser 8u IPv4 12788 0t0 UDP *:44165 rpc.statd 1274 rpcuser 9u IPv4 12792 0t0 TCP *:44349 (LISTEN) cupsd 1355 root 7u IPv4 13147 0t0 TCP localhost:ipp (LISTEN) cupsd 1355 root 9u IPv4 13150 0t0 UDP *:ipp sshd 1484 root 3u IPv4 13707 0t0 TCP *:ssh (LISTEN) master 1562 root 12u IPv4 13923 0t0 TCP localhost:smtp (LISTEN) sshd 1657 root 3r IPv4 14745 0t0 TCP 192.168.1.50:ssh->192.168.1.101:49549 (ESTABLISHED)
ポートの外部テスト
telnet アプリケーションは、単純なネットワーク ソケット接続のテストに使用できますが、UDP ではなく TCP 接続にのみ使用できます。たとえば、システムの TCP ポート 80 が接続を受け入れる準備ができているかどうかを確認したい場合は、IP アドレスと telnet のポートを指定します。
# telnet 192.168.1.55 80 Trying 192.168.1.55... Connected to example.redhat.com (192.168.1.55). Escape character is '^]'.
サーバーがリッスンしていない場合、応答は異なります:
# telnet 10.0.0.25 80 Trying 10.0.0.25... telnet: connect to address 10.0.0.25: Connection refused telnet: Unable to connect to remote host: Connection refused
- これは、接続がアクティブに拒否されたことを示します。 TCP サブシステムはパケットを受信して調べ、ポート 80 でソケットを開く要求であることを確認し、接続を受け入れる準備ができているプロセスがないことを確認し、拒否で応答しました。
- ファイアウォールが接続をブロックまたはフィルタリングするように構成されている場合、接続を受け入れる準備ができているプロセスがあったとしても、telnet は上記と非常によく似たものを表示します。
- ファイアウォールが接続をドロップするように構成されている場合、まったく応答がなく、代わりに telnet がタイムアウトします:
# telnet 10.0.0.25 80 Trying 10.0.0.25... telnet: connect to address 10.0.0.25: Connection timed out
ファイアウォール ルールの一覧表示
Red Hat Enterprise Linux では、サービス コマンドを使用してファイアウォール ルールを一覧表示できます。
# service iptables status
または、iptables コマンドを使用して:
# iptables -xvn -L