ウェブサイト検索

FreeBSD で開いているポートを見つけるための 15 の便利な Sockstat コマンドの例


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

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

また、通常 Unix ドメイン ソケットまたは IPC として知られるプロセス間通信ソケットを表示することもできます。 Sockstat コマンドと awk ユーティリティを組み合わせると、ローカル ネットワーキング スタックにとって強力なツールであることがわかります。

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

このガイドでは、FreeBSD の Sockstat コマンド ライン ネットワーキング ユーティリティの一般的な使用例と非常に強力な使用例をいくつかリストします。

要件

  1. FreeBSD 11.1 インストールガイド

1. FreeBSD で開いているすべてのポートをリストする

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

# sockstat

Sockstat 出力に表示される値は次のように説明されます。

  • ユーザー : ソケットの所有者 (ユーザー アカウント)。
  • コマンド : ソケットを開いたコマンド。
  • PID : ソケットを所有するコマンドのプロセス ID。
  • FD : ソケットのファイル記述子番号。
  • PROTO : UNIX ソケットの UNIX ドメイン ソケット (データグラム、ストリーム、または seqpac) の場合は、開いたソケットまたはソケット タイプに関連付けられたトランスポート プロトコル (通常は TCP/UDP)
  • ローカル アドレス : IP ベースのソケットのローカル IP アドレスを表します。 Unix ソケットの場合、ソケットに接続されているエンドポイントのファイル名を表します。 \??” 表記は、ソケット エンドポイントが認識または確立できなかったことを意味します。
  • 外部アドレス : ソケットが接続されているリモート IP アドレス。

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 の開いているポートをリストする

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

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

TCPソケットのみを表示
# sockstat -P tcp
UDPソケットのみを表示
# 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 のアプリケーションによって開かれたポートの一覧表示

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 が開いているソケットをリストする

TCP トランスポート プロトコル経由で内部クライアントにサービスを提供するように社内でキャッシュおよび転送 DNS サーバーを構成しており、すべてのソケットのリストを表示したい場合

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

15. ローカル ドメインで TCP DNS をクエリする

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

# dig +tcp  www.domain.com  @127.0.0.1

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

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