FreeBSDでオープンポートを見つけるための15の便利な 'Sockstatコマンドの例'


Sockstat は、FreeBSDでネットワークとシステムが開いているソケットを表示するために使用される多目的なコマンドラインユーティリティです。主に、sockstatコマンドはFreeBSDにデフォルトでインストールされており、FreeBSDシステム上で特定のネットワークポートを開いたプロセスの名前を表示するためによく使われます。

ただし、 sockstat は、プロトコルバージョン(両方のIPバージョン)、接続の状態、およびデーモンまたはプログラムがバインドして待機しているポートの種類に基づいてオープンソケットを一覧表示することもできます。

また、通常UnixドメインソケットまたはIPCと呼ばれるプロセス間通信ソケットも表示できます。 Sockstatコマンドをgrepフィルタと組み合わせたり、awkユーティリティを介してパイプ接続したりすると、ローカルネットワークスタックの強力なツールとなります。

ソケットを所有するユーザー、ネットワークソケットのファイル記述子、またはソケットを開いたプロセスのPIDに基づいて、開かれた接続の結果を縮小することがあります。

このガイドでは、FreeBSDのsockstatコマンドラインネットワーキングユーティリティの一般的な利用例を紹介しますが、非常に強力なものも紹介します。

  1. FreeBSD 11.1 Installation Guide

1. FreeBSDで開いているポートをすべて一覧表示する

以下のスクリーンショットに示すように、オプションやスイッチを付けずに単純に実行すると、sockstatコマンドはFreeBSDシステムで開いているすべてのソケットを表示します。

# sockstat

sockstatの出力に表示される値は、次のとおりです。

  • USER : The owner (user account) of the socket.
  • COMMAND : The command which with opened the socket.
  • PID : The process ID of the command which owns the socket.
  • FD : The file descriptor number of the socket.
  • PROTO : The transport protocol (usually TCP/UDP) associated with the opened socket or socket type in case of unix domain sockets (datagram, stream or seqpac) for UNIX sockets.
  • LOCAL ADDRESS : It represents the local IP address for IP based sockets. In case of Unix sockets it represents endpoint filename attached to the socket. The “??” notation implies that the socket endpoint could not be recognized or established.
  • FOREIGN ADDRESS : The remote IP address where the socket is connected to.

2. FreeBSDのリスンポートまたはオープンポートの一覧表示

-l フラグを指定して実行すると、sockstatコマンドは、ネットワークスタックで開かれているすべての待機中のソケットと、システム内のある種のローカルデータ処理に関係するすべての開かれたunixドメインソケットまたは名前付きパイプを表示します。

# sockstat -l

3. FreeBSDでIPv4で開かれているポートを一覧表示する

IPv4 プロトコル専用に開いているすべてのソケットを表示するには、以下の例に示すように、 -4 フラグを指定してコマンドを発行します。

# sockstat -4

4. FreeBSDでIPv6オープンポートを一覧表示する

IPv4バージョンと同様に、以下のようにコマンドを発行することで、 IPv6 専用に開いているネットワークソケットを表示することもできます。

# sockstat -6

5. FreeBSDでTCPまたはUDPで開かれたポートを一覧表示する

TCP UDP など、指定されたネットワークプロトコルのみに基づいてネットワークソケットを表示するには、 -P フラグを使用して、プロトコルの引数名。

プロトコル名は/etc/protocols ファイルの内容を調べることで確認できます。現在、ICMPプロトコルはsockstatツールではサポートされていません。

# sockstat -P tcp
# sockstat -P udp

両方のプロトコルをチェーンします。

# sockstat –P tcp,udp

6. TCPおよびUDP固有のポート番号を一覧表示する

ローカルまたはリモートのポート番号に基づいて、TCPまたはUDP IPで開かれたソケットをすべて表示する場合は、下のスクリーンショットに示すように、以下のコマンドフラグと構文を使用してください。

# sockstat -P tcp -p 443             [Show TCP HTTPS Port]
# sockstat -P udp -p 53              [Show UDP DNS Port] 
# sockstat -P tcp -p 443,53,80,21    [Show Both TCP and UDP]

