この記事は公開されてから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の基本的なネットワーク設定を確認することで、設定漏れや間違いなどを早期に発見することができるのではと思います。