ネットワーク状態を確認するためのコマンド、設定ファイルについて解説します。サーバーに接続できないとき、開いているポートを知りたいときなどに役立つ情報です。
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
統計値は左から順に送受信パケット数
エラーパケット数
破棄パケット数
オーバーランパケット数
を示します。
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
など)」を確認できます。
オプション | 概要 |
---|---|
-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