ネットワークコマンド 【Linux】

AWSでサーバー構築をしたときに、ネットワーク状態確認のためにネットワークコマンドを初めて使いました。

その時に、これを使いこなせるようになったらかっこいいなぁと思ったので、本記事にまとめてみました。

間違いがあればご指摘をしていただけると幸いです。

### 環境

Linux - Ubuntu 20.04.3 LTS

# ネットワークコマンドとは

接続しているネットワークの状態確認や設定変更などを行うために使用するコマンドをネットワークコマンドと言います。

特に使われるであろうネットワークコマンドを以下に示します。

| コマンド | 説明 |
|:-:|:-:|
| ifconfig | ネットワークインターフェース（NIC）情報を確認。 |
| ping | ネットワークの接続状態や応答速度を確認。 |
| tracepath/traceroute | ネットワークの経路を確認。 |
| nslookup | DNSサーバで名前解決を行えているかどうかを確認。 |
| dig | DNSサーバで名前解決を行えているかどうかを確認。nslookupよりも詳細な情報を得られる。 |
| netstat | ソケット情報、インターフェース接続状態を確認。 |
| lsof | プロセスが開いているポート番号を確認。 |
| route | ルーティングテーブルを確認。 |
| whois | ドメイン情報を確認。 |

## ifconfig

### 主なオプション

| オプション | 説明 |
|:-:|:-:|
| -a | 停止（down）しているものを含め、全てのインタフェースを表示する。 |
| -s | インタフェースの通信状況を簡潔に表示する。 |

### 使用例

```shell
# ifconfig [option]
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet XXX.XXX.XXX.XXX  netmask 255.255.255.0  broadcast XXX.XXX.XXX.255
        inet6 XXXX::XXXX:XXXX:XXXX:XXXX  prefixlen 64  scopeid 0x20<link>
        ether XX:XX:XX:XX:XX:XX  txqueuelen 1000  (Ethernet)
        RX packets 14024  bytes 19561658 (19.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1367  bytes 184904 (184.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 35583  bytes 33711981 (33.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35583  bytes 33711981 (33.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

## ping

### 主なオプション

| オプション | 説明 |
|:-:|:-:|
| -c | パケットを送る回数を指定。 |
| -i | 個々のパケット送信後に待つ秒数。（default=1s） |
| -w | 何秒間実行するのかを指定。 |
| -v | 詳細な出力。 |

### 使用例

```shell
# ping [option] 通信相手
$ ping google.com
PING google.com (142.251.42.142) 56(84) bytes of data.
64 bytes from nrt12s45-in-f14.1e100.net (142.251.42.142): icmp_seq=1 ttl=115 time=28.5 ms
64 bytes from nrt12s45-in-f14.1e100.net (142.251.42.142): icmp_seq=2 ttl=115 time=28.3 ms
64 bytes from nrt12s45-in-f14.1e100.net (142.251.42.142): icmp_seq=3 ttl=115 time=28.4 ms
64 bytes from nrt12s45-in-f14.1e100.net (142.251.42.142): icmp_seq=4 ttl=115 time=28.6 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 28.258/28.437/28.637/0.138 ms
```

## tracepath/traceroute

tracepathではUDPパケットを使用し、MTUが確認できます。

tracerouteではICMPパケットを使用します。

### 主なオプション

#### tracepath

| オプション | 説明 |
|:-:|:-:|
| -p | 宛先ポートを指定。 |
| -n | 到達経路をホスト名ではなくIPアドレスで表記。 |

#### traceroute

| オプション | 説明 |
|:-:|:-:|
| -I | ICMPを使用。 |
| -T | TCPを使用。 |
| -d | デバッグモードで実行。 |
| -p | 宛先ポートを指定。 |
| -n | 到達経路をホスト名ではなくIPアドレスで表記。 |

### 使用例

```shell
# tracepath [option] 通信相手
$ tracepath google.com
 1?: [LOCALHOST]                      pmtu 1500
 1:  XXXXXXXXXXXXXXXXXXXXXXXXXX                            0.175ms
 1:  XXXXXXXXXXXXXXXXXXXXXXXXXX                            0.252ms
 2:  ???                                                   1.872ms
^C

# traceroute [option] 通信相手
$ traceroute google.com
traceroute to google.com (XXX.XXX.XXX.XXX), 30 hops max, 60 byte packets
 1  XXXXXXXXXXX (XXX.XXX.XXX.XXX)  0.382 ms  0.360 ms  0.348 ms
 2  XXXXXXXXXXX (XXX.XXX.XXX.XXX)  2.304 ms  5.294 ms  3.705 ms
 3  * * * (XXX.XXX.XXX.XXX)  6.171 ms
^C
```

## nslookup

### 使用例

```shell
# nslookup [option] 通信相手
$ nslookup google.com
Server:         XXX.XXX.XXX.XXX
Address:        XXX.XXX.XXX.XXX#53

Non-authoritative answer:
Name:   google.com
Address: 142.251.42.142
Name:   google.com
Address: 2404:6800:4004:801::200e
```

## dig

### 主なオプション

| オプション | 説明 |
|:-:|:-:|
| -x | IPアドレスを指定して、逆引きを行う。 |

### 使用例

```shell
# dig [option] 通信相手
$ dig google.com

