プライベートサブネット内のインスタンスはインターネットに接続できますが、ping/tracerouteは実行できません

プライベートサブネット内のインスタンスはインターネットに接続できますが、ping/tracerouteは実行できません

下の画像のように、いくつかのパブリックサブネットとプライベートサブネットを持つ AWS VPC があります。

  • どちらのインスタンスもインターネットに接続できます(事例A接続するNATゲートウェイ実例)
  • NATゲートウェイインターネット上のホストや他のサブネット上のインスタンスにpingやtracerouteを実行できる
  • 事例ApingできるNATゲートウェイおよびそのサブネット内の他のインスタンスと他のサブネット

NATゲートウェイこれは私が設定した Ubuntu 16.04 (t2.micro) インスタンスです。これはマネージド AWS NAT ゲートウェイではありません。VPC 内の他のすべてのホストのゲートウェイとして、また D-NAT (一部のプライベート Apache サーバー用) として完璧に機能し、SSH 要塞としても機能します。

問題はそれです事例Aインターネット上のホストに ping または traceroute を実行できません。すでに試した/確認した内容:

  • ルートテーブル
  • セキュリティグループ
  • IPTABLESルール
  • カーネルパラメータ

VPC 図

セキュリティグループ

 NAT GATEWAY
 Outbound: 
  * all traffic allowed
 Inbound:
  * SSH from 192.168.0.0/16 (VPN network)
  * HTTP/S from 172.20.0.0/16 (allowing instances to connect to the internet)
  * HTTP/S from 0.0.0.0/0 (allowing clients to access internal Apache servers through D-NAT)
  * ALL ICMP V4 from 0.0.0.0/0 


 INSTANCE A
 Outbound: 
  * all traffic allowed
 Inbound:
  * SSH from NAT GATEWAY SG
  * HTTP/S from 172.20.0.0/16 (public internet throught D-NAT)
  * ALL ICMP V4 from 0.0.0.0/0

ルートテーブル

PUBLIC SUBNET
172.20.0.0/16: local
0.0.0.0/0: igw-xxxxx (AWS internet gateway attached to VPC)

PRIVATE SUBNET
0.0.0.0/0: eni-xxxxx (network interface of the NAT gateway)
172.20.0.0/16: local

Iptablesルール

# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

# iptables -tnat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -o eth0 -j MASQUERADE

カーネルパラメータ

net.ipv4.conf.all.accept_redirects = 0  # tried 1 too
net.ipv4.conf.all.secure_redirects = 1
net.ipv4.conf.all.send_redirects = 0  # tried 1 too
net.ipv4.conf.eth0.accept_redirects = 0  # tried 1 too
net.ipv4.conf.eth0.secure_redirects = 1
net.ipv4.conf.eth0.send_redirects = 0  # tried 1 too
net.ipv4.ip_forward = 1

インスタンス A からのサンプル traceroute

UDP を使用した traceroute の詳細を指摘してくれた @hargut に感謝します (私の SG ではそれが許可されていません)。そこで、-IICMP のオプションを使用してそれを使用します。

# traceroute -I 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  ip-172-20-16-10.ec2.internal (172.20.16.10)  0.670 ms  0.677 ms  0.700 ms
 2  * * *
 3  * * *
 ...

答え1

Linux/Unix の traceroute は標準のリクエストに UDP を使用します。セキュリティ グループでは UDP 受信パケットが許可されません。

traceroute のマニュアルページから:

In the modern network environment the traditional traceroute methods can not be always applicable, because of widespread use of firewalls. Such firewalls filter the "unlikely" UDP ports, or even ICMP echoes. To solve this, some additional tracerouting methods are implemented (including tcp), see LIST OF AVAILABLE METHODS below. Such methods try to use particular protocol and source/destination port, in order to bypass firewalls (to be seen by firewalls just as a start of allowed type of a network session)

トレースルート

-Itraceroute モードを ICMP ベースのトレースに切り替える tracerout のオプションを参照してください。

関連情報