特定のユースケース用に EC2 インスタンスをセットアップしようとしています。そのためには、公開された IP アドレスを持つ 2 つの ENI が必要です。(両方とも ping 可能である必要があります)
これまでに次の手順を実行しました:
- 同じサブネットから2つのネットワークインターフェースを接続
- インスタンスを実行する
- インスタンスの各 ENI カードに接続された 2 つの Elastic IP アドレスを作成しました。
EC2 インスタンスのネットワーク インターフェイス セクションで次の結果を確認できます。
しかし、ping できませんでした3.104.193.180
。
私の場合もip address
次のような結果になりました。
ubuntu@ip-172-31-37-139:~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
link/ether 06:ce:dd:28:5b:b8 brd ff:ff:ff:ff:ff:ff
inet 172.31.37.139/20 brd 172.31.47.255 scope global dynamic eth0
valid_lft 3460sec preferred_lft 3460sec
inet6 fe80::4ce:ddff:fe28:5bb8/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
link/ether 06:a6:9a:4a:98:c6 brd ff:ff:ff:ff:ff:ff
inet 172.31.41.29/20 brd 172.31.47.255 scope global dynamic eth1
valid_lft 3460sec preferred_lft 3460sec
inet6 fe80::4a6:9aff:fe4a:98c6/64 scope link
valid_lft forever preferred_lft forever
私の質問は…
- 別の IP を公開/ping 可能にするにはどうすればよいでしょうか?
- サーバー内から両方の Elastic IP を知るにはどうすればよいですか?
答え1
特定のインターフェースに関連付けられたパブリック IP アドレスを取得するには、まずインターフェースから MAC アドレスを取得し、次にインスタンス メタデータ サービス (IMDS) から必要な情報を取得します。上記の例では、eth1 に MAC アドレスがあるため06:a6:9a:4a:98:c6
、次のようにしてパブリック IPv4 アドレスを取得できます。
curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:1d:90:af:65:a3/public-ipv4s
詳細はAWSドキュメント
接続の問題に関しては、まず最初に、各 ENI に関連付けられている VPC ルーティング、ACL、およびセキュリティ グループの構成を再確認してください。これらの詳細は誤って設定されやすく、何かを見落とすとトラフィックがドロップされる可能性があります。まずこれらの詳細を確認してから、この投稿の残りの部分を読んでください。インスタンスに複数の ENI が関連付けられている場合に特に発生する、もう 1 つのより微妙な問題があり、それが問題である可能性があります。
AWS VPC は、厳格なスプーフィング防止保護を実装しています。これは、インスタンスが何らかの理由で侵害された場合に、AWS とその顧客がさまざまな形式のネットワーク攻撃に参加するのを防ぐため、良いことです。ただし、複数の ENI をインスタンスにアタッチする場合は、これを考慮する必要があります。
問題は、基本的なルーティング動作が行き先送信パケットの。つまり、受信パケットへの応答は、元のパケットが受信されたのと同じインターフェイスを介して送信されない可能性があります。ただし、VPC では、応答パケットの送信元アドレスが ENI に関連付けられたプライベート IP アドレスのいずれとも一致しないため、これは「スプーフィングされた」パケットと見なされます。
次のインターフェース構成とルーティング テーブルを検討してください。
admin@ip-10-0-0-115:~$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
altname enp0s5
inet 10.0.0.115/24 brd 10.0.0.255 scope global dynamic ens5
valid_lft 2801sec preferred_lft 2801sec
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
altname enp0s6
inet 10.0.0.8/24 brd 10.0.0.255 scope global dynamic ens6
valid_lft 2889sec preferred_lft 2889sec
admin@ip-10-0-0-115:~$ ip ro
default via 10.0.0.1 dev ens5
10.0.0.0/24 dev ens5 proto kernel scope link src 10.0.0.115
10.0.0.0/24 dev ens6 proto kernel scope link src 10.0.0.8
この場合、10.0.0.8 は ens6 に割り当てられたアドレスです。この IP アドレスへの受信パケットは ens6 経由で受信され、期待どおりに処理されます。ただし、そのパケットへの送信応答は上記のルーティング テーブルに従ってルーティングされ、ens5 経由で送信され、VPC によってドロップされます。
次のようにテストできます:
admin@ip-10-0-0-115:~$ ip ro get 8.8.8.8 from 10.0.0.8
8.8.8.8 from 10.0.0.8 via 10.0.0.1 dev ens5 uid 1000
cache
10.0.0.8 が ens6 に割り当てられているにもかかわらず、デバイスは ens5 であることに注意してください。VPC はこのトラフィックをドロップします。
パケットがVPCによって確実に配信されるようにするには、以下を実装する必要があります。ポリシールーティング一般的に言えば、ポリシー ルーティングとは、システムが宛先だけでなく追加情報を使用してルーティングを決定する状況を指します。この場合、送信元 IP アドレスも考慮する必要があります。ここで必要なのは、送信元アドレスが 10.0.0.8 である送信パケットが ens6 経由で送信されるようにすることです。
Linux のポリシー ルーティングは、通常、ip(8)
コマンドを使用して構成されます。上記のルーティング テーブルを持つインスタンスを機能させるには、ens6 に固有のセカンダリ ルーティング テーブルを作成する必要があります。セカンダリ テーブルの操作は、テーブル ID を指定することを除いて、「メイン」テーブルを操作するのと同じように機能します。したがって、この場合は、次のように、ローカル ネットワークへのルートと、ゲートウェイ経由のデフォルト ルートをテーブル 10000 に追加できます。
admin@ip-10-0-0-115:~$ sudo ip ro add 10.0.0.0/24 dev ens6 table 10000
admin@ip-10-0-0-115:~$ sudo ip ro add default via 10.0.0.1 table 10000
admin@ip-10-0-0-115:~$ ip ro show table 10000
default via 10.0.0.1 dev ens6
10.0.0.0/24 dev ens6 scope link
次の表に従って、10.0.0.8 からの送信トラフィックをルーティングするルールを作成します。
admin@ip-10-0-0-115:~$ sudo ip rule add from 10.0.0.8/32 table 10000 pref 10000
admin@ip-10-0-0-115:~$ ip rule
0: from all lookup local
10000: from 10.0.0.8 lookup 10000
32766: from all lookup main
32767: from all lookup default
ルール 10000 が存在することに注意してください。これは、10.0.0.8 からのトラフィックがテーブル 10000 経由でルーティングされることを示しています。
これをip ro get
再度確認してみましょう:
admin@ip-10-0-0-115:~$ ip ro get 8.8.8.8 from 10.0.0.8
8.8.8.8 from 10.0.0.8 via 10.0.0.1 dev ens6 table 10000 uid 1000
cache
テーブル 10000 に従ってルーティングされていることに注意してください。さらに重要なのは、デバイス ens6 経由で送信されることです。
Amazon Linux では、インスタンスに複数の ENI がアタッチされている場合、このようなポリシー ルーティング ルールが自動的に設定されます。Ubuntu でこれが実行されるかどうかはわかりません。そのため、その点について少し調査し、特定の状況に合わせて独自の自動化を実装する必要があるかもしれません。