netstat・ss・digコマンドの使い方 ― 症状別に選ぶ
netstat・
netstat・ssは接続とポートを、digはDNSの答えを見るコマンド
netstatとssは、自分のPCがどのポートで待ち受け、どの相手と接続しているかを一覧するコマンドです。digは、DNSサーバに名前を問い合わせ、返ってきた答えをそのまま表示するコマンドです。
ss は、Linuxで netstat の後を継いだコマンドです。同じように、Linuxでは ifconfig の後を ip コマンドが継いでいます。「つながらない」「名前からアドレスを調べられない」ときに見るべき出力が分かれば、原因が自分のPCか相手側かを絞り込めます。
症状別:どのコマンドで何を確かめるか
つながらないときは、症状から確かめることを決め、それに合うコマンドを選びます。次の表は、よくある症状と使うコマンドの組み合わせです。表のアドレスは例です。
| 症状 | 確かめる | 使う |
|---|---|---|
| どこにもつながらない | 自分にIPアドレスが振られているか | ipconfig(Windows) ifconfig(Mac) ip addr(Linux) |
| 自宅ルータにも届かない | ゲートウェイから応答が返るか | ping 192.168.10.1 |
| ゲートウェイがどこか分からない | 経路の表の宛先がdefault(0.0.0.0)の行 | route print(Windows) netstat -rn(Mac) ip route(Linux) |
| 同じLANの機器だけ届かない | 相手のMACアドレスを知っているか | arp -a ip neigh(Linux) |
| 外のサイトに届かない | 途中のどのルータまで届くか | tracert(Windows) traceroute(Mac・Linux) |
| IPアドレスなら届くが名前だと開けない | DNSサーバが名前に答えるか | nslookup(Windows) dig(Mac・Linux) |
| サーバのアプリに接続できない | そのポートで待ち受けているか | netstat -ano(Windows) netstat -an(Mac) ss -tlnp(Linux) |
ping と traceroute の出力の読み方は、ping・tracerouteの記事にまとめています。この2つが使うICMPの仕組みは、ICMPの記事で説明しています。arp -a で見えるARPテーブルの中身は、ARPの記事で説明しています。このページでは、残りの netstat・ss・dig・ip・ifconfig を説明します。
これらのコマンドは、動作の違いで2種類に分かれます。1つは、自分のPCが持っている表を読んで表示するだけのコマンドです。もう1つは、相手にパケットを送り、返ってきた答えを表示するコマンドです。
表を読むだけのコマンドは、ネットワークが切れていても結果が出ます。ただし netstat や、Mac・Linuxの arp は、-n を付けないとIPアドレスを名前に変換しようとします。このときDNSへ問い合わせるので、表示が遅くなることがあります。そのため、-n を付けて数字のまま表示することがよくあります。
netstatコマンドの使い方と出力の見方
netstat は、PCの通信の出入口を一覧するコマンドです。この出入口はIPアドレスとポート番号の組で表され、OSの中ではソケットと呼びます。
netstat はWindows・Mac・Linuxのどれにもあります。ただし、オプションの意味と出力の形はOSごとに違います。
| 目的 | Windows | Mac | Linux |
|---|---|---|---|
| 待ち受け中のポートも含めて全部出す | -a | -a | -a(-l で待ち受けだけ) |
| 名前に変換せず数字で出す | -n | -n | -n |
| TCPだけに絞る | -p tcp | -p tcp | -t(UDPは -u) |
| 使っているプログラムを出す | -o(PID)/-b(実行ファイル名) | -v(列が増え、process:pid が出る) | -p |
| 経路の表を出す | -r | -r | -r |
Windowsでは、-a・-n・-o を合わせた netstat -ano をよく使います。PIDは、プログラムを実行するたびにOSが付ける番号です。タスクマネージャーでPIDを探すと、どのアプリの通信かが分かります。 -b で実行ファイル名を出すには、管理者権限が必要です。
C:\>netstat -ano アクティブな接続 プロトコル ローカル アドレス 外部アドレス 状態 PID TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1012 TCP 192.168.10.25:50512 203.0.113.50:443 ESTABLISHED 8420 TCP 192.168.10.25:50498 203.0.113.50:443 TIME_WAIT 0 UDP 0.0.0.0:5353 *:* 2240 # 1行が1つのソケットです。「アドレス:ポート番号」の形で並びます。 # UDPには接続という考え方がないので、状態の欄は空です。
Macの netstat は、BSD系の形式で出力します。アドレスとポート番号の区切りが、コロンではなくドットになっています。
$ netstat -an -p tcp Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp4 0 0 192.168.10.25.50512 203.0.113.50.443 ESTABLISHED tcp4 0 0 *.22 *.* LISTEN # 192.168.10.25.50512 は、IPアドレス 192.168.10.25 のポート50512番です。 # * は、どのアドレスでもよいことを示します。
状態の欄を見ると、そのソケットが今どの段階にあるかが分かります。状態の名前は、TCPの規格であるRFC 9293の状態名がもとになっています。書き方はOSやコマンドによって少し違います。よく見る状態は次の3つです。
- LISTEN(Windowsでは LISTENING):新しい接続を待ち受けている
- ESTABLISHED:接続が確立し、データをやり取りできる
- TIME_WAIT:接続を閉じた後、遅れて届くパケットに備えてしばらく残っている
接続が確立するまでの流れと、FINで閉じる流れは、3ウェイハンドシェイクの記事に図があります。netstat -r で出る経路の表の読み方は、ルーティングの記事で説明しています。
ssコマンドの使い方:netstatとの違い
ss は、Linuxでnetstat の代わりに使うコマンドです。Linuxの netstat のマニュアルには、netstat はほぼ時代遅れで、代わりに ss を使うと書かれています。ss は iproute2 というツール集に含まれ、多くのLinuxに最初から入っています。MacとWindowsには ss がありません。
オプションの文字は、Linuxの netstat とほぼ同じです。 -t はTCP、-u はUDP、-l は待ち受け中だけ、-a は全部を出します。 -n はポート番号を名前に変換せず、-p は使っているプログラムを出します。オプションを付けないと、確立した接続だけが出て、待ち受け中のものは出ません。
次の例は、自分のPCで ss -tan を実行した結果です。行をクリックすると、その行の意味が開きます。
$ ss -tan
見出しの行です。Local Addressは自分のPC側、Peer Addressは相手側の「IPアドレス:ポート番号」です。Recv-QとSend-Qは、まだ処理されていないデータの量を示します。ふだんは0のままです。
LISTENは、接続を待ち受けている状態です。22番はSSHのポート番号です。0.0.0.0は、PCが持つどのIPv4アドレス宛ての接続も受け付けることを示します。相手はまだ決まっていないので、Peer側は * になります。LISTENの行では、Send-Qの128は待ち行列の上限を示します。
ESTABは、接続が確立している状態です。同じLANの別PC(192.168.10.30)が、このPCの22番に接続しています。相手側の52814番は、相手のOSが選んだ送信元ポートです。
今度はこのPCがクライアントです。Webサーバ(203.0.113.50)の443番に接続しています。443番はHTTPSのポート番号です。自分側の50512番は、このPCのOSが選んだ送信元ポートです。
TIME-WAITは、接続を閉じた後に少しの間だけ残る状態です。先に切断の合図(FIN)を送って閉じた側に残ります。遅れて届くパケットを古い接続のものとして処理するために待っています。時間がたてば自然に消えます。
行をクリックすると、その行の意味が開きます。
ss の状態の名前は、netstat と少し違います。ESTABLISHED は ESTAB と短くなり、TIME_WAIT は RFC 9293 と同じく TIME-WAIT とハイフンでつなぎます。列の幅や並びは、ss のバージョンによって少し変わります。
どのプログラムが待ち受けているかを知りたいときは、-p を追加します。他のユーザーのプログラムまで表示するには、管理者権限が必要です。
$ sudo ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=812,fd=3))
# 80番はnginx、22番はsshdが待ち受けています。
# 80番の行がなければ、Webサーバのプログラムは待ち受けていません。22番で待ち受けているsshdは、SSHのサーバプログラムです。SSHの接続は、この22番へのTCP接続から始まります。
Linuxでは、netstat 以外の古いコマンドも新しいコマンドに置き換わっています。古いコマンドは net-tools というツール集に、新しいコマンドは ss と同じ iproute2 に含まれています。
| 見たい | 古い | 新しい |
|---|---|---|
| ソケットと接続の状態 | netstat | ss |
| IPアドレス | ifconfig | ip addr |
| 経路の表 | netstat -r / route | ip route |
| ARPテーブル | arp | ip neigh |
| インターフェースの統計 | netstat -i | ip -s link |
netstat・netstat -r・netstat -i の置き換え先は、Linuxの netstat のマニュアルに書かれています。ifconfig を ip に置き換えることは、Red Hat Enterprise Linux 7 のネットワークガイドに書かれています。最近のLinuxでは、net-tools が最初から入っていないことがあります。
digコマンドの使い方と出力の見方
dig は、DNSサーバに問い合わせて、返ってきた答えを細かく表示するコマンドです。DNSサーバのソフトウェアとして知られるBINDに付属するツールで、MacとLinuxで使えます。ただし、Linuxでは最初から入っていないこともあります。Windowsには標準で入っていないので、nslookup を使います。
基本の使い方は、dig のあとに名前を書くだけです。問い合わせ先を指定しないと、PCに設定されたDNSサーバに問い合わせます。次の例は、Macで dig example.com を実行した結果です。空行と一部の行を省いています。
$ dig example.com
status は、DNSサーバが返した結果の種類です。NOERRORなら、問い合わせは正常に処理されています。名前が存在しないときは NXDOMAIN、サーバ側で処理に失敗したときは SERVFAIL になります。
ANSWER: 1 は、答えが1件あることを示します。rd は「代わりに調べて」と頼んだ印で、ra は、サーバがその依頼を引き受けられることを示します。
QUESTION SECTION の行で、問い合わせの内容を示します。ここでは example.com のAレコードを問い合わせています。AレコードはIPv4アドレスを返すレコードです。種類を指定しないと、digはAレコードを問い合わせます。
ANSWER SECTION の行で、これが答えです。左から、名前・TTL・クラス・レコードの種類・値の順に並びます。300はTTLで、この答えをキャッシュしてよい残りの秒数です。
問い合わせてから答えが返るまでの時間です。同じ名前を続けて問い合わせると、キャッシュから答えが返るので短くなることがあります。
答えを返したDNSサーバです。#53 は、DNSが使うポート番号53を示します。家庭では、自宅ルータがこのサーバを兼ねていることがよくあります。
行をクリックすると、その行の意味が開きます。
まず見るのは status と ANSWER SECTION です。status が NOERROR で答えの行があれば、名前からアドレスを調べる処理(名前解決)はできています。NXDOMAIN なら、その名前はDNSに存在しません。DNSサーバから答えが返らないときは、dig は時間切れのメッセージを出して終わります。
答えの行のTTLは、この答えをキャッシュしてよい秒数です。pingの結果に出るIPパケットのTTLとは、名前は同じでも別のものです。DNSのTTLとキャッシュの関係は、DNSの記事で説明しています。
よく使う指定は、次のとおりです。
| 指定 | 何を |
|---|---|
| dig +short example.com | 答えのIPアドレスだけを出す |
| dig example.com MX | レコードの種類を指定する(AAAA・MX・NSなど) |
| dig @192.168.10.1 example.com | 問い合わせるDNSサーバを指定する |
| dig -x 203.0.113.50 | IPアドレスから名前を調べる(逆引き) |
@ で問い合わせ先を変えると、どのDNSサーバの答えがおかしいかを比べられます。自宅ルータでは名前を解決できず、別のDNSサーバではできるなら、原因は自宅ルータか、自宅ルータが問い合わせる先のDNSサーバにあります。これらの使い方は、BIND 9 のマニュアルの dig の項に載っています。
C:\>nslookup example.com サーバー: UnKnown Address: 192.168.10.1 権限のない回答: 名前: example.com Address: 203.0.113.50 # 「権限のない回答」は、キャッシュDNSサーバが返した答えであることを示します。 # PowerShellでは Resolve-DnsName example.com でも調べられます。
ipコマンドとifconfig:自分のアドレス・経路・隣の機器を見る
ifconfig は、インターフェース(PCがネットワークにつながる部分)の設定を表示するコマンドです。Linuxでは、ifconfig の代わりに ip コマンドを使うようになっています。
Red Hat Enterprise Linux 7 のネットワークガイドには、ip が ifconfig に置き換わると書かれています。理由として挙げられているのは、ifconfig がInfiniBandという通信方式のアドレスを扱えないことです。一方、macOSでは今も ifconfig が標準で、ip コマンドはありません。Windowsでは、どちらでもなく ipconfig を使います。
ip は、後ろに付ける語で表示する表を切り替えます。addr はIPアドレス、route は経路の表、neigh はARPテーブルです。
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
link/ether ac:de:48:00:11:22 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.25/24 brd 192.168.10.255 scope global eth0
# inet の行がIPアドレスです。/24 はサブネットマスク 255.255.255.0 と同じ意味です。
# ip a と短く入力しても同じです。一部の行と項目を省いています。$ ifconfig en0 en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether ac:de:48:00:11:22 inet 192.168.10.25 netmask 0xffffff00 broadcast 192.168.10.255 status: active # Macはサブネットマスクを16進数で表示します。0xffffff00 は 255.255.255.0 です。 # 一部の行を省いています。
$ ip route default via 192.168.10.1 dev eth0 192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.25 $ ip neigh 192.168.10.1 dev eth0 lladdr ac:de:48:aa:bb:cc REACHABLE 192.168.10.30 dev eth0 lladdr ac:de:48:dd:ee:ff STALE # default via の行がデフォルトゲートウェイです。 # lladdr のあとがMACアドレスです。STALE は、しばらく確かめていない古い情報の印です。
アドレスが 169.254. で始まっていたら、DHCPでアドレスを取得できていません。この見方は、IPアドレスの構造の記事とデフォルトゲートウェイの記事にも出てきます。
スイッチやルータの画面では、隣の機器をCDPやLLDPで調べます。show cdp neighbors の見方は、CDP・LLDPの記事にまとめています。
練習問題(全5問)
正解:ss -tln
ss は、
正解:
LISTEN は、
正解:問い合わせた
NXDOMAIN は、
正解:Linuxでは、
Linuxでは、
正解:dig example.com
dig は、
選んでから「採点する」を押すと、解説つきで答え合わせができます。
関連記事
おすすめの本 PR
ネットワークを初めて学ぶ人向けの入門書です。
![『[改訂新版]3分間ネットワーク基礎講座』の表紙](https://m.media-amazon.com/images/P/4774143731.09.MZZZZZZZ.jpg)
