必見の記事

ネットワークの状況を確認するコマンド色々

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

なんで相手に繋がらないの!?

サーバ管理していてよく起こる問題は、「なんで繋がらないの!?」ですよね。そこで、今回は基本的なネットワークをご紹介したいと思います。OSやツールのバージョンにより動作が異なりますので、それぞれ調べてみて頂ければと思います。今回は、Amazon Linux 2015.03を用いています。

ping

基本はpingですね。ICMPのにあるエコー要求/応答のpingを使って接続確認を行います。

$ ping yahoo.co.jp
PING yahoo.co.jp (182.22.59.229) 56(84) bytes of data.
64 bytes from f1.top.vip.ssk.yahoo.co.jp (182.22.59.229): icmp_seq=1 ttl=54 time=4.84 ms
64 bytes from f1.top.vip.ssk.yahoo.co.jp (182.22.59.229): icmp_seq=2 ttl=54 time=5.03 ms
64 bytes from f1.top.vip.ssk.yahoo.co.jp (182.22.59.229): icmp_seq=3 ttl=54 time=5.03 ms
64 bytes from f1.top.vip.ssk.yahoo.co.jp (182.22.59.229): icmp_seq=4 ttl=54 time=5.60 ms
64 bytes from f1.top.vip.ssk.yahoo.co.jp (182.22.59.229): icmp_seq=5 ttl=54 time=4.90 ms
^C
--- yahoo.co.jp ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4703ms
rtt min/avg/max/mdev = 4.843/5.086/5.609/0.282 ms

しかし、相手のサーバはICMPを閉じている可能性があります。TCPやUDPを使って動作を確認したいはずです。

traceroute

