ネットワークの状態確認(ping, ifconfig, netstatなど)

ネットワーク状態を確認するためのコマンド、設定ファイルについて解説します。サーバーに接続できないとき、開いているポートを知りたいときなどに役立つ情報です。

コマンド

ifconfig
NIC情報を確認

ネットワークインターフェイス(NIC)情報を確認します。

$ ifconfig -a
eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX  
          inet addr:XXX.XXX.XXX.XXX  Bcast:XXX.XXX.XXX.255  Mask:255.255.255.0
          inet6 addr: XXXX::XXXX:XXXX:XXXX:XXXX/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:1725009881 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1576295375 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1131524713824 (1.0 TiB)  TX bytes:339718712460 (316.3 GiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:352348 errors:0 dropped:0 overruns:0 frame:0
          TX packets:352348 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:34172732 (32.5 MiB)  TX bytes:34172732 (32.5 MiB)
用語 概要
HWaddr Macアドレス
UP 正常に稼働していることを意味する
MTU 最大転送単位
RX 受信パケット(統計値)※1
TX 送信パケット(統計値)※1

※1
統計値は左から順に、 送受信パケット数 エラーパケット数 破棄パケット数 オーバーランパケット数 を示します。

ping
接続状態や応答速度を確認

ネットワークの接続状態や応答速度を確認します。

$ ping youtube.com
PING youtube.com (172.217.25.238) 56(84) bytes of data.
64 bytes from nrt12s14-in-f14.1e100.net (172.217.25.238): icmp_seq=1 ttl=40 time=1.65 ms
64 bytes from nrt12s14-in-f238.1e100.net (172.217.25.238): icmp_seq=2 ttl=40 time=1.62 ms
64 bytes from nrt12s14-in-f14.1e100.net (172.217.25.238): icmp_seq=3 ttl=40 time=1.66 ms
64 bytes from nrt12s14-in-f238.1e100.net (172.217.25.238): icmp_seq=4 ttl=40 time=1.64 ms
^C
--- youtube.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.620/1.645/1.660/0.043 ms

繋がらない原因としては、以下の理由が考えられます。

  • 相手先のPCが起動していない
  • NICのハード障害
  • pingパケットの送受信を禁止している
  • DNSの設定ミス(IPアドレス指定では繋がるのに、ホスト指定だと繋がらないとき)

繋がらないときは、自ホストに近い機器から順にpingを実行してどこで繋がらなくなるか確認します。

traceroute
ネットワークの経路を確認

$ traceroute youtube.com
traceroute to youtube.com (172.217.26.46), 30 hops max, 60 byte packets
 1  XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)  13.357 ms XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)  14.113 ms XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)  13.336 ms
 2  XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)  19.895 ms XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)  17.325 ms XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)  19.223 ms

左側から1回目の応答時間、2回目の応答時間、3回目の応答時間となります。

nc
ポートスキャニング

pingでは、ip疎通の確認をできますが、ポートが開いているかどうか確認できません。ポートスキャニングの方法はいくつかありますが、nc(netcat)が簡単かと思います。

nc -v -w 1 127.0.0.1 -z 80
nc -zv 127.0.0.1 1-65535 2>&1 |grep succeeded
$ nc -v -w 1 127.0.0.1 -z 80
Connection to 127.0.0.1 80 port [tcp/http] succeeded!

なお、ポートスキャニングは攻撃とみなされる可能性があるので、外部サーバには行わないように注意して下さい。

dig
名前解決できるか確認

DNSサーバに問い合わせを行い、接続先のサーバ名を名前解決(IPアドレスに変換)できるか確認します。
nslookupと違い、応答情報をほぼ加工しないで表示します。

$ dig www.google.co.jp

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.56.amzn1 <<>> www.google.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32448
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.google.co.jp.              IN      A

;; ANSWER SECTION:
www.google.co.jp.       11      IN      A       172.217.25.195

;; Query time: 0 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Wed Nov 21 21:41:39 2018
;; MSG SIZE  rcvd: 50

nslookup
名前解決できるか確認

