最低限知っておくべきネットワーク系コマンド

![20170828180932.png](https://qiita-image-store.s3.amazonaws.com/0/258841/71b47ba0-d1f7-e877-209e-588c3cd08625.png)
# 背景

IT未経験から3ヶ月ほど目に先輩より教えていただいた絶対知っておくべきネットワーク系コマンド7選です。
当時はあまり良く理解できませんでしたが(今も正直、、、)その時のメモをもとに再度まとめて見ました。

間違いやそんなの古すぎるわ！と言ったコメント大歓迎です。

# 対象読者

* ネットワーク系のエンジニアじゃない人
* Linux触って1,2ヶ月くらいの人
* TCP/IPやDNS、HTTPといった概念をなんとなく知ってるレベルの人

# 取り上げるコマンド目次

* dig
* ifconfig(ip)
* ping
* traceroute
* route
* tcpdump
* curl

# [dig](https://ja.wikipedia.org/wiki/Dig_(UNIX)) - ドメイン名からIPアドレスを知る -

「dig」コマンドはDNSサーバに問い合わせることで、ドメイン名からIPアドレスを調べるコマンドです（逆も可能）

正しく名前解決ができていれば、ANSWER SECTION という項目に google.com の IP アドレ スが表示されるはずです。

``` bash 
$ dig www.google.co.jp

; <<>> DiG 9.10.6 <<>> -x 216.58.196.227
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52158
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;227.196.58.216.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
227.196.58.216.in-addr.arpa. 15613 IN	PTR	kix06s01-in-f3.1e100.net.
227.196.58.216.in-addr.arpa. 15613 IN	PTR	kix06s01-in-f227.1e100.net.

;; Query time: 56 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sun Nov 25 21:41:52 JST 2018
;; MSG SIZE  rcvd: 125
```

# [ifconfig](https://ja.wikipedia.org/wiki/Ifconfig) - ネットワークインターフェースの状態確認 - 


lo というインターフェースは「ループバック インターフェース」という特別なインターフェー スで、自分自身と通信するために利用されます。

__注意__
CentOS 7 では標準では使えません。使えるように するためには、ifconfigコマンドなどが入っている
「net-tools」というパッケージをインストールする 必要があります。
net-toolsパッケージはネットワーク機能追加への対応が不十分になってきている背景があり、
現在は移行が推奨されています。(教えていただいた当初からなのでさらに進んでいると思いますが現場だと未だに多く使われている印象がありますね)

``` bash 
# ifconfig -a
eth0      Link encap:Ethernet(1)  HWaddr 00:80:90:44:08:11(2)
          inet addr:192.168.1.11(3)  Bcast:192.168.1.255(4)  Mask:255.255.255.0(5)
          inet6 addr: fe80::3199:ff:fe01:3762/64 Scope:Link(6)
          UP(7) BROADCAST(8) RUNNING(9) MULTICAST(10)  MTU:1500(11)  Metric:1(12)
          RX packets:583312 errors:0 dropped:0 overruns:0 frame:0(13)
          TX packets:28344 errors:0 dropped:0 overruns:0 carrier:0(13)
          collisions:0 txqueuelen:100(13)
          RX bytes:4987886272 (4.9 GB)  TX bytes:50440257 (50.4 MB)(14)
eth1      Link encap:Ethernet  HWaddr 00:80:00:48:AA:88
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:3924  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
```

# [ping](https://ja.wikipedia.org/wiki/Ping) - 届いているかどうかを知る -

ping コマンドは、送ったパケッ トを相手にそのまま返送してもらうだけ、
というとてもシンプルなコマンドです。主に通信確認で使われたり遅延確認でも使われたりします。
-c オプションで ping を送る回数が指定でき ます。

このコマンドの実行で下記2点が確認できます

* うまく通信できているのか？
* もし通信出来ていない場合、その原因はどこにあるのか？

``` bash
$ ping 192.168.1.1 -c 3
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=0.347 ms
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.441 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.387 ms

--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.347/0.392/0.441/0.039 ms
```

# [traceroute](https://ja.wikipedia.org/wiki/Traceroute) - 道筋を知る -

パケットがどんな経路を通っているのかを知 るために、traceroute というコマンドがあります。

__注意__
セキュリティ上の都合などで、tracerouteするのに必要なパケットがフィルタされていると、
「* * *」と表示されてうまく表示されない場合があります。

__注意__
このコマンドで知ることが出来るのは往路だけです。
復路はまた違った経路をたどっていることもあります。
復路を確かめるためには相手から自分のネットワークに対して traceroute をしてもらい、その結果を共有してもらわなければ知ることはできません。

``` bash
$ traceroute example.com
traceroute to example.com (93.184.216.34), 64 hops max, 52 byte packets
 1  router.asus.com (192.168.1.1)  0.536 ms  0.260 ms  0.248 ms
 2  118.23.25.236 (118.23.25.236)  2.631 ms  1.928 ms  1.663 ms
 3  118.23.25.93 (118.23.25.93)  1.776 ms  2.196 ms  2.225 ms
 4  118.23.13.173 (118.23.13.173)  3.679 ms  2.721 ms  3.015 ms
 5  61.207.25.193 (61.207.25.193)  2.522 ms  2.715 ms  2.448 ms
 6  125.170.97.93 (125.170.97.93)  8.844 ms  9.269 ms  9.528 ms
 7  125.170.97.130 (125.170.97.130)  12.273 ms  10.575 ms  11.420 ms
 8  ae-5.r03.tokyjp05.jp.bb.gin.ntt.net (120.88.53.25)  18.236 ms  17.692 ms
    ae-5.r02.tokyjp05.jp.bb.gin.ntt.net (120.88.53.17)  17.601 ms
 9  ae-4.r30.tokyjp05.jp.bb.gin.ntt.net (129.250.3.34)  17.974 ms
    ae-4.r31.tokyjp05.jp.bb.gin.ntt.net (129.250.3.57)  20.092 ms  17.709 ms
10  ae-4.r23.snjsca04.us.bb.gin.ntt.net (129.250.5.78)  123.614 ms  123.561 ms
    ae-4.r23.lsanca07.us.bb.gin.ntt.net (129.250.3.193)  114.419 ms
11  ae-2.r00.lsanca07.us.bb.gin.ntt.net (129.250.3.238)  115.878 ms
    ae-45.r01.snjsca04.us.bb.gin.ntt.net (129.250.3.175)  118.568 ms
    ae-2.r01.lsanca07.us.bb.gin.ntt.net (129.250.4.107)  113.714 ms
12  ce-0-12-0-1.r00.lsanca07.us.ce.gin.ntt.net (128.241.4.218)  114.933 ms  120.537 ms
    ae-1.edgecast-networks.snjsca04.us.bb.gin.ntt.net (129.250.193.250)  118.488 ms
13  152.195.77.133 (152.195.77.133)  119.171 ms
    152.195.76.133 (152.195.76.133)  131.320 ms  137.378 ms
14  93.184.216.34 (93.184.216.34)  127.325 ms  125.182 ms  132.246 ms
```

# [route](https://ja.wikipedia.org/wiki/Route) - ルータまでの経路を知る -

ホストがルータまでどのようにして到達している確認するためのコマンド
iproute2的にはip routeコマンドが推奨されている。

``` bash
$ route
Kernel IP routing table 
Destination Gateway     Genmask      Flags Metric Ref Use Iface
0.0.0.0     10.84.149.1 0.0.0.0      UG    0      0     0 eth0
10.84.149.0 0.0.0.0 2   55.255.255.0 U     0      0     0 eth0
```

# [tcpdump](https://ja.wikipedia.org/wiki/Tcpdump) - パケットを覗き見 -

ネットワーク通信の生のデータをキャプチャし、その結果を出力してくれるキャプチャツールです。
HTTP通信をSSLで暗号化しないと危険であると言った話を聞いたことがあると思いますが、このコマンドを使えば生のパケットを覗くことができます。
実行してみればわかりますが実際にコマンドだけではあまり視認性が良くないので「WireShark」なんかで整形してデータを確認したりします。

``` bash
test@test-vm-ubuntu:~$ sudo tcpdump
[sudo] password for test:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
20:29:47.418564 IP 192.168.0.XXX.51682 > 192.168.0.YYY.902: Flags [P.], seq 106429704:106429741, ack 717766587, win 65335, length 37
20:29:47.418576 IP 192.168.0.YYY.902 > 192.168.0.XXX.51682: Flags [.], ack 37, win 128, length 0
20:29:47.418755 IP 192.168.0.YYY.902 > 192.168.0.XXX.51682: Flags [.], seq 1:8448, ack 37, win 128, length 8447
20:29:47.419099 IP 192.168.0.XXX.51682 > 192.168.0.YYY.902: Flags [.], ack 8448, win 65335, length 0
20:29:47.419249 IP 192.168.0.YYY.902 > 192.168.0.XXX.51682: Flags [.], seq 8448:19815, ack 37, win 128, length 11367
20:29:47.419575 IP 192.168.0.XXX.51682 > 192.168.0.YYY.902: Flags [.], ack 19815, win 64683, length 0
20:29:47.419630 IP 192.168.0.XXX.51682 > 192.168.0.YYY.902: Flags [.], ack 19815, win 65335, length 0
20:29:47.419712 IP 192.168.0.YYY.902 > 192.168.0.XXX.51682: Flags [.], seq 19815:34102, ack 37, win 128, length 14287
20:29:47.420129 IP 192.168.0.XXX.51682 > 192.168.0.YYY.902: Flags [.], ack 34102, win 63223, length 0
20:29:47.420184 IP 192.168.0.XXX.51682 > 192.168.0.YYY.902: Flags [.], ack 34102, win 65335, length 0
…
```

# [curl](https://ja.wikipedia.org/wiki/CURL) - HTTPアクセスをしてコンテンツを取得 - 

curlコマンドはHTTP、HTTPS、FTP、FTPS、SCP、IMAP、POP3 をはじめ、さまざまなプロトコルをサポートしている便利なコマンドで、 オプションもかなり豊富です。

サーバなどブラ ウザが使えない環境でファイルをダウンロード したり、Webアプリケーション開発で HTTPのリクエスト/レスポンスの内容を詳しく見たりするときによく使います。

curlはHTTPのPOSTリクエストを送信す ることもできて、-X POSTというオプション を使うことで POSTリクエストになります。

``` bash
$ curl -I https://google.com
HTTP/2 301 
location: https://www.google.com/
content-type: text/html; charset=UTF-8
date: Sun, 25 Nov 2018 13:26:25 GMT
expires: Tue, 25 Dec 2018 13:26:25 GMT
cache-control: public, max-age=2592000
server: gws
content-length: 220
x-xss-protection: 1; mode=block
x-frame-options: SAMEORIGIN
alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
```

# 0.0.0.0って何?

「0.0.0.0」は文脈によって用途が異なっており、
それぞれのシーンでそれぞれの使い方をされてます。

* IPアドレスを保有していないことを示す
* マシンがTCP/IPネットワークに接続されていないことを示す
* デフォルトルート
* システムにおけるすべてのインタフェースのすべてのIPアドレス
* 意味または不適切なターゲットを定義するために使われるルーティングの対象にならないメタアドレス
* ローカルマシンにおけるすべてのIPv4アドレス

0.0.0.0/0 → 全てのホスト、任意の宛先を意味する。デフォルトルート
0.0.0.0/32 → ホスト自身を指す

参考:[IPv4アドレス「0.0.0.0」の意味は? | マイナビニュース](https://news.mynavi.jp/article/20161025-a414/)

# net-toolsとiproute2のコマンド対応早見表

| net-tools | iproute2 |
|:--|:--|
| arp | ip n (ip neighbor) |
| ifconfig | ip a (ip addr) <br>ip link <br>ip -s (ip -stats)|
| iptunnel | ip tunnel |
| iwconfig | iw |
| nameif | ip link, ifrename |
| netstat | ss<br>ip route (for netstat-r)<br>ip -s link (for netstat -i)<br>ip maddr (for netstat-g) |
| route | ip r (ip route) |

# まとめ

まだまだ覚えるべきことは足りないが最低限中の最低限では事足りるって話でした。

ネットワーク系の知識は下記サイトがまとまっていておすすめです。
https://www.infraexpert.com/