シェアする

  • このエントリーをはてなブックマークに追加

日本全国のエンジニアに贈る!エンジニアがネットワーク側がおかしくない?と思ったときに打つべき切り分けコマンドまとめ

シェアする

  • このエントリーをはてなブックマークに追加
  • 154

kiriwake-network-tamezatu

いろいろとアプリケーションを使って検証したり結合テストなどを行っている時にうまく動かなくてネットワーク側に問題あるのでは?と思うことがあると思います。

@Zakkiは元ネットワークエンジニアなのでネットワークを構築するときはエンドtoエンドでちゃんと疎通確認をしてあにかあれば監視サーバ上でアラートを上げるようにしているのでネットワーク側にはむしろ問題がないと思う時もありますが、機器の故障などもありますのでネットワーク経路すべてのチェックをします。

エンジニアの方からはネットワークはよく分からない。とか難しい。というのをよく耳にしていました。実はネットワークはそんなに難しいものではありません。ここではネットワーク側が悪いのかそれとも自分たち側が悪いのかを切り分けるするのに使うコマンドを紹介します。ここで切り分けした内容をネットワークエンジニアに伝えれば短時間で解決してくれますし、原因がわかれば自分でも対処できるようになりますよ!エンジニアスキルアップにもなるホットなTipsをあなただけにお届けします!

スポンサーリンク
ad
ad










pingコマンドでなにはともあれ疎通確認

なにかおかしいとか通信ができてなさそうと思っていたときに最初に打つコマンドです。ネットワークエンジニアはまずpingコマンドで複数の通信先に対して確認します。一部の宛先でかってこなければ宛先のサーバーやその近くのネットワーク機器が落ちているだけと判断できますし、すべての宛先から応答がなければ送信先やその近くのスイッチやルーターなどのネットワーク機器に問題があるかもしれません。

これは通信先のサーバーに対して疎通確認を行うコマンドで正常に疎通が取れていれば応答が返ってきます。

ping <対象のサーバーのIPアドレスまたはホスト名>

# ping -c 2 hogehoge.local
PING hogehoge.local (XXX.XXX.XXX.XXX) 56(84) bytes of data.
64 bytes from localhost (XXX.XXX.XXX.XXX): icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from localhost (XXX.XXX.XXX.XXX): icmp_seq=2 ttl=64 time=0.049 ms

--- hogehoge.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.016/0.032/0.049/0.017 ms

オプション 説明
-n 名前解決を行わずIPアドレスのまま結果を表示
-c 連続の送信回数を指定
-i 連続の送信の間隔(秒)を指定
-c 連続で送信するパケットデータのサイズを指定

tracerouteコマンドでどこまで通信が正常か確認する

tracerouteコマンドは対象の通信先に対してネットワークの経路と正常性を教えてくれるコマンドです。ルーターを1つ越えることに1ホップ加算され、応答時間が表示されます。

tracerouteがcompleteにならなければどこで応答がなくなったかをメモしておいてネットワークエンジニアに伝えましょう。この時点でネットワーク側に問題があることがわかります。

traceroute <対象のサーバーのIPアドレスまたはホスト名>

$ traceroute hogehoge.com
traceroute to hogehoge.com (59.106.13.38), 64 hops max, 40 byte packets
1   218.227.247.99 (218.227.247.99)  17.042 ms  16.092 ms  16.146 ms
2   218.227.247.126 (218.227.247.126)  16.920 ms  17.880 ms  16.116 ms
3   219.107.255.254 (219.107.255.254)  19.165 ms  18.637 ms  18.326 ms
4   133.205.1.1 (133.205.1.1)  18.896 ms  18.610 ms  19.348 ms
5   210.173.176.63 (210.173.176.63)  19.075 ms  19.789 ms  18.082 ms
6   tksrt1b-crt2-10g.bb.sakura.ad.jp (202.222.26.9)  18.871 ms  21.272 ms  22.370 ms
7   tksrt2b-srt1b-10g.bb.sakura.ad.jp (202.222.26.110)  20.533 ms  20.481 ms  20.340 ms
8   tkgrt1b-srt2b-10g.bb.sakura.ad.jp (202.181.110.2)  20.601 ms  20.498 ms  20.561 ms
9   tkgrt1x-grt1b-2.bb.sakura.ad.jp (202.181.110.114)  19.612 ms  20.429 ms  20.632 ms
10  tkgrt5e-grt1b.bb.sakura.ad.jp (202.181.110.46)  19.070 ms  20.474 ms  18.599 ms
11  hogehoge.com (59.106.13.38)  17.755 ms  18.994 ms  19.141 ms