7. FreeBSDで開かれて接続されているポートの一覧を表示する

開いて接続されているすべてのソケットを表示するには、 -c フラグを使用します。以下のサンプルに示すように、コマンドを発行することで、すべての HTTPS 接続ソケットまたはすべてのTCP接続ソケットを一覧表示できます。

# sockstat -P tcp -p 443 -c
# sockstat -P tcp -c

8. FreeBSDでネットワーク待機ポートを一覧表示する

以下の例に示すように、リスニング状態で開かれているすべてのTCPソケットを一覧表示するには、 -l および -s フラグを追加します。コネクションレス型プロトコルであるため、UDPは接続の状態に関する情報を保持しません。

UDPオープンソケットは、状態を使用して表示することはできません。これは、udpプロトコルがデータグラムを使用してデータを送受信し、接続の状態を判断するための組み込みメカニズムがないためです。

# sockstat -46 -l -s

9. Unixソケットと名前付きパイプの一覧表示

次の図に示すように、Unixドメインソケット、および名前付きパイプなどの他の形式のローカルプロセス間通信は、 -u フラグを使用してsockstatコマンドで表示できます。

# sockstat -u

10. FreeBSDのアプリケーションで開かれているportsのリスト

Sockstatコマンドの出力は、特定のアプリケーションまたはコマンドによって開かれたポートのリストを表示するために、grepユーティリティを介してフィルタリングできます。

Nginx Webサーバーに関連付けられているすべてのソケットを一覧表示する場合、次のコマンドを発行してタスクを実行できます。

# sockstat -46 | grep nginx

Nginx Webサーバーに関連付けられている接続ソケットのみを表示するには、次のコマンドを発行します。

# sockstat -46 -c| grep nginx

11. HTTPS接続プロトコルの一覧表示

下記のコマンドを実行することで、 HTTPS プロトコルに関連付けられたすべての接続ソケットを各接続の状態と一緒に一覧表示できます。

# sockstat -46 -s -P TCP -p 443 -c

12. HTTPリモートソケットの一覧表示

HTTPプロトコルに関連付けられているすべてのリモートソケットを一覧表示するには、次のコマンドの組み合わせのいずれかを実行します。

# sockstat -46 -c | egrep '80|443' | awk '{print $7}' | uniq -c | sort -nr
# sockstat -46 -c -p 80,443 | grep -v ADDRESS|awk '{print $7}' | uniq -c | sort -nr

13. IPアドレスで最も高いHTTPリクエストを探す

各リモートIPアドレスから要求されるHTTP接続数を調べたい場合は、以下のコマンドを発行してください。このコマンドは、Webサーバーがある種のDDOS攻撃を受けているかどうかを判断したい場合に非常に便利です。疑いがある場合は、最も高い要求率でIPアドレスを調査する必要があります。

# sockstat -46 -c | egrep '80|443' | awk '{print $7}' | cut -d: -f1 | uniq -c | sort –nr

14. DNSオープンソケットの一覧表示

各ソケット接続の状態とともにリゾルバによって開かれて、次のコマンドを実行します。

# sockstat -46 -P tcp –p 53 -s

15.ローカルドメインのTCP DNSに問い合わせる

ネットワークにDNSトラフィックがない場合は、次のdigコマンドを実行して、ローカルコンピュータのコンソールからTCPソケットでDNSクエリを手動で起動できます。その後、上記のコマンドを発行して、すべてのリゾルバソケットを一覧表示します。

# dig +tcp  www.domain.com  @127.0.0.1

それで全部です! netstatおよびlsofコマンドラインユーティリティとともに、sockstatコマンドラインは、ネットワーク情報を取得し、FreeBSDネットワークスタックおよびネットワーク関連のプロセスやサービスのさまざまな側面をトラブルシューティングするために使用される強力なユーティリティです。

LinuxのFreeBSDのsockstatコマンドは、 netstat または新しく ss コマンドで表されています。信じられないかもしれませんが、sockstatユーティリティに基づいて、SockStat - Simple Netstat GUIという、Android OS用に開発された同様のアプリケーションを見つけることができます。