【ネットワークコマンド】 通信ソケット確認ツール netstatの使い方
今回は、Linuxでネットワーク状態を確認するときに使うnetstatコマンドについて紹介します。
サーバーに接続できない、ポートが待ち受けていない、どのプロセスが通信しているか分からない、といった場面で netstatは役に立ちます。
後継のssコマンドの台頭で使用頻度が下がってきていますが、古いLinux環境や組み込み機器向けのLinuxでは現役の重要ツールです。
この記事では、UbuntuなどのLinux環境を前提に、netstatのインストール方法から実践的な確認手順までをまとめます。
目次
- netstatとは
- netstatコマンドのインストール
- よく使うnetstatの基本操作
- 出力項目の読み方
- ルーティングとインタフェース確認
- トラブルシュートでの使い方
- ssコマンドとの違い
- 用途別のオプション実行例
- おわりに
- 参考文献
netstatとは
netstatは、ネットワーク接続、待受ポート、ルーティングテーブル、インタフェース統計などを確認できるコマンドです。
Linuxでは昔から使われてきた代表的な確認ツールです。
ただし、現在は後継のssコマンドの台頭で使用頻度が下がってきてもいます。
とは言え、古いLinux環境や組み込み機器向けLinuxではまだまだ現役のツールですので、知っていて損はありません。
(まあ、組み込み機器向けのLinuxの場合、そのnetstatですらインストールされていないときもありますが。。。)
補足
最近のLinuxではssコマンドが推奨されることも多いですが、 netstatを理解しておくと既存手順の読み替えがしやすくなります。
netstatコマンドのインストール
インストール確認
まず、現在の環境でnetstatが使えるか確認します。
which netstat netstat --version
インストール
次のコマンドでインストールします。
netstatはnet-toolsパッケージに含まれます。
sudo apt update sudo apt install net-tools
よく使うnetstatの基本操作
全ソケットを表示する
netstat -a
TCP/UDPの接続中ソケットと待受ソケットをまとめて確認できます。
待受中のTCPポートを確認する
sudo netstat -lntp
WebサーバーやSSHサーバーが想定ポートでLISTENしているかを確認します。
補足
-l を付けているので、このコマンドは待受中のソケットだけを表示します。ESTABLISHED や TIME_WAIT のような通信中・切断中の接続状態を見たい場合は、-l を外して確認します。
-p オプションでPID/プロセス名を表示する場合は、通常 sudo が必要です。
ルーティングとインタフェース確認
ルーティングテーブルを確認する
netstat -rn
デフォルトゲートウェイや経路情報を数値表示で確認できます。
インタフェース統計を確認する
netstat -i
インタフェースごとのパケット送受信、エラー、ドロップ状況の確認に使えます。
トラブルシュートでの使い方
サービスが待受しているか確認する(例:80 / 443)
例えばHTTPまたはHTTPSに対応したWebサーバーを立てたとします。
このときHTTPの待受は80番ポート、HTTPSの待受は443番ポートで確認します。
sudo netstat -lntp | grep ':80 '
sudo netstat -lntp | grep ':443 '
WebサーバーのポートがLISTENしていない場合、まずサービス自体の起動状況を確認します。
想定外の外部通信がないか確認する
sudo netstat -antp | grep ESTABLISHED
不審な接続先がないかを素早く確認できます。
ポート競合を確認する(例:3000)
sudo netstat -lntp | grep ':3000 '
同じポートを既に別プロセスが利用していないかを確認できます。
ssコマンドとの違い
現行Linuxではssコマンドの方が高速で情報量も多いため、日常運用ではssが選ばれることが増えています。
一方で、既存環境の手順書や過去記事ではnetstatが前提になっていることが多く、 読み替えのために基本操作を把握しておく価値があります。
読み替えの例
# netstat sudo netstat -lntp # ss sudo ss -lntp
用途別のオプション実行例
1) サーバーが待受しているか確認したい
sudo netstat -lntp
WebサーバーやSSHサーバーが想定ポートでLISTENしているかを確認します。
出力結果のローカルアドレス欄に 0.0.0.0 や :: が表示されている場合は、特定のIPアドレスではなく全インタフェース向けに待受していることを意味します。
余談:私は良くこのコマンドを使っています。
私は仕事でL7プロトコルを設計し、特殊なネットワーク制御ソフトウェアを開発することもあります。そのような場面では、特定ネットワーク内のIPアドレスだけに対してLISTENしているかをよく確認します。
このような要件があるにもかかわらず、0.0.0.0 や :: のように全インタフェース向けの待受になっている表示を見ると冷や汗が出ます。ネットワーク制御ソフトウェアの開発者目線では、そのような想定外の待受を素早く見抜くために netstat を使います。
※今回言った内容をC言語ソフトウェアベースで考えると、IPv4ではソケット通信で INADDR_ANY を使ったか否かという話になります。IPv6では in6addr_any / IN6ADDR_ANY_INIT に相当します。
2) 特定ポートを掴んでいるプロセスを調べたい(例:8080)
sudo netstat -lntp | grep ':8080 '
ポート競合や起動失敗時に、どのプロセスがポートを使用しているかを確認できます。
3) 接続が確立している通信だけ見たい
sudo netstat -antp | grep ESTABLISHED
既に確立しているTCP接続だけを確認したいときに使います。待受状態ではなく、実際に通信中の接続を見たい場面向けです。
4) UDPサービスの待受を確認したい(例:53 / 123)
例としてDNS(53/udp)やNTP(123/udp)の待受確認に使えます。
sudo netstat -lnup | grep ':53 '
sudo netstat -lnup | grep ':123 '
5) ルーティング設定(特にデフォルト経路)を見たい
netstat -rn netstat -rn | grep '^0.0.0.0' netstat -r | grep '^default'
数値表示の -rn では、IPv4のデフォルト経路が 0.0.0.0 として見えることがあります。-n を外した表示では、環境によって default と表示されます。
6) NICのエラーやドロップを確認したい
netstat -i
おわりに
この記事では、netstatコマンドの基本的な使い方と、運用でよく使う確認ポイントを紹介しました。
netstatは古典的なツールですが、接続・待受・経路・統計を一通り確認できるため、トラブルシュートの初動で今も有効です。
必要に応じてssコマンドも併用しながら、状況に合わせて使い分けていきましょう。
参考文献
- netstat(8) - Linux manual page https://man7.org/linux/man-pages/man8/netstat.8.html
- ss(8) - Linux manual page https://man7.org/linux/man-pages/man8/ss.8.html