Linuxサーバを運用していると、 「通信できない」 というトラブルに遭遇することがあります。
たとえば、次のようなケースです。
他のサーバへpingが通らない。
名前解決ができない。
サービスへ接続できない。
このようなネットワークトラブルでは、 やみくもに設定を変更するのではなく、 現在のネットワーク状態を順番に確認する ことが重要です。
この記事では、Linuxでよく使用する ip・ping・ss・getent・dig などのコマンドを使いながら、 ネットワークの基本的な確認方法を学習します。
この記事はLinux中級講座の一部です。 Linuxサーバのネットワーク状態を確認する方法と、 通信障害の基本的な切り分けを学習します。
Linux中級講座を見る →Linuxサーバで通信できないときに、 IPアドレス → ルーティング → 疎通 → ポート → 名前解決 の順番でネットワーク状態を確認できるようになることを目指します。
Linuxでは何を確認すればよい?
「通信できない」といっても、 原因は1つではありません。
ip addr
正しいIPが設定されているか
ip route
宛先への経路があるか
ping
相手まで通信できるか
ss
サービスが待ち受けているか
getent / dig
名前からIPを取得できるか
ip addr:IPアドレスを確認する
まず確認したいのが、 Linuxサーバ自身に設定されている IPアドレスです。
ip addr
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP>
inet 127.0.0.1/8 scope host lo
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>
inet 192.168.10.20/24 brd 192.168.10.255 scope global ens160
この例では、 ens160というネットワークインターフェースに 次のIPアドレスが設定されています。
ip aでも同じように確認できる
addrは省略できるため、
実務では次のように入力することも多くあります。
ip a
まずは、 「自分のサーバに想定したIPアドレスが設定されているか」 を確認しましょう。
ネットワークインターフェースの状態も確認する
IPアドレスだけでなく、 インターフェース自体が利用可能な状態かも重要です。
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>
ここでは UPやLOWER_UP と表示されています。
インターフェース設定、DHCP、NetworkManagerなど、 IPアドレスが設定される仕組みに問題がないか確認する必要があります。
ip route:ルーティングテーブルを確認する
自分のIPアドレスが正しくても、 宛先までの経路がなければ通信できません。
Linuxのルーティングテーブルは、 次のコマンドで確認できます。
ip route
$ ip route
default via 192.168.10.1 dev ens160
192.168.10.0/24 dev ens160 proto kernel scope link src 192.168.10.20
重要なのが defaultです。
次の部分は、
default via 192.168.10.1 dev ens160
「個別の経路がない宛先への通信は、192.168.10.1へ送る」 という意味です。
デフォルトゲートウェイがなければどうなる?
同一ネットワーク内とは通信できても、 別ネットワークへ通信できなくなる可能性があります。
直接通信できる
ルータ経由の経路が必要
ping:相手との疎通を確認する
IPアドレスとルーティングを確認したら、 次に 実際に通信できるか を確認します。
ping 192.168.10.1
$ ping -c 4 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.621 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.558 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.601 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=64 time=0.574 ms
--- 192.168.10.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss
この結果では、 4回送信して4回応答が返っているため、 192.168.10.1とのIPレベルの疎通は確認できた と判断できます。
-cで送信回数を指定できる
ping -c 4 192.168.10.1
-c 4を付けることで、
4回送信したところでpingを終了できます。
スクリプトや障害調査では、 無制限にpingを送信し続けないよう 回数を指定することがあります。
pingは順番に試すと切り分けしやすい
いきなり遠くのサーバへpingするのではなく、 近い場所から順番に確認すると原因を切り分けやすくなります。
127.0.0.1
自分自身
192.168.10.1
ゲートウェイ
8.8.8.8
外部IP
example.com
名前指定
この場合、 IP通信そのものではなく DNSなどの名前解決に問題がある可能性があります。
pingが通らない=通信経路が壊れている、とは限らない
ここは初心者が特に注意したいポイントです。
pingでは ICMPというプロトコルを使用します。
サーバやファイアウォール側でICMPを拒否している場合、 Web通信などが正常でもpingには応答しないことがあります。
pingは非常に便利な確認手段ですが、 ICMPが許可されているとは限りません。 ルーティングやポート、サービス状態なども組み合わせて判断します。
ss:待ち受けているポートを確認する
ネットワーク経路が正常でも、 サービスがポートを待ち受けていなければ接続できません。
そこで使用するのが ssコマンドです。
ss -lntp
$ sudo ss -lntp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=842,fd=3))
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1250,fd=6))
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1250,fd=7))
この例では、 次のTCPポートが待ち受けています。
ss -lntpのオプション
プロセス情報の表示には、 環境や対象によって管理者権限が必要になることがあります。
0.0.0.0:80と127.0.0.1:80の違い
ssでは、 ポート番号だけでなく どのアドレスで待ち受けているか も重要です。
0.0.0.0:80
すべてのIPv4インターフェース
外部から接続できる可能性がある
127.0.0.1:80
ループバックのみ
基本的にそのホスト自身からのみ接続可能
127.0.0.1だけで待ち受けていないかなど、 バインドしているアドレスも確認しましょう。
getent hosts:名前解決を確認する
IPアドレスでは通信できるのに、 ホスト名では通信できない場合、 名前解決を確認します。
getent hosts example.com
$ getent hosts example.com
2606:2800:220:1:248:1893:25c8:1946 example.com
getent hostsは、
Linuxシステムが利用する名前解決の仕組みに沿って
ホスト情報を確認するときに便利です。
dig:DNSへ問い合わせて詳しく確認する
DNSの問い合わせ結果を詳しく確認したい場合は、 digを使用できます。
dig example.com
$ dig example.com
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 300 IN A 192.0.2.50
特に結果だけを簡潔に確認したい場合は、 次のようにできます。
dig +short example.com
$ dig +short example.com
192.0.2.50
ディストリビューションや環境によっては、 digを利用するためのパッケージが インストールされていないことがあります。
getentとdigはどう使い分ける?
Linuxが実際に利用する名前解決結果を確認したいときに便利。
DNS問い合わせの詳細を確認したいときに便利。
通信できないときの基本的な切り分け手順
ここまでのコマンドを、 実際の障害調査の流れとして整理してみましょう。
ip addr
想定したIPが設定されているか?
ip route
宛先への経路やデフォルトゲートウェイはあるか?
ping
ゲートウェイや宛先へ到達できるか?
ss -lntp
必要なサービスが待ち受けているか?
getent hosts / dig
ホスト名からIPアドレスを取得できるか?
ここで実際に試してみよう:通信障害切り分けシミュレーター
あなたはLinuxサーバ web01 を管理しています。
監視から、 「外部サーバへホスト名で接続できない」 というアラートが届きました。
コマンドを使って原因を特定してみましょう。
Network Troubleshooting
まずIPアドレスを確認してみましょう
ip addrを使って、自分自身のネットワーク設定から確認します。
この演習で身につけたい考え方
ip addr
IPは正常
ip route
経路は正常
ping
IP通信は正常
getent / dig
DNS異常を発見
理解度チェック:どこに問題がありそう?
次に優先して確認したいものはどれでしょうか?
「IPでは通信できる」という情報がポイントです。
初心者が間違えやすいポイント
① pingが通らないだけでネットワーク障害と断定する
ICMPがファイアウォールなどで拒否されている可能性があります。
pingだけではなく、 ルーティングや実際に使用するTCP/UDP通信なども含めて判断しましょう。
② IPアドレスだけ確認して終わる
IPアドレスが正しくても、 デフォルトゲートウェイなどの ルーティング設定が間違っていれば通信できません。
③ サービス起動=ポート待ち受け、と考える
サービスが起動しているように見えても、 想定したポートやアドレスで待ち受けているとは限りません。
ss -lntpなどで、
実際の待ち受け状態を確認しましょう。
④ IPでは通信できるのにDNSを疑わない
IPアドレスで通信できるのであれば、 ネットワーク経路そのものは正常である可能性が高くなります。
ホスト名だけ失敗する場合は、 DNSや名前解決設定 を確認しましょう。
ネットワーク確認コマンド早見表
ip addr
IPアドレス
自分のIP設定を確認
ip route
ルーティング
宛先への経路を確認
ping
疎通
IPレベルの到達性を確認
ss -lntp
ポート
TCP待ち受け状態を確認
getent hosts
名前解決
OSから見た名前解決を確認
dig
DNS
DNS問い合わせを詳しく確認
確認問題:ネットワーク確認の基本をチェックしよう
Linuxサーバに設定されているIPアドレスを 確認する代表的なコマンドはどれですか?
ip addrではネットワークインターフェースや 設定されているIPアドレスを確認できます。
デフォルトゲートウェイなど、 Linuxのルーティング情報を確認するコマンドはどれですか?
ip routeでルーティングテーブルを確認できます。 default via … の行からデフォルトゲートウェイも確認できます。
IPアドレスでは通信できるのに、 ホスト名では通信できません。 原因として優先的に確認したいものはどれですか?
IPアドレスで通信できるなら、 IPレベルの経路は正常である可能性があります。 getentやdigなどで名前解決を確認しましょう。
3問に挑戦してみましょう。
まとめ
ip addrで
IPアドレスとインターフェース状態
を確認する
ip routeで
ルーティングとデフォルトゲートウェイ
を確認する
pingで疎通を確認するが、
pingだけで障害を断定しない
ss -lntpで
サービスのTCP待ち受け状態
を確認する
IPでは通信できるのに名前では失敗する場合、
getentやdigで
名前解決を確認する
次はLinuxの処理を自動化してみよう
ここまでのLinux中級講座では、 プロセス・サービス・ログ・パッケージ・ディスク・ネットワークなど、 Linuxサーバを管理するための基本操作を学んできました。
しかし実際のサーバ運用では、 毎日・毎週繰り返す処理を 人が毎回コマンドで実行するとは限りません。
Linuxでは、 cronを使うことで、 指定した日時にコマンドやスクリプトを自動実行できます。
次は「cronでLinux処理を自動実行する」を学びましょう
次の記事では、 cron・crontabの基本から、 「毎日3時」「5分ごと」「毎週月曜日」 といった実行スケジュールの指定方法を学習します。
cron特有の 「分 時 日 月 曜日」 の読み方も、 実際にスケジュールを作りながら理解していきます。
cronでLinux処理を自動実行する →