DNSサーバに問い合わせを行い、接続先のサーバ名を名前解決(IPアドレスに変換)できるか確認します。
digと違い、応答情報を加工して表示します。

$ nslookup www.google.co.jp
Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
Name:   www.google.co.jp
Address: 172.217.26.35

curl
HTTPクライアント

$ curl -v https://www.google.co.jp
* Rebuilt URL to: https://www.google.co.jp/
*   Trying 172.217.27.67...
* TCP_NODELAY set
* Connected to www.google.co.jp (172.217.27.67) port 443 (#0)
         (省略)
# メソッド指定
curl -X PUT URL
 
# POSTフォームデータ
curl -X POST -d param1=xxx -d param2=yyy URL
 
# ResponseHeader+ResponseBody表示
curl -i URL
 
# ResponseHeaderのみ表示
curl -I URL
 
# ResponseBodyのみ表示
curl URL
 
# RequestHeader+ResponseHeader+ResponseBody表示
curl -v URL

httpie
HTTPクライアント

httpieではjsonを整形して表示してくれます。

$ http -b http://weather.livedoor.com/forecast/webservice/json/v1?city=400040
{
    "copyright": {
        "image": {
            "height": 26,
            "link": "http://weather.livedoor.com/",
            "title": "livedoor 天気情報",
            "url": "http://weather.livedoor.com/img/cmn/livedoor.gif",
            "width": 118
        },
        "link": "http://weather.livedoor.com/",
         (省略)
# メソッド指定
http PUT URL
 
# POSTフォームデータ
http -f POST URL param1=xxx param2=yyy
 
# ResponseHeader+ResponseBody表示
http URL
 
# ResponseHeaderのみ表示
http -h URL
 
# ResponseBodyのみ表示
http -b URL
 
# RequestHeader+ResponseHeader+ResponseBody表示
http -v URL

netstat
接続状態や統計情報を確認

どういったサーバが起動していて、どのポートを利用しているか確認できます。

$ netstat -anp
(No info could be read for "-p": geteuid()=500 but you should be root.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 127.0.0.1:1025              0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:44356               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      -    
            (省略)       
オプション 概要
-a すべての接続を表示(状態が待ち受け状態(LISTEN)のも表示)
-p 各ソケットが属している「PID/Program name」を表示
-n ホスト・ポート・ユーザーなどの名前を解決せずに、数字のアドレスで表示
netstat -r

-rオプション で、ルーティングテーブルを確認できます。ルーティングテーブルについては、 routeコマンド のほうで記述します。

lsof
プロセスが開いているポート番号を確認

lsofはプロセスが開いているファイルを確認するコマンドです。

$ ps -ef|grep nginx
root      2707     1  0 22:07 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     2712  2707  0 22:07 ?        00:00:00 nginx: worker process                   
vagrant   5727  5568  0 22:22 pts/0    00:00:00 grep nginx
$
$
$ sudo lsof -n -P -p 2707
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
nginx   2707 root  cwd    DIR              253,0     4096       2 /
nginx   2707 root  rtd    DIR              253,0     4096       2 /
nginx   2707 root  txt    REG              253,0  1227152 1053732 /usr/sbin/nginx
nginx   2707 root  mem    REG              253,0    66432 1703967 /lib64/libnss_files-2.12.so
nginx   2707 root  mem    REG              253,0   122056 1704020 /lib64/libselinux.so.1
           (省略)

以下のようにするとサーバーが開いているポート番号を確認できます。

$ sudo lsof -n -P | grep TCP
rpcbind   1198     rpc    8u     IPv4              10878      0t0        TCP *:111 (LISTEN)
rpcbind   1198     rpc   11u     IPv6              10881      0t0        TCP *:111 (LISTEN)
rpc.statd 1220 rpcuser    9u     IPv4              10968      0t0        TCP *:44356 (LISTEN)
rpc.statd 1220 rpcuser   11u     IPv6              10974      0t0        TCP *:36835 (LISTEN)
redis-ser 1255   redis    6u     IPv4              11090      0t0        TCP 127.0.0.1:6379 (LISTEN)
sshd      1360    root    3u     IPv4              11249      0t0        TCP *:22 (LISTEN)
sshd      1360    root    4u     IPv6              11254      0t0        TCP *:22 (LISTEN)
master    2571    root   12u     IPv4              13907      0t0        TCP 127.0.0.1:25 (LISTEN)

左から2番目は PID です。
左から3番目は ユーザー名 です。
一番右で「開いているポート番号」と「接続状態(LISTEN ESTABLISHED など)」を確認できます。

オプション 概要
-n IPをホスト名に変換しないようにする
-P ポート番号をポート名に変換しないようする

route
ルーティングテーブルを確認

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.30.0    *               255.255.255.0   U     0      0        0 eth1
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
link-local      *               255.255.0.0     U     1003   0        0 eth1
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0

Destinationが同じネットワーク上にある場合、Gatewayに *(アスタリスク)が表示されます。同じネットワークなので、ルーターを経由せず、自身のインターフェイスからアクセスできます。

tcpdump
パケットキャプチャ

tcpdump -Xvv -s 2048 -i eth1 [expression]
オプション 概要
-Xvv 詳細情報を16進数で表示。
ヘッダだけではなくパケットの中身も見たい場合に利用。
-s 取得するパケットのデータ長を指定。
(デフォルトで68バイトのsnaplenのバイト長)
-i インタフェースを指定。
全てのインタフェースを指定したい場合「-i any」とする。

expression には、ダンプするパケットの種類を指定します。

指定パターン 入力例 補足
<type> <id> host 192.168.1.1 192.168.1.1との通信
<dir> <type> <id> src host 192.168.1.1 192.168.1.1から発信されたパケット
<proto> <type> <id> udp and host 192.168.1.1
<proto> <dir> <type> <id> udp and src host 192.168.1.1

type には対象のパケット種類を指定します。

host 192.168.1.1
net 192.168
port 80

dir には通信方向を指定します。

src, dst

proto には特定のプロトコルを指定します。

tcp, udpなど

ネットワーク関連のファイル

/etc/services

ポート番号とサービスの対応を確認できます。

/etc/networks

ネットワーク名とネットワークアドレスの対応を記述します。

/etc/hostname

ホスト名を記述します。

/etc/hosts

ホスト名とIPアドレスとの対応を記述し名前解決を行います。

/etc/host.conf

名前解決をする際の問い合わせ順を記述します。

古いライブラリで、「/etc/host.conf」ファイルを見ることがあるそうですが、現在では、下記「/etc/nsswitch.conf」ファイルが使われていることがほとんどです。

/etc/nsswitch.conf

名前解決をする際の問い合わせ順を記述します。「hosts:」行に参照順位を設定します。例えば、「hosts: files dns」と記述した場合、まず「/etc/hosts」を確認して、解決しなかったらDNSサーバを確認するようになります。

/etc/resolv.conf

DNSサーバやドメイン名の設定を記述します。

/etc/sysconfig/network

「ネットワーク機能の使用/不使用」「ホスト名」「デフォルトゲートアドレス」などの設定を記述します。

/etc/sysconfig/network-scriptsディレクトリ配下のファイル

ネットワークインターフェースの設定、確認を行います。

$ cat /etc/sysconfig/network-scripts/ifcfg-eth1
NM_CONTROLLED=no
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.30.30
NETMASK=255.255.255.0
DEVICE=eth1
PEERDNS=no

以下、主な設定項目と概要です。

設定項目 概要
DEVICE NWI/F名(eth0など)
IPADDR I/FのIPアドレス
NETMASK ネットマスク
NETWORK 所属するネットワークアドレス
ONBOOT 起動時にネットワークインターフェースを有効にするか否か

特殊アドレス

以下、ネットワークの確認をする上で知っておきたい特殊アドレスです。

  • ブロードキャストアドレス
    • ホスト・アドレス部がすべて1
  • ネットワークアドレス
    • ホスト・アドレス部がすべて0
  • ループバックアドレス
    • 127.0.0.1
わくわくBank.
ソフトウェア開発で必要とされる技術、用語、概念を整理しています。