ネットワークの状態確認(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)
用語概要
HWaddrMacアドレス
UP正常に稼働していることを意味する
MTU最大転送単位
RX受信パケット(統計値)※1
TX送信パケット(統計値)※1

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

ifconfigがインストールされてないとき

ifconfig の代替コマンドとして ipコマンド が登場しました。もしifconfigを利用したい場合、 net-toolsというパッケージをインストールします。aptの場合、以下の通りです。

apt update
apt install -y net-tools

ip
NIC情報を確認

ifconfig と同様の情報を ip a(ip addr) で確認できます。
( ipコマンドは iproute2 というパッケージに含まれています。)

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet XX.XX.XX.XX/XX brd XX.XX.XX.XX scope global eth0
       valid_lft forever preferred_lft forever
$ ip -s a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped missed  mcast   
    0          0        0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    0          0        0       0       0       0       
84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet XX.XX.XX.XX/XX brd XX.XX.XX.XX scope global eth0
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped missed  mcast   
    10383166   7134     0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    137171     2474     0       0       0       0  

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

デフォルトでAレコードを取得します。Aレコード以外を問い合わせたいとき、以下のようにレコードタイプを指定します。

$ dig us-west-2.amazonses.com TXT | grep "QUESTION SECTION" -A 7
;; QUESTION SECTION:
;us-west-2.amazonses.com.       IN      TXT

;; ANSWER SECTION:
us-west-2.amazonses.com. 888    IN      TXT     "google-site-verification=WT9AchziKw_G7Kulcs8qKOMG_h1O_HTtalB4JYKECXo"
us-west-2.amazonses.com. 888    IN      TXT     "v=spf1 include:amazonses.com -all"
us-west-2.amazonses.com. 888    IN      TXT     "spf2.0/pra include:amazonses.com -all"

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
 
# JSONリクエスト(リクエストボディにJSONデータ含めてリクエスト)
curl -X POST \
-H 'Content-Type:application/json' \
-d '{"param1":"xxx","param2":"yyy"}' \
URL

# ResponseHeader+ResponseBody表示
curl -i URL
 
# ResponseHeaderのみ表示
curl -I URL
 
# ResponseBodyのみ表示
curl URL
 
# RequestHeader+ResponseHeader+ResponseBody表示
curl -v URL

# RequestHeaderにCookieを設定
curl -b 'name1=value1; name2=value2' 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

curl ifconfig.io
グローバルIPの確認

下記コマンドを実行すると、ifconfig.io にアクセスして自サーバが利用するグローバルIPを確認できます。

curl ifconfig.io

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コマンド のほうで記述します。

netstatがインストールされてないとき

netstat の代替コマンドとして ssコマンド が登場しました。
もしnetstatを利用したい場合、net-toolsというパッケージをインストールします。aptの場合、以下の通りです。

apt update
apt install -y net-tools

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

netstat と同様の情報を ss で確認できます。
( ssコマンドは iproute2 というパッケージに含まれています。)

$ ss
Netid        State        Recv-Q        Send-Q              Local Address:Port               Peer Address:Port                   
tcp          ESTAB        0             0             [::ffff:172.21.0.2]:3306        [::ffff:172.21.0.1]:60030                  
tcp          ESTAB        0             0             [::ffff:172.21.0.2]:3306        [::ffff:172.21.0.1]:60124   
$ ss -s
Total: 7
TCP:   13 (estab 2, closed 9, orphaned 0, timewait 0)

Transport Total     IP        IPv6
RAW       0         0         0        
UDP       1         1         0        
TCP       4         1         3        
INET      5         2         3        
FRAG      0         0         0  

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 など)」を確認できます。

オプション概要
-nIPをホスト名に変換しないようにする
-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.1192.168.1.1との通信
<dir> <type> <id>src host 192.168.1.1192.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

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

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

特殊アドレス

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

  • ブロードキャストアドレス
    • ホスト・アドレス部がすべて1
  • ネットワークアドレス
    • ホスト・アドレス部がすべて0
  • ループバックアドレス
    • 127.0.0.1
よかったらシェアしてね!
目次