【Linux】ネットワークのトラブルシューティング手順とコマンドまとめ
はじめに
ネットワークに問題が発生したときのトラブルシューティングについて、順番にコマンドで確認することで原因を特定できるようにまとめてみました。
どんな問題もこれで特定できるわけではないと思いますが、どこらへんに原因があるかはある程度目処が付けられると思います。
切り分け手順
以下の順番で自身のネットワークインターフェースの確認から対向側のサーバへの疎通を確認していきます。自身に近い方から疎通確認していくイメージになります。
- ネットワークインターフェースの確認
- デフォルトゲートウェイの確認と疎通
- DNSでの名前解決
- インターネット上のサーバへのpingとtraceroute
- 対向サーバへのpingとtraceroute
- ポートを指定して疎通確認
想定している構成
今回想定しているのは下記のような構成です。自身のサーバはCentOSを想定しています。
ネットワークインターフェースの確認
まずは自身のサーバのネットワークインターフェースを確認します。ここで想定していなかった状態であれば自身のサーバのネットワークインターフェースの設定を見直します。
イメージとしては下記の部分になります。
下記のコマンドで確認できます。
1ifconfig
1ip addr show
例えば以下のような結果だと、2つのイーサネットインターフェース(eth0とeth1)が有効になっていることがわかります。
1$ ifconfig
2eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
3 inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
4 inet6 fe80::5054:ff:fe4d:77d3 prefixlen 64 scopeid 0x20<link>
5 ether 52:54:00:4d:77:d3 txqueuelen 1000 (Ethernet)
6 RX packets 201225 bytes 287635311 (274.3 MiB)
7 RX errors 0 dropped 0 overruns 0 frame 0
8 TX packets 40521 bytes 2669360 (2.5 MiB)
9 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
10
11eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
12 inet 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255
13 inet6 fe80::a00:27ff:fe30:42f2 prefixlen 64 scopeid 0x20<link>
14 ether 08:00:27:30:42:f2 txqueuelen 1000 (Ethernet)
15 RX packets 24 bytes 4244 (4.1 KiB)
16 RX errors 0 dropped 0 overruns 0 frame 0
17 TX packets 21 bytes 2786 (2.7 KiB)
18 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
19
20lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
21 inet 127.0.0.1 netmask 255.0.0.0
22 inet6 ::1 prefixlen 128 scopeid 0x10<host>
23 loop txqueuelen 1000 (Local Loopback)
24 RX packets 0 bytes 0 (0.0 B)
25 RX errors 0 dropped 0 overruns 0 frame 0
26 TX packets 0 bytes 0 (0.0 B)
27 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
また、グローバルIPアドレスについては、下記で確認できます。
1curl https://ifconfig.io
デフォルトゲートウェイの確認と疎通
次にデフォルトゲートウェイの確認と疎通を試します。ここで想定していない結果であればデフォルトゲートウェイまでの設定等を見直します。
イメージとしては下記の部分になります。
デフォルトゲートウェイは下記のコマンドで確認します。
1route -n
Genmask
が0.0.0.0となっている行がデフォルトゲートウェイになります。
1$ route -n
2Kernel IP routing table
3Destination Gateway Genmask Flags Metric Ref Use Iface
40.0.0.0 10.0.2.2 0.0.0.0 UG 100 0 0 eth0
510.0.2.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
6192.168.0.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
デフォルトゲートウェイの設定が想定通りであれば、デフォルトゲートウェイまでの疎通が可能かを確認します。
1ping -c 5 デフォルトゲートウェイのIPアドレス
疎通ができれば以下のようになります。
1$ ping -c 5 10.0.2.2
2PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
364 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.131 ms
464 bytes from 10.0.2.2: icmp_seq=2 ttl=64 time=0.304 ms
564 bytes from 10.0.2.2: icmp_seq=3 ttl=64 time=0.264 ms
664 bytes from 10.0.2.2: icmp_seq=4 ttl=64 time=0.148 ms
764 bytes from 10.0.2.2: icmp_seq=5 ttl=64 time=0.191 ms
8
9--- 10.0.2.2 ping statistics ---
105 packets transmitted, 5 received, 0% packet loss, time 4003ms
11rtt min/avg/max/mdev = 0.131/0.207/0.304/0.068 ms
DNSでの名前解決
次にDNSでの名前解決がされているかを確認します。ここで想定していない結果であればDNS周りの設定等を見直します。
イメージとしては下記の部分になります。
名前解決は下記のコマンドで確認します。
1nslookup ドメイン名
1dig ドメイン名
名前解決ができれば対応するIPアドレスが取得できます。
1$ nslookup google.com
2Server: 10.0.2.3
3Address: 10.0.2.3#53
4
5Non-authoritative answer:
6Name: google.com
7Address: 172.217.26.14
8Name: google.com
9Address: 2404:6800:4004:822::200e
インターネット上のサーバへのpingとtraceroute
次に対向サーバとは別のインターネット上のサーバへアクセスできるか確認します。ここで想定していない結果であればインターネットに出る通信の設定(FW等)を見直します。
イメージとしては下記の部分になります。
インターネット上のサーバへの疎通を確認する場合はGoogleのDNS(8.8.8.8)を利用するのがいいと思います。
1$ ping -c 5 8.8.8.8
2PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
364 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=11.8 ms
464 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=5.39 ms
564 bytes from 8.8.8.8: icmp_seq=3 ttl=63 time=11.7 ms
664 bytes from 8.8.8.8: icmp_seq=4 ttl=63 time=5.82 ms
764 bytes from 8.8.8.8: icmp_seq=5 ttl=63 time=11.2 ms
8
9--- 8.8.8.8 ping statistics ---
105 packets transmitted, 5 received, 0% packet loss, time 4009ms
11rtt min/avg/max/mdev = 5.396/9.217/11.868/2.954 ms
pingが届かない場合はtraceroute
でどこまで届いているかを確認します。
アスタリスク「*」が表示されているのは、ルータのICMPによる問い合わせを拒否している場合かタイムアウトの場合になります。必ずしもタイムアウトではないので、最終的に宛先に届けば問題ありません。
1$ traceroute 8.8.8.8
2traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
3 1 gateway (10.0.2.2) 0.221 ms 0.170 ms 0.149 ms
4 2 * * *
5 3 * * *
6 4 * * *
7 5 * * *
8 6 * * *
9 7 * * *
10 8 dns.google (8.8.8.8) 14.568 ms 11.407 ms 14.479 ms
対向サーバへのpingとtraceroute
先程と同様に対向サーバへのping
とtraceroute
を確認します。ここで想定していない結果であれば対向サーバ側の設定(FW等)や対向サーバ向けの通信設定(IPアドレスで制限していないか等)を見直します。
イメージとしては下記の部分になります。
確認するコマンドは下記の通りです。
1ping 対向サーバのIPアドレス
1traceroute 対向サーバのIPアドレス
ポートを指定して通信
最後にポートを指定して疎通できるかを確認します。ここで想定していない結果であれば特定のポートに対しての疎通周りの設定(特定のポートへの疎通を拒否しているFWがあるか等)を見直します。
イメージとしては下記の部分になります。
下記のコマンドでポート指定で疎通確認ができます。
1nc -vz 対向サーバのIPアドレス ポート
1curl -l 対向サーバのIPアドレス:ポート
それでも解決しない場合は
大体のことはこれまでの確認である程度の目処がたつと思いますが、それでも解決しない場合は以下のことを試してみるのがいいと思います。
- 対向サーバ側のログを確認
- FWのログを確認
- パケットキャプチャ