いろいろとアプリケーションを使って検証したり結合テストなどを行っている時にうまく動かなくてネットワーク側に問題あるのでは?と思うことがあると思います。
@Zakkiは元ネットワークエンジニアなのでネットワークを構築するときはエンドtoエンドでちゃんと疎通確認をしてあにかあれば監視サーバ上でアラートを上げるようにしているのでネットワーク側にはむしろ問題がないと思う時もありますが、機器の故障などもありますのでネットワーク経路すべてのチェックをします。
エンジニアの方からはネットワークはよく分からない。とか難しい。というのをよく耳にしていました。実はネットワークはそんなに難しいものではありません。ここではネットワーク側が悪いのかそれとも自分たち側が悪いのかを切り分けるするのに使うコマンドを紹介します。ここで切り分けした内容をネットワークエンジニアに伝えれば短時間で解決してくれますし、原因がわかれば自分でも対処できるようになりますよ!エンジニアスキルアップにもなるホットなTipsをあなただけにお届けします!
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 ( https://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コマンドで空いているポートを確認したらあとは何のアプリケーションやプロセスがそのポートを使っているのかを確認します。そうすることによって同じポートを使用使用している競合アプリケーションやプロセスを終了させることもできますし、ポート番号を変更して競合を回避することもできます。
オプション | 説明 |
---|---|
-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
実際にネットワークエンジニアが切り分けに使うコマンドはこれくらいですし、ここまで切り分けができればネットワークエンジニアにどのコマンドを使ってどのような結果になったのでここが怪しいと言えます。エンジニアとしては十分すぎるくらいの仕事をしていると思います。ここまで切り分けができれいてば復旧までの時間がかなり短くなりますので周りからスゲ━━━━━━ヽ(゚Д゚)ノ━━━━━と言われることでしょう。
いじょうー!みまさまのエンジニアスキルアップのためになりましたら幸いです。