; <<>> DiG 9.16.1-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12573
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;google.com.                    IN      A

;; ANSWER SECTION:
google.com.             0       IN      A       172.217.31.142

;; Query time: 30 msec
;; SERVER: XXX.XXX.XXX.XXX#53(XXX.XXX.XXX.XXX)
;; WHEN: Thu Feb 17 16:01:18 JST 2022
;; MSG SIZE  rcvd: 54

```

## netstat

### 主なオプション

| オプション | 説明 |
|:-:|:-:|
| -a | 全ての接続を表示。 |
| -e | 詳細情報を表示。 |
| -ee | さらに詳細情報を表示。 |
| -i | すべてのネットワーク・インターフェースを表示。 |
| -l | 接続待ち（LISTEN）状態のソケットのみを表示。 |
| -n | ホスト名ではなく、IPアドレスを表示。 |
| -r | ルーティングテーブルを表示。 |
| -s | 各プロトコルの統計情報を表示。 |

### 使用例

```shell
# netstat [option]
$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:34245         localhost:47960         ESTABLISHED
tcp        0      0 localhost:34245         localhost:47962         ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  3      [ ]         STREAM     CONNECTED     22540
unix  3      [ ]         STREAM     CONNECTED     20990
# 中略
unix  3      [ ]         STREAM     CONNECTED     19890
```

## lsof

### 主なオプション

| オプション | 説明 |
|:-:|:-:|
| -u | 指定したユーザ名またはユーザIDのみを表示。 |
| -p | 指定したプロセスIDのみを表示。 |
| -i | ネットワークソケットを対象とする。またはポートやIPアドレスを指定する（ex. -i:80 -i:ssh）。 |
| -n | ホスト名ではなく、IPアドレスを表示。 |
| -t | プロセスIDのみを表示 |

### 使用例

```shell
# lsof [option] [path]
$ lsof
COMMAND    PID  TID TASKCMD    USER   FD      TYPE             DEVICE SIZE/OFF             NODE NAME
init         1                 root  cwd   unknown                                         /path/to/cwd (readlink: Permission denied)
init         1                 root  rtd   unknown                                         /path/to/rtd (readlink: Permission denied)
init         1                 root  txt   unknown                                         /path/to/txt (readlink: Permission denied)
# 省略
```

## route

### 主なオプション

| オプション | 説明 |
|:-:|:-:|
| -n | ホスト名ではなく、IPアドレスを表示。 |
| -e | テーブルの表示にnetstatのフォーマットを使用。 |
| -ee | より詳しい情報を表示。 |

### 使用例

```shell
# route [option]
$ route
Kernel IP routing table
Destination          Gateway         Genmask         Flags Metric Ref    Use Iface
default              XXXXXXX         0.0.0.0         UG    0      0        0 eth0
XXX.XXX.XXX.XXX      0.0.0.0         255.255.255.0   U     0      0        0 eth0
```

## whois

### 主なオプション

| オプション | 説明 |
|:-:|:-:|
| -h | 使用するWHOISサーバを指定。 |
| -p | 使用するポート番号を指定。（default=43） |
| -H | 免責事項を表示しない。 |

### 使用例

```shell
# whois [option] 対象ドメイン
$ whois google.co.jp
[ JPRS database provides information on network administration. Its use is    ]
[ restricted to network administration purposes. For further information,     ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e'     ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'.                 ]

Domain Information:
a. [Domain Name]                GOOGLE.CO.JP
g. [Organization]               Google Japan G.K.
l. [Organization Type]          GK
m. [Administrative Contact]     YN47525JP
n. [Technical Contact]          SH36113JP
p. [Name Server]                ns1.google.com
p. [Name Server]                ns2.google.com
p. [Name Server]                ns3.google.com
p. [Name Server]                ns4.google.com
s. [Signing Key]
[State]                         Connected (2022/03/31)
[Registered Date]               2001/03/22
[Connected Date]                2001/03/22
[Last Update]                   2021/04/01 01:05:22 (JST)

$ whois google.com | head
   Domain Name: GOOGLE.COM
   Registry Domain ID: 2138514_DOMAIN_COM-VRSN
   Registrar WHOIS Server: whois.markmonitor.com
   Registrar URL: http://www.markmonitor.com
   Updated Date: 2019-09-09T15:39:04Z
   Creation Date: 1997-09-15T04:00:00Z
   Registry Expiry Date: 2028-09-14T04:00:00Z
   Registrar: MarkMonitor Inc.
   Registrar IANA ID: 292
   Registrar Abuse Contact Email: abusecomplaints@markmonitor.com
```

# 最後に

大学ではネットワーク系を専攻しているため、そこで軽く習っていた分野と近しいものに実際に触れられたのが面白かったです。（講義でもこういうのやって欲しかった、、、）

今回は単純なコマンドの使い方や何のためのコマンドかの説明がメインでしたが、いつかそれぞれのコマンドについてより詳しく調べて記事を書こうかなと思います。