telnetコマンドで対象のサーバーのポートが空いているか確認する

telnetコマンドは本来の使い方はリモートで他のマシンにログインして操作するときのコマンドですがポート番号指定ができるので、対象のサーバーのポートが空いているかどうかを確認できます。

空いていないとtrying…のまま進まなかったりConnection refusedと接続が拒否されたことがわかります。例えば対象のサーバーの80番ポートが空いているかどうかを確認するには、

telnet <対象のサーバーのIPアドレスまたはホスト名> <ポート番号>

#telnet hogehoge.com
Tring xxx.xxx.xx.xx.....
Connected to hogehoge.com
FreeBSD/i386 (hogehoge.mydomain.co.jp) (ttyp0)

ifconfig(ip addr show)/ipconfigコマンドでIPアドレスを確認する

WindowsではipconfigでMacやUnix系のマシンであればifconfig(ip addr showでも同じ)コマンドになります。このコマンドを打つことで自分のマシンのネットワークカードに設定されているIPアドレスが確認できます。

ifconfig <対象のサーバーのIPアドレスまたはホスト名>

# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.2  netmask 255.255.255.0  broadcast 192.168.0.255
        ether 00:50:56:95:91:ee  txqueuelen 1000  (Ethernet)
        RX packets 26628  bytes 2812687 (2.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 26631  bytes 3055726 (2.9 MiB)
        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
        loop  txqueuelen 0  (Local Loopback)
        RX packets 6  bytes 504 (504.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 504 (504.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:95:91:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.2/24 brd 192.168.0.255 scope global ens160
       valid_lft forever preferred_lft forever

netstatコマンドで接続状態を確認する

netstatコマンドはサーバーと接続しているホスト側のネットワークの接続状態を確認するコマンドです。ESTABLISHEDであれば接続が正常に確立できている状態です。対象のサーバーとの接続状態がESTABLISHEDであれば問題ありません。

# netstat -aln -A inet
Active Internet connections (servers and established)
Proto  Recv-Q  Send-Q  Local Address    Foreign Address        State
tcp         0       0  0.0.0.0:22       0.0.0.0:*              LISTEN
tcp         0      52  192.168.0.2:22   192.168.10.47:64911    ESTABLISHED
udp         0       0  0.0.0.0:123      0.0.0.0:*
udp         0       0  127.0.0.1:323    0.0.0.0:*
 
オプション 説明
-l 待ち受け状態のソケットのみを表示
-a 待ち受け状態によらずソケットをすべて表示
-c 情報を毎秒更新して最新状況を表示
-i ネットワークインタフェースの統計を表示
-r ルーティングテーブルを表示
-n ホストなどを名前解決せず、数字のまま表示
 
 
状態 説明
CLOSED 未使用状態のTCPポート。通常これが表示されない
LISTENING 待ち受け状態(リッスン状態)のポート。netstatに-aオプションを付けると表示される
SYN_SENT サーバに対して、通信開始の要求(SYN:Synchronize)を送信したが、まだそれに対する応答(ACK:Acknowledgement)を受け取っていない状態。相手が無応答のときもこの状態になる。ACKを受け取るとESTABLISHEDへ遷移する
SYN_RECEIVED クライアントからSYN要求を受け取った直後の状態。SYNに対するACKを送信するとESTABLISHEDへ遷移する
ESTABLISHED TCPコネクションが確立して通信している状態。netstatでは最もよく見る状態。どちらかが終了処理を始めると、FIN_WAIT_1もしくはCLOSE_WAITへ遷移する
FIN_WAIT_1 自分の側からFINを送信した状態。そのFINに対するACKを相手から受信すると、FIN_WAIT_2へ遷移するが、先に相手からのFINを受けるとCLOSINGへ遷移する
FIN_WAIT_2 FINに対するACKを受信した状態。相手からのFINを受信して、それに対するACKを返すと、TIME_WAITへ遷移する
CLOSE_WAIT 相手からのFINを受け取った状態。アプリケーションが終了すると、FINを送信してからLAST_ACKへ遷移する
CLOSING FINに対する相手からのACKを受けるとTIME_WAITへ遷移する
LAST_ACK 送信したFINに対するACK待ち状態。ACKを受け取るとCLOSEDへ遷移して終了する
TIME_WAIT コネクションの終了待ち状態。しばらく待ったあと、CLOSEDへ遷移して終了する
 

nmapコマンドで空いているポートのスキャンをする

nmapは対象サーバーのポートは何が空いているのかをスキャンして確認する。ただし、スキャン先は自社内のサーバーなどの攻撃と思われても責任が取れる範囲だけにしておいてください。外部に公開されているwebサーバーなどでは攻撃と間違えられ裁判沙汰になるケースがたくさんあります。

nmap <対象のサーバーのIPアドレスまたはホスト名>

127.0.0.1は自分のマシンのローカルアドレスで、下の例は自分のマシンのポートをスキャンしています。

# nmap 127.0.0.1

Starting Nmap 5.51 ( http://nmap.org ) at 2015-09-23 00:26 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000010s latency).
Not shown: 995 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
23/tcp  open  telnet
25/tcp  open  smtp
111/tcp open  rpcbind
631/tcp open  ipp

Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds


オプション 説明
-sT TCP スキャン
-sU UDP スキャン
-sP Ping スキャン
-p 続けて対象ポート範囲を指定
-F 有名ポートを対象にした高速スキャン
-0 対照ホストの OS識別を試行する

lsofコマンドで空いているポートが何で使われているか確認する

nmapコマンドで空いているポートを確認したらあとは何のアプリケーションやプロセスがそのポートを使っているのかを確認します。そうすることによって同じポートを使用使用している競合アプリケーションやプロセスを終了させることもできますし、ポート番号を変更して競合を回避することもできます。

# プロセスIDで表示
lsof p 12345
 
# ユーザで表示
lsof u yarn
 
# プロセス名で表示
lsof c java
 
# ファイルやパーティションで指定
lsof /bin/bash
lsof /var
 
# LISTENしてるプロセスを表示
lsof i:80
 
オプション 説明
-P ポート番号をサービス名に変換しない
-c プロセス名を指定する
-i ネットワークソケットファイルを表示する
-n IPアドレスを表示する(名前解決しない)
-p プロセスIDを指定する

nslookupコマンドでDNS名前解決が正しくできているか確認する

nslookupコマンドはDNSクライアント機能を持っており、DNSサーバーから適切な結果が返却されているかどうか確認できます。もしnslookup hogehoge.local(hogehoge.localは宛先)コマンドを実行して帰って来る結果が正しいIPアドレスでなければDNSサーバーの設定が間違えっているとわかります。

nslookup <対象のサーバーのIPアドレスまたはホスト名>

$ nslookup hogehoge.com
Server:         tamezatu-server
Address:        192.168.1.11#1150

Non-authoritative answer:
Name:   tamezatu-dns.com
Address: 10.106.13.38

実際にネットワークエンジニアが切り分けに使うコマンドはこれくらいですし、ここまで切り分けができればネットワークエンジニアにどのコマンドを使ってどのような結果になったのでここが怪しいと言えます。エンジニアとしては十分すぎるくらいの仕事をしていると思います。ここまで切り分けができれいてば復旧までの時間がかなり短くなりますので周りからスゲ━━━━━━ヽ(゚Д゚)ノ━━━━━と言われることでしょう。

いじょうー!みまさまのエンジニアスキルアップのためになりましたら幸いです。


iPhone,iPadにそのまま使える!格安SIMはmineo!SIMロック解除不要でユーザー満足度No.1です![詳細]
スポンサーリンク
ad
ad

シェアする

  • このエントリーをはてなブックマークに追加

お役に立ちましたらシェア・フォローしていただけると嬉しいです( ・ω・)

facebook