最終更新日 2025年1月22日
netstatコマンドの全オプションとその説明の一覧や出力結果の見方を確認したい人は下記リンクで該当の場所にジャンプしてください。
スポンサーリンクnetstatコマンドとは?基本概要を解説
Linuxのnetstat(network statistics)コマンドは、システムのネットワーク接続やルーティングテーブル、インターフェースの統計情報を確認するためのツールです。
サーバー管理やネットワークのトラブルシューティングの際に広く活用されています。
現在のLinux環境では、より高速な ss
コマンドが推奨されることもありますが、netstat
は依然として多くのシステムで利用可能であり、ITエンジニアとしては押さえておきたいコマンドだと考えています。
基本概要としてどんなコマンドか以下の順に解説します。
ネットワークの接続が簡単に確認できる
netstat
を使用すると、現在のシステムが確立しているTCP/UDP接続の一覧を取得できます。
これにより、サーバーやクライアントの通信状態を把握することができます。
コマンド例
netstat -an
このコマンドを実行すると、すべてのアクティブな接続が表示されます。
他にも例えば、サーバーが特定のポートでリスニングしているかどうかをチェックするには、以下のように netstat
を使います。
netstat -ln
このコマンドを実行すると、現在リスニングしているポートの一覧が表示されます
スポンサーリンクポートの使用状況の確認ができる
特定のアプリケーションがどのポートを使用しているかを確認できます。
例えば、あるポートが他のプロセスによって使用されているために、新しいアプリケーションが起動できない場合などに役立ちます。
netstat -tulnp
このコマンドを実行すると、現在リスニングしているTCP/UDPポートと、それに紐づいたプロセスID(PID)が確認できます。
ネットワークトラブルシューティングで活用できる
ネットワークの遅延や接続の問題を調査する際に netstat
を活用できます。
例えば、特定のポートが意図せずブロックされている場合や、不審な接続が確立されている場合に調査が可能です。
netstat -ant | grep ESTABLISHED
このコマンドで、確立済みの接続(ESTABLISHED
)のみを抽出して表示できます。
多くの環境でサポートされている
最近のLinuxディストリビューションでは netstat
の代わりに ss
コマンドが推奨されることが増えています。
ss
コマンドは netstat
に比べて高速で、より詳細な情報を提供できるため、新しいシステムでは ss
を使用することが一般的です。しかし、netstat
は依然として多くの環境でサポートされており、伝統的なネットワーク管理ツールとして広く使用されています。
netstat
と ss
の比較
コマンド | 特徴 |
---|---|
netstat | 古くから使われているが、やや動作が遅い |
ss | netstat よりも高速で、詳細な情報を取得できる |
例えば、netstat -ant
の代わりに ss -ant
を使うと、より高速に同じ情報を取得できます。
ss -ant
どちらのコマンドもネットワークの状態を確認するために役立ちますが、環境に応じて使い分けるのが良いでしょう。
netstat
はネットワークの状態を確認するための重要なコマンド- 現在のTCP/UDP接続やリスニングポートを簡単に確認できる
ss
コマンドと比較して遅いが、多くの環境で利用可能
次のセクションでは、netstat
の具体的なオプションと使い方について詳しく解説していきます!
netstatコマンドのオプション一覧と使い方
netstat
コマンドはさまざまなオプションと組み合わせることで、ネットワークの詳細な状態を確認できます。ここでは、よく使われるオプションとその意味、そして実践的な組み合わせ例について解説します。
基本的なオプションとその意味
以下の表に、netstat
の主要なオプションとその意味をまとめました。
オプション | 説明 | 使用例 |
---|---|---|
-a(すべての接続とリスニングポートを表示) | 現在アクティブな接続と、待機中(リスニング中)のポートをすべて表示する。どのサービスが通信を待っているのかを確認できる。 | netstat -a |
-t(TCP接続のみを表示) | TCP(信頼性の高い通信プロトコル)を使った接続だけを表示する。Web(HTTP)やSSH接続を確認するのに便利。 | netstat -t |
-u(UDP接続のみを表示) | UDP(軽量な通信プロトコル)を使った接続だけを表示する。DNSやDHCPなど、UDPを使うサービスの動作確認に役立つ。 | netstat -u |
-n(アドレスやポート番号を数値で表示) | ホスト名(例:example.com)やサービス名(例:http)を表示せず、IPアドレスやポート番号をそのまま数値で表示する。DNSの影響を受けずに素早く結果を確認できる。 | netstat -n |
-p(プロセスIDとプログラム名を表示) | どのプログラム(プロセス)がどのポートを使っているのかを表示する。特定のアプリケーションがどのポートで通信しているのかを調べたいときに便利。 | netstat -p |
-r(ルーティングテーブルを表示) | サーバーやPCがどのネットワーク経路を使って通信しているのかを確認できる。インターネット接続のトラブルシューティングにも活用できる。 | netstat -r |
-i(ネットワークインターフェースの状態を表示) | サーバーやPCに接続されているネットワークインターフェース(LANやWi-Fiなど)の状態を確認できる。どの回線が使われているのかを知りたいときに便利。 | netstat -i |
よく使う組み合わせ5選択
netstat
のオプションは、単体で使うよりも組み合わせることでより詳細な情報を取得できます。以下に、実務でよく使われるコマンドの例を紹介します。
❶すべての接続を数値で表示
netstat -an
利用場面
- 現在確立されているすべての接続(TCP/UDP)を一覧表示
- 名前解決を省略することで、高速に情報を取得できる
❷TCP/UDPのリスニングポートとプロセス情報を表示
netstat -tulnp
利用場面
- 現在サーバー上で待ち受けているポートを確認する時
- プロセスID(PID)とプロセス名も取得できるため、どのアプリケーションがリスニングしているかが分かる
❸ルーティングテーブルの確認
netstat -rn
利用場面
- システムがどの経路を通じてネットワーク通信を行っているかを確認する時
- デフォルトゲートウェイ(
0.0.0.0
やdefault
)の設定をチェックできる
❹確立済みの接続を監視(リアルタイム監視)
watch -n 1 'netstat -ant | grep ESTABLISHED'
利用場面
- 1秒ごとに確立済みのTCP接続をリアルタイムで更新・監視する時など
- 接続が急増した場合や不審な接続がある場合に即座に確認可能
❺特定のポートを使っているプロセスを確認
netstat -antp | grep :80
利用場面
- HTTP(ポート80)を使用しているプロセスを特定する時
- Webサーバー(Apache/Nginx)が正常に動作しているかの確認等
netstatコマンドの全オプションとその説明一覧
netstatコマンドの全オプションとその説明内容の一覧は下記になります。
オプション | 説明 |
---|---|
-r / --route | ルーティングテーブル(ネットワークの経路情報)を表示する。route -e と同じ出力を得られる。 |
-g / --groups | IPv4 / IPv6 のマルチキャストグループの情報を表示する。 |
-i / --interfaces=iface | ネットワークインターフェースの一覧、または指定したインターフェースの情報を表示する。 |
-M / --masquerade | IPマスカレード(NAT でアドレス変換される接続)の一覧を表示する。 |
-s / --statistics | プロトコルごとのネットワーク統計情報を表示する。 |
-v / --verbose | 詳細な情報を表示する。特に、未設定のアドレスファミリーについての情報を出力する。 |
-W / --wide | IPアドレスを省略せずに表示する。デフォルトでは一部のアドレスが切り詰められる場合がある。 |
-n / --numeric | ホスト名やポート名を解決せず、IPアドレスやポート番号をそのまま数値で表示する。 |
--numeric-hosts | ホストアドレスのみ数値で表示し、ポートやユーザー名の解決は行う。 |
--numeric-ports | ポート番号のみ数値で表示し、ホストやユーザー名の解決は行う。 |
--numeric-users | ユーザーID(UID)のみ数値で表示し、ホストやポートの解決は行う。 |
-A / --protocol=family | 表示するアドレスファミリー(inet、inet6、unix など)を指定する。 |
-c / --continuous | 指定した情報を1秒ごとに継続して表示し続ける。 |
-e / --extend | 通常より詳細な情報を表示する(2回指定するとさらに詳しく表示される)。 |
-o / --timers | ネットワーク関連のタイマー情報を表示する。 |
-p / --program | 各ソケットに関連付けられたプロセスID(PID)とプロセス名を表示する。 |
-l / --listening | 待機中(リスニング中)のポートのみを表示する(デフォルトでは省略される)。 |
-a / --all | リスニング中のポートと、確立済みの接続(TCP)をすべて表示する。 |
-F | ルーティング情報をFIB(Forwarding Information Base)から取得して表示する(デフォルト)。 |
-C | ルートキャッシュ(過去のルーティング情報)からルーティングデータを取得して表示する。 |
delay | 指定した秒数ごとにネットワーク統計情報を更新して表示する。 |
netstatコマンドの出力の見方
以下の出力結果をもとに、各カラムの意味を解説します。
出力例
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.1.10:22 203.0.113.5:58321 ESTABLISHED 1023/sshd
tcp6 0 0 :::80 :::* LISTEN 2045/nginx
udp 0 0 0.0.0.0:53 0.0.0.0:* 1502/named
項目名 | 意味 | 1行目(SSH接続の例) | 2行目(Webサーバーの待機状態の例) | 3行目(DNSサーバーの例) |
---|---|---|---|---|
Proto | 通信プロトコル(例:TCP、UDPなど) | tcp(TCPプロトコルを使用) | tcp6(IPv6を使用したTCPプロトコル) | udp(UDPプロトコルを使用) |
Recv-Q | サーバー側で未処理の受信データ量(通常は0が正常) | 0(未処理の受信データはない) | 0(未処理の受信データはない) | 0(未処理の受信データはない) |
Send-Q | サーバーが未送信のデータ量(通常は0が正常) | 0(未送信のデータはない) | 0(未送信のデータはない) | 0(未送信のデータはない) |
Local Address | サーバーのIPアドレスとポート番号(接続元の情報) | 192.168.1.10:22(サーバーのIPとSSH用ポート22番) | :::80(サーバーのポート80番で待機中) | 0.0.0.0:53(ポート53番でDNSリクエストを待機中) |
Foreign Address | 接続先または待機中のクライアントのIPアドレスとポート番号 | 203.0.113.5:58321(外部IP 203.0.113.5からポート58321を使用して接続中) | :::*(どのアドレスからでも接続可能) | 0.0.0.0:*(すべてのIPアドレスからの接続を受け入れ可能) |
State | 接続状態(例:LISTEN、ESTABLISHEDなど) | ESTABLISHED(SSH接続が確立している) | LISTEN(HTTPリクエストを受け入れるために待機中) | 表示なし(UDPでは接続状態が表示されない) |
PID/Program name | 接続に関連するプロセスID(PID)とプログラム名 | 1023/sshd(sshdプロセスが動作中) | 2045/nginx(nginxプロセスが動作中) | 1502/named(namedプロセスが動作中) |
カラム項目の解説
- Proto(プロトコル)
通信で使用されるプロトコルを示します。- TCP 信頼性の高いプロトコル。データの送受信を確認しながら通信します(例:SSH、HTTP)。
- UDP 軽量で高速なプロトコル。確認応答なしでデータを送信します(例:DNS、DHCP)。
- Recv-Q(受信キュー)
サーバーがまだ処理していない受信データの量(バイト単位)を示します。通常は 0 であるべきで、値が大きい場合は受信処理が滞っている可能性があります。 - Send-Q(送信キュー)
サーバーが送信しようとしているが、まだ送信されていないデータの量(バイト単位)を示します。こちらも通常は 0 であるべきで、値が大きい場合は送信側に問題がある可能性があります。 - Local Address(ローカルアドレス)
サーバー側のIPアドレスとポート番号を示します。192.168.1.10:22
サーバーのIPアドレス192.168.1.10
とポート番号22
(SSH)を使用している。:::80
IPv6でポート番号80
(HTTP)を使用している。
- Foreign Address(外部アドレス)
サーバーと接続している外部クライアントのIPアドレスとポート番号を示します。203.0.113.5:58321
外部クライアント(IPアドレス203.0.113.5
)がポート番号58321
を使用して接続中。0.0.0.0:*
すべてのIPアドレスからの接続を受け入れる状態。
- State(接続状態)
接続がどの状態にあるかを示します(※TCPのみ)。- LISTEN サーバーがポートを待機しており、クライアントからの接続を受け付け可能な状態。
- ESTABLISHED サーバーとクライアントが接続済みで、データの送受信が可能な状態。
- TIME_WAIT 接続が終了し、再利用可能になるまで待機中。
- CLOSED 接続が終了済み。
※UDPでは接続状態が表示されません。
- PID/Program name(プロセスIDとプログラム名)
この接続に関連するプロセスとプログラムを示します。1023/sshd
プロセスIDが1023
のsshd
プログラム(SSHデーモン)が動作中。2045/nginx
プロセスIDが2045
のnginx
プログラムが動作中。
まとめ
- netstat のオプションを適切に組み合わせることで、ネットワークの詳細な情報を取得できる
- -an で確立済みの接続を確認し、-tulnp でリスニングポートとプロセスを特定
- ルーティング情報(-r)やネットワークインターフェース(-i)の統計も確認可能
- grep や watch と組み合わせると、リアルタイム監視や特定のポートのチェックができる
次のセクションでは、netstatコマンドの実践的な活用例について詳しく解説します!
スポンサーリンク現場で役立つ!netstatコマンドの実践的な活用例
netstat
コマンドは、単なるネットワーク状態の確認だけでなく、実際の運用現場で様々なトラブルシューティングやネットワーク管理に活用されています。
ここでは、サーバーの通信状況の確認や、不審な接続の検出、ルーティング情報のチェックなど、実践的な使い方を実際に事例をもとに詳しく解説します。
- 事例❶ウェブサーバーのトラブルシューティング(リスニング中のポートを確認する)
- 事例❷不審なアクセスの検出(アクセスが多いポートを特定する)
- 事例❸サーバーへの不正アクセスの調査(不審な接続を検出する)
- 事例❹ブルートフォース攻撃の対応(SSHへの接続の監視)
- 事例❺ネットワーク経路のトラブルシューティング(サーバーのルーティング情報を確認)
事例❶ウェブサーバーのトラブルシューティング(リスニング中のポートを確認する)
以前、私が管理しているLinuxサーバーで「ウェブサイトが表示されない」という障害が発生しました。このサーバーでは、Nginxを使用してウェブサイトを提供しており、通常はポート80(HTTP)とポート443(HTTPS)で通信を行っています。「サーバーは起動しているが、クライアントがサイトに接続できない」というトラブルが起きました。
まず問題を切り分けるため、Nginxがリスニングしているポートを確認する必要があり、以下のコマンドを実行しました。
netstat -tulnp
オプションの意味
-t
TCP接続のみを表示-u
UDP接続のみを表示-l
リスニングしているポートのみを表示-n
アドレスやポート番号を数値で表示(名前解決を省略)-p
プロセスID(PID)とプロセス名を表示
出力例
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1023/sshd
tcp6 0 0 :::80 :::* LISTEN 2045/nginx
udp 0 0 0.0.0.0:53 0.0.0.0:* 1502/named
この出力結果から以下のことがわかりました。
この出力から、
- SSH(ポート22)がリスニング中(
sshd
プロセス) - Nginx(ポート80)が待機中
- DNS(ポート53)がUDPで稼働中(
named
プロセス)
であることがわかります。
上記の結果から、Nginxは問題なくポート80でリスニングしていることが確認できました。
そのため、「ポート80が外部からファイアウォールやネットワーク設定でブロックされている可能性がある」と判断し、ファイアウォールを運用しているチームへ確認依頼をし、ポート80が許可されていないことが判明しました。
事例❷不審なアクセスの検出(アクセスが多いポートを特定する)
ある日、サーバーの負荷が急激に上がり、他のサービスにも影響が出ていました。この状況で、「どのポートに対するアクセスが多いのか」を調べる必要がありました。特に、HTTP(ポート80)やSSH(ポート22)へのアクセスが集中していないか確認するため、以下のコマンドを使いました。
HTTP(ポート80)への接続数を確認するために実施したコマンド
netstat -an | grep :80 | wc -l
SSH(ポート22)への接続数を確認するために実施したコマンド
netstat -an | grep :22 | wc -l
これらのコマンドで、現在ポート80またはポート22に接続しているセッションの数をカウントしました。
HTTP(ポート80)への接続数を確認するために実施したコマンドの出力結果が下記となりました。
50000
ポート80の接続数が50となっており、通常、このサーバーのポート80への接続は100〜200程度で安定しているため、「異常なアクセスが集中している」と判断しました。
さらに、次のコマンドで、どのIPアドレスからの接続が多いのかを確認しました。
実施コマンド
netstat -an | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
実際の出力結果
4500 XXX.XXX.XXX.XXX
15 YYY.YYY.YYY.YYY
10 192.168.1.10
この結果から、特定の外部IPアドレス(XXX.XXX.XXX.XXX)から大量の接続があることが判明しました。このIPアドレスがサーバー負荷の原因と考えられるため、ファイアウォールでアクセスをブロックしました。
スポンサーリンク事例❸サーバーへの不正アクセスの調査(不審な接続を検出する)
私が管理しているサーバーで、セキュリティ監視ツールから「不審な通信が増加している」というアラートを受け取りました。このサーバーはSSH(ポート22)やHTTPS(ポート443)を使用しており、通常は限られたIPアドレスからのアクセスしかありません。しかし、ログイン試行の失敗が急増しており、不正アクセスの可能性が高いと考えました。
まず、不審な接続を検出するために、現在確立されている(ESTABLISHED
状態の)すべての接続を確認しました。
確立済みの接続を確認するために実施したコマンド
netstat -an | grep ESTABLISHED
出力結果
tcp 0 0 192.168.1.10:22 XXX.XXX.XXX.XXX:58321 ESTABLISHED
tcp 0 0 192.168.1.10:443 YYY.YYY.YYY.YYY:51234 ESTABLISHED
この出力を確認したところ、次のような状況が分かりました。
- SSH(ポート22)に外部IPアドレス XXX.XXX.XXX.XXX から接続がある
- HTTPS(ポート443)に外部IPアドレス YYY.YYY.YYY.YYY からアクセスがある
通常、SSHは社内ネットワークからのみ接続を許可しているため、外部IP(XXX.XXX.XXX.XXX)の存在は想定していませんでした。
さらに調査を進めるために、SSH(ポート22)へのアクセス状況を調査することにしました。事例❹に続きます。
スポンサーリンク事例❹ブルートフォース攻撃の対応(SSHへの接続の監視)
SSHへの不審なアクセスがないか確認するため、以下のコマンドを実行しました。
不審な接続を確認するために実施したコマンド
netstat -antp | grep :22
出力結果
tcp 0 0 192.168.1.10:22 XXX.XXX.XXX.5:58321 ESTABLISHED 1023/sshd
tcp 0 0 192.168.1.10:22 XXX.XXX.XXX.6:58322 ESTABLISHED 1023/sshd
tcp 0 0 192.168.1.10:22 XXX.XXX.XXX.7:58323 ESTABLISHED 1023/sshd
上記の出力結果から複数の外部IP(XXX.XXX.XXX.5、XXX.XXX.XXX.6、XXX.XXX.XXX.7)から同時にSSH接続が確立されていることが判明しました。通常では考えられない接続だったため、不正アクセス(ブルートフォース)が行われている可能性が高いと判断しました。
ファイアウォールで接続をブロック
不正アクセスに対する対策として、該当するIPアドレスをファイアウォール(iptables)でブロックすることで、接続を遮断しました。
sudo iptables -A INPUT -s XXX.XXX.XXX.5 -j DROP
sudo iptables -A INPUT -s XXX.XXX.XXX.6 -j DROP
sudo iptables -A INPUT -s XXX.XXX.XXX.7 -j DROP
その後、念のため以下のコマンドを使って1秒ごとに確立済みの接続(ESTABLISHED
)をリアルタイム監視しました。
監視のために実施したコマンド
watch -n 1 'netstat -antp | grep ESTABLISHED'
事例❺ネットワーク経路のトラブルシューティング(サーバーのルーティング情報を確認)
業務中に、特定のクライアントが「サーバーに接続できない」という報告がありました。
このサーバーでは複数のネットワークインターフェースを使用しており、正しいルート(通信経路)が設定されているか確認する必要がありました。
ルーティングテーブルの確認
以下のコマンドを実行して、サーバーのルーティングテーブルを確認しました。
netstat -rn
出力結果
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
10.0.0.0 192.168.1.2 255.255.255.0 UG 200 0 0 eth1
この結果から以下のことが分かりました。
- デフォルトゲートウェイは 192.168.1.1(eth0)
- ローカルネットワーク(192.168.1.0/24)は eth0 を経由
- サブネット(10.0.0.0/24)は 192.168.1.2(eth1) を経由
問題は、クライアントのIPアドレス(10.0.0.50)が10.0.0.0/24のサブネット内にあるのに、サーバーがルート設定を誤っていることでした。サブネットの経路が不正確だったため、以下のコマンドでルートを修正しました。
ルートの修正コマンド
sudo route add -net 10.0.0.0 netmask 255.255.255.0 gw 192.168.1.2 dev eth1
修正後、再度接続を確認したところ、クライアントから問題なくサーバーにアクセスできるようになりました。
sudo iptables -A INPUT -s 203.0.113.45 -j DROP
ゴリタン
インフラエンジニアとして、ネットワークとサーバーの運用・保守・構築・設計に幅広く携わり、
現在は大規模政府公共データの移行プロジェクトを担当。
CCNPやLPICレベル3、AWSセキュリティスペシャリストなどの資格を保有しています。