ネットワーク状況を確認するコマンド色々

ネットワークまわりのコマンドについて概要と利用用途をざっくりまとめてみました。

# ip/ifconfig
ipアドレスを確認するコマンドです。
`ip a(ip address show)`でネットワークインターフェースに割り当てているIPアドレスやネットワークアドレスを確認できます。
他にも、ipアドレスの追加/削除、`ip r`でルーティングテーブルの表示等もできます。

```
~ ❯❯❯ ip a
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
	inet 127.0.0.1/8 lo0
	inet6 ::1/128
	inet6 fe80::1/64 scopeid 0x1
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether c4:b3:01:c5:81:49
	inet6 fe80::1475:3c2e:fdc6:47cc/64 secured scopeid 0x7
	inet xxx.xxx.0.11/24 brd xxx.xxx.0.255 en0
awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
	ether 46:a5:35:8c:7a:39
	inet6 fe80::44a5:35ff:fe8c:7a39/64 scopeid 0xa
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
	inet6 fe80::e0ce:e054:75f4:bfd8/64 scopeid 0xb
```

# hostname
ホスト名を表確認するコマンドです。

```
~ ❯❯❯ hostname
kamihork.local
```

# nslookup
**DNSによる名前解決を行うコマンド**です。
DNS問合せを行い、FQDN（Fully Qualified Domain Name）形式等のドメイン名が名前解決が行われているか確認する時に利用します。
`Address:220.152.38.201#53`から、コマンドを叩いたクライアントから名前解決を行ったDNSのIPアドレスととポート番号がわかります。
`canonical name`から、CNAMEレコード(`www.homes.co.jp`)は対応させたいドメイン名と対応するAレコード(`www2.homes.co.jp`)を記述することで複数IPアドレス（`13.114.214.201`, `54.92.33.209`）を定義していることを示しています。

なお、`Non-authoritative answer`は「権威サーバーでないサーバーが回答した」という意味で、キャッシュDNSサーバーが結果を返却したということを示しています。

```
~ ❯❯❯ nslookup www.homes.co.jp
Server:		220.152.38.201
Address:	220.152.38.201#53

Non-authoritative answer:
www.homes.co.jp	canonical name = www2.homes.co.jp.
Name:	www2.homes.co.jp
Address: 13.114.214.201
Name:	www2.homes.co.jp
Address: 54.92.33.209
```

# dig
digを使うと、**nslookupよりも詳細な情報を取得**することができます。

```
~ ❯❯❯ dig www.homes.co.jp
; <<>> DiG 9.10.6 <<>> www.homes.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33617
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.homes.co.jp.		IN	A

;; ANSWER SECTION:
www.homes.co.jp.	14	IN	CNAME	www2.homes.co.jp.
www2.homes.co.jp.	14	IN	A	13.114.214.201
www2.homes.co.jp.	14	IN	A	54.92.33.209

;; Query time: 82 msec
;; SERVER: 220.152.38.201#53(220.152.38.201)
;; WHEN: Tue Apr 09 00:43:44 JST 2019
;; MSG SIZE  rcvd: 95
```

# ping
これは**ネットワーク疎通を確認したいホストに対してIPパケットを発行し、そのパケットが正しく届いて返答が行われるかを確認するためのコマンド**です。
TCP/IPネットワークでは、IPやTCP、UDPプロトコルのパケットにさまざまな情報を載せてホスト間で通信をしていますが、その通信中にエラーが起こった場合、ICMPという補助的なプロトコルを使ってエラーを伝えることになっています。
pingではechoと呼ばれるICMPでサポートされる機能を利用し、パケットを送り返していることを確認しています。
※ネットワーク全体ではなくコマンドを発行したホストからの観測結果であることに注意

```
~ ❯❯❯ ping www.homes.co.jp
PING www2.homes.co.jp (13.114.214.201): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
```

# tcpdump
**ネットワーク上を流れるパケットの様子を観察するためのコマンド**です。
ネットワークに何かしらの障害が起きた時に例えばpingを使って接続できるか確認をしますが、通信内容をパケット単位で詳細に確認したい時に利用できます。
実際には特定のパケットのみを出力するために、例えばオプションを利用しフィルタリングを行い利用します。
例えば、www.homes.co.jpからWebページの内容を取得する際に受信したパケットの情報のみを出力する場合には、以下のように指定します。

```
~ ❯❯❯ sudo tcpdump src www.homes.co.jp and port https
tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pktap, link-type PKTAP (Apple DLT_PKTAP), capture size 262144 bytes
01:56:13.658284 IP ec2-13-114-214-201.ap-northeast-1.compute.amazonaws.com.https > xxx.xxx.0.11.61752: Flags [.], ack 1356745009, win 422, options [nop,nop,TS val 226900985 ecr 1344423181], length 0
01:56:13.658613 IP ec2-13-114-214-201.ap-northeast-1.compute.amazonaws.com.https > xxx.xxx.0.11.61752: Flags [P.], seq 0:46, ack 47, win 422, options [nop,nop,TS val 226900985 ecr 1344423181], length 46
01:56:13.832161 IP ec2-13-114-214-201.ap-northeast-1.compute.amazonaws.com.https > xxx.xxx.0.11.61752: Flags [.], seq 46:1494, ack 47, win 422, options [nop,nop,TS val 226901028 ecr 1344423199], length 1448
01:56:13.832722 IP ec2-13-114-214-201.ap-northeast-1.compute.amazonaws.com.https > xxx.xxx.0.11.61752: Flags [.], seq 1494:2942, ack 47, win 422, options [nop,nop,TS val 226901028 ecr 1344423199], length 1448
01:56:13.832729 IP ec2-13-114-214-201.ap-northeast-1.compute.amazonaws.com.https > xxx.xxx.0.11.61752: Flags [.], seq 2942:4390, ack 47, win 422, options [nop,nop,TS val 226901028 ecr 1344423199], length 1448
```

# tracepath/traceroute
**指定したアドレスに宛ててパケットを送信し、その経路上でパケットを中継するホストのアドレスを列挙するコマンド**です。
pingで相手ホストから正常な応答がなかった場合等に、ホスト自身や経路上のルーターのルーティング設定が正しいかどうかを確認する時に利用できます。
また、パケットを中継するホストから自身のホストへ戻ってくる応答パケットの経路(=復路)が、往路と異なっていることを検知し出力することもできます。

```
~ ❯❯❯ traceroute www.homes.co.jp
traceroute: Warning: www.homes.co.jp has multiple addresses; using 54.92.33.209
traceroute to www2.homes.co.jp (54.92.33.209), 64 hops max, 52 byte packets
 1  xxx.xxx.0.1 (xxx.xxx.0.1)  1.263 ms  0.910 ms  0.902 ms
 2  * * *
```

# 参考文献
[Linux環境でnslookupやdigコマンドでDNSを学ぶ](https://qiita.com/toshihirock/items/1ff01a51570bf6ca4f59)
[AレコードとCNAMEレコードの違い](https://qiita.com/PharaohKJ/items/b6a933b7f79afe8a32e1)
[tcpdumpでネットワーク状況を知る](https://thinkit.co.jp/article/721/1?page=0%2C2)
[tracepathの経路非対称判定](https://qiita.com/ejiw/items/2b072a6374f44ca0e133)
[【図解】tracerouteの仕組み](https://milestone-of-se.nesuke.com/nw-basic/ip/traceroute/)
[ipコマンドでネットワーク設定と確認](https://usado.jp/spdsk/2018/07/25/post-4149/#IP)
[tcpdumpの使い方](https://qiita.com/tossh/items/4cd33693965ef231bd2a)