tracerouteは、宛先までの経路を確認することができます。また、ICMP/UDP/TCPを使うことができます。TCPを指定できるのは今回始めて知りました(汗

TCP

到達しました。

$ sudo traceroute -T -q 1 -w 1 yahoo.co.jp
traceroute to yahoo.co.jp (183.79.135.206), 30 hops max, 60 byte packets
 1  *
 2  27.0.0.210 (27.0.0.210)  9.334 ms
 3  54.239.52.166 (54.239.52.166)  9.343 ms
 4  *
 5  *
 6  *
 7  f1.top.vip.kks.yahoo.co.jp (183.79.135.206)  15.428 ms

UDP

UDPは到達しませんでした。(ACKなし)

$ sudo traceroute -U -q 1 -w 1 yahoo.co.jp
traceroute to yahoo.co.jp (183.79.135.206), 30 hops max, 60 byte packets
 1  ec2-175-41-192-134.ap-northeast-1.compute.amazonaws.com (175.41.192.134)  0.513 ms
 2  27.0.0.154 (27.0.0.154)  8.906 ms
 3  54.239.52.166 (54.239.52.166)  9.349 ms
 4  27.0.0.248 (27.0.0.248)  192.309 ms
 5  54.239.52.145 (54.239.52.145)  8.648 ms
 6  210.173.178.44 (210.173.178.44)  8.698 ms
 7  124.83.228.225 (124.83.228.225)  8.732 ms
 8  124.83.252.250 (124.83.252.250)  15.140 ms
 9  *
10  *
11  *

ICMP

到達しました。

$ sudo traceroute -I -q 1 -w 1 yahoo.co.jp
traceroute to yahoo.co.jp (182.22.59.229), 30 hops max, 60 byte packets
 1  ec2-175-41-192-130.ap-northeast-1.compute.amazonaws.com (175.41.192.130)  0.623 ms
 2  27.0.0.154 (27.0.0.154)  1.660 ms
 3  27.0.0.136 (27.0.0.136)  1.703 ms
 4  *
 5  202.93.95.142 (202.93.95.142)  2.185 ms
 6  *
・・・・
17  *
18  f1.top.vip.ssk.yahoo.co.jp (182.22.59.229)  4.790 ms

mtr

mtr(My Traceroute)は、pingとtracerouteを足した様なツールです。経路とレイテンシを調べることができます。Amazon Linuxには標準で入っていませんので追加します。

$ sudo yum install mtr -y

それでは実行してみましょう。

$ sudo mtr yahoo.co.jp
                                            My traceroute  [v0.75]
ip-10-0-23-230 (0.0.0.0)                                                              Sun May 10 14:55:15 2015
Resolver: Received error response 2. (server failure)er of fields   quit
                                                                      Packets               Pings
 Host                                                               Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. ec2-175-41-192-132.ap-northeast-1.compute.amazonaws.com          0.0%    19    0.4   1.1   0.4   6.0   1.5
 2. 27.0.0.210                                                       0.0%    19    9.4   9.4   9.3   9.5   0.0
 3. 54.239.52.174                                                    0.0%    19    9.1   9.1   8.9  10.0   0.2
 4. 54.239.52.140                                                    0.0%    19    9.4   9.6   8.9  12.2   0.8
 5. 54.239.52.145                                                    0.0%    19    8.6   8.7   8.6   8.9   0.1
 6. 210.173.178.44                                                   0.0%    19    8.6   8.8   8.6  10.7   0.5
 7. 124.83.228.225                                                   0.0%    19    8.8   8.8   8.6   8.8   0.1
 8. 124.83.252.250                                                   0.0%    19   15.1  15.1  15.0  15.2   0.0
 9. 114.111.65.154                                                   0.0%    19   15.4  15.6  15.2  19.6   1.0
10. f1.top.vip.kks.yahoo.co.jp                                       0.0%    19   15.1  15.1  15.1  15.2   0.0

なかなか見やすいですね。TCP指定はできないようです。

tcptraceroute

tracerouteでTオプションが使えない場合には、tcptracerouteというツールもあります。早速使ってみましょう。

$ sudo yum install tcptraceroute -y --enablerepo epel

コマンドはtracerouteとほぼ同じです。

$ sudo tcptraceroute -q 1 -w 1 yahoo.co.jp
Selected device eth0, address 10.0.23.230, port 45347 for outgoing packets
Tracing the path to yahoo.co.jp (183.79.135.206) on TCP port 80 (http), 30 hops max
 1  *
 2  27.0.0.210  9.325 ms
 3  54.239.52.174  11.114 ms
 4  *
・・・・
10  *
11  f1.top.vip.kks.yahoo.co.jp (183.79.135.206) [open]  15.374 ms

netstat

ルーティングテーブルを見て、デフォルトゲートウェイを調べたいときに使ったりします。

$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.23.1       0.0.0.0         UG        0 0          0 eth0
10.0.23.0       0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.169.254 0.0.0.0         255.255.255.255 UH        0 0          0 eth0

dig

宛先のドメインに関する情報を表示します。AレコーとやCNAMEなどを見ます。

$ dig yahoo.co.jp a

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.36.amzn1 <<>> yahoo.co.jp a
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49909
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;yahoo.co.jp.			IN	A

;; ANSWER SECTION:
yahoo.co.jp.		300	IN	A	183.79.135.206
yahoo.co.jp.		300	IN	A	182.22.59.229

;; Query time: 3 msec
;; SERVER: 10.0.0.2#53(10.0.0.2)
;; WHEN: Sun May 10 15:35:46 2015
;; MSG SIZE  rcvd: 61

ifconfig

ネットワークインタフェースやIPアドレスを調べます。

$ ifconfig
eth0      Link encap:Ethernet  HWaddr 06:FA:3C:12:5D:A7  
          inet addr:10.0.23.230  Bcast:10.0.23.255  Mask:255.255.255.0
          inet6 addr: fe80::4fa:3cff:fe12:5da7/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:115174 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36425 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:121159541 (115.5 MiB)  TX bytes:4079259 (3.8 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:38 errors:0 dropped:0 overruns:0 frame:0
          TX packets:38 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2096 (2.0 KiB)  TX bytes:2096 (2.0 KiB)

hosts

IPアドレスとホスト名をマッピングするファイルです。テスト用サーバを本番のドメインに見立てるためにhostsファイルを書いたりします。そのまま残ってしまっている場合もありますので見てみます。host名がおかしい場合もありますので同じく見てみましょう。

$ cat /etc/hosts
hosts        hosts.allow  hosts.deny 
$ hostname
ip-10-0-23-230

iptables

何かパケットをフィルタする設定をしているかもしれません。

$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

SecurityGroup

ここからはAWSのネットワーク周りです。SecurityGroupは、IPレンジとポート番号でIN/OUTを制御することができる仮想ファイルウォールです。AWSコマンドラインツールで確認してみましょう。

$ aws ec2 describe-security-groups --group-ids sg-4a78e9XX
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1", 
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ], 
                    "UserIdGroupPairs": []
                }
            ], 
            "Description": "launch-wizard-5 created 2015-05-12T10:22:45.286+09:00", 
            "IpPermissions": [
                {
                    "ToPort": 22, 
                    "IpProtocol": "tcp", 
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ], 
                    "UserIdGroupPairs": [], 
                    "FromPort": 22
                }
            ], 
            "GroupName": "launch-wizard-5", 
            "VpcId": "vpc-5a9f67XX", 
            "OwnerId": "XXXXXXXXXXXX", 
            "GroupId": "sg-4a78e9XX"
        }
    ]
}

NetworkACL

こちらもAWSのネットワーク周りです。NetworkACLはルールベースのファイアウォールです。AWSコマンドラインツールで確認してみましょう。

