うたカモ技術ブログ

Linux ネットワーク

【ネットワークコマンド】   通信ソケット確認ツール netstatの使い方

post: 

今回は、Linuxでネットワーク状態を確認するときに使うnetstatコマンドについて紹介します。

サーバーに接続できない、ポートが待ち受けていない、どのプロセスが通信しているか分からない、といった場面で netstatは役に立ちます。

後継のssコマンドの台頭で使用頻度が下がってきていますが、古いLinux環境や組み込み機器向けのLinuxでは現役の重要ツールです。

この記事では、UbuntuなどのLinux環境を前提に、netstatのインストール方法から実践的な確認手順までをまとめます。

目次

netstatとは

netstatは、ネットワーク接続、待受ポート、ルーティングテーブル、インタフェース統計などを確認できるコマンドです。

Linuxでは昔から使われてきた代表的な確認ツールです。

ただし、現在は後継のssコマンドの台頭で使用頻度が下がってきてもいます。

とは言え、古いLinux環境や組み込み機器向けLinuxではまだまだ現役のツールですので、知っていて損はありません。

(まあ、組み込み機器向けのLinuxの場合、そのnetstatですらインストールされていないときもありますが。。。)

補足

最近のLinuxではssコマンドが推奨されることも多いですが、 netstatを理解しておくと既存手順の読み替えがしやすくなります。

netstatコマンドのインストール

インストール確認

まず、現在の環境でnetstatが使えるか確認します。

which netstat
netstat --version

インストール

次のコマンドでインストールします。
netstatnet-toolsパッケージに含まれます。

sudo apt update
sudo apt install net-tools

よく使うnetstatの基本操作

全ソケットを表示する

netstat -a

TCP/UDPの接続中ソケットと待受ソケットをまとめて確認できます。

待受中のTCPポートを確認する

sudo netstat -lntp

WebサーバーやSSHサーバーが想定ポートでLISTENしているかを確認します。

補足

-l を付けているので、このコマンドは待受中のソケットだけを表示します。ESTABLISHEDTIME_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コマンドも併用しながら、状況に合わせて使い分けていきましょう。

参考文献