$ aws ec2 describe-network-acls 
{
    "NetworkAcls": [
        {
            "Associations": [
                {
                    "SubnetId": "subnet-6cc01dXX", 
                    "NetworkAclId": "acl-0865a0XX", 
                    "NetworkAclAssociationId": "aclassoc-7ebf2bXX"
                }, 
                {
                    "SubnetId": "subnet-c47dbbXX", 
                    "NetworkAclId": "acl-0865a0XX", 
                    "NetworkAclAssociationId": "aclassoc-808d25XX"
                }
            ], 
            "NetworkAclId": "acl-0865a0XX", 
            "VpcId": "vpc-5a9f67XX", 
            "Tags": [], 
            "Entries": [
                {
                    "CidrBlock": "0.0.0.0/0", 
                    "RuleNumber": 100, 
                    "Protocol": "-1", 
                    "Egress": true, 
                    "RuleAction": "allow"
                }, 
                {
                    "CidrBlock": "0.0.0.0/0", 
                    "RuleNumber": 32767, 
                    "Protocol": "-1", 
                    "Egress": true, 
                    "RuleAction": "deny"
                }, 
                {
                    "CidrBlock": "0.0.0.0/0", 
                    "RuleNumber": 100, 
                    "Protocol": "-1", 
                    "Egress": false, 
                    "RuleAction": "allow"
                }, 
                {
                    "CidrBlock": "0.0.0.0/0", 
                    "RuleNumber": 32767, 
                    "Protocol": "-1", 
                    "Egress": false, 
                    "RuleAction": "deny"
                }
            ], 
            "IsDefault": true
        }
    ]
}

ルーティングテーブル

忘れてならないのはルーティングです。VPC内のパケットがどこに向けてルーティングしているのか確認しましょう。もちかしたら、インターネットゲートウェイを開いていなかったというオチがあるかもしれません。

$ aws ec2 describe-route-tables
{
    "RouteTables": [
        {
            "Associations": [
                {
                    "RouteTableAssociationId": "rtbassoc-eb5f9fXX", 
                    "Main": true, 
                    "RouteTableId": "rtb-9171b5XX"
                }
            ], 
            "RouteTableId": "rtb-9171b5fXX", 
            "VpcId": "vpc-5a9f67XX", 
            "PropagatingVgws": [], 
            "Tags": [], 
            "Routes": [
                {
                    "GatewayId": "local", 
                    "DestinationCidrBlock": "10.0.0.0/16", 
                    "State": "active", 
                    "Origin": "CreateRouteTable"
                }, 
                {
                    "GatewayId": "igw-dfd53dXX", 
                    "DestinationCidrBlock": "0.0.0.0/0", 
                    "State": "active", 
                    "Origin": "CreateRoute"
                }, 
                {
                    "GatewayId": "vpce-612dc8XX", 
                    "Origin": "CreateRoute", 
                    "State": "active"
                }
            ]
        }
    ]
}

仮想NIC

AWSでは仮想NICの設定も重要です。EC2インスタンスにアタッチされている仮想NICの設定状況も見ましょう。

$ aws ec2 describe-network-interfaces
{
    "NetworkInterfaces": [
        {
            "Status": "in-use", 
            "MacAddress": "06:07:1c:6f:e6:XX", 
            "SourceDestCheck": true, 
            "VpcId": "vpc-5a9f67XX", 
            "Description": "Primary network interface", 
            "Association": {
                "PublicIp": "52.68.XX.XX", 
                "AssociationId": "eipassoc-5387f7XX", 
                "PublicDnsName": "", 
                "AllocationId": "eipalloc-280df5XX", 
                "IpOwnerId": "XXXXXXXXXXXX"
            }, 
            "NetworkInterfaceId": "eni-321dc2XX", 
            "PrivateIpAddresses": [
                {
                    "Association": {
                        "PublicIp": "52.68.XX.XX", 
                        "AssociationId": "eipassoc-5387f7XX", 
                        "PublicDnsName": "", 
                        "AllocationId": "eipalloc-280df5XX", 
                        "IpOwnerId": "XXXXXXXXXXXX"
                    }, 
                    "Primary": true, 
                    "PrivateIpAddress": "10.0.23.XX"
                }
            ], 
            "RequesterManaged": false, 
            "AvailabilityZone": "ap-northeast-1b", 
            "Attachment": {
                "Status": "attached", 
                "DeviceIndex": 0, 
                "AttachTime": "2015-05-12T01:22:55.000Z", 
                "InstanceId": "i-2289baXX", 
                "DeleteOnTermination": true, 
                "AttachmentId": "eni-attach-a2e51aXX", 
                "InstanceOwnerId": "XXXXXXXXXXXX"
            }, 
            "Groups": [
                {
                    "GroupName": "launch-wizard-5", 
                    "GroupId": "sg-4a78e9XX"
                }
            ], 
            "SubnetId": "subnet-6cc01dXX", 
            "OwnerId": "XXXXXXXXXXXX", 
            "TagSet": [], 
            "PrivateIpAddress": "10.0.23.XX"
        }
    ]
}

まとめ

AWSのネットワーク周りで繋がらなくて困ったら、OSの基本コマンドによる疎通の確認をはじめ、AWSの基本的なネットワーク設定を確認することで、設定漏れや間違いなどを早期に発見することができるのではと思います。