Ich versuche, eine EC2-Instanz für einen bestimmten Anwendungsfall einzurichten. Dazu benötige ich 2 ENI mit öffentlich zugänglichen IP-Adressen. (Beide sollten pingbar sein)
Ich habe bisher folgende Schritte durchgeführt:
- Angeschlossene 2 Netzwerkschnittstellen aus demselben Subnetz
- Instanz ausführen
- Es wurden 2 elastische IP-Adressen erstellt, die mit jeder ENI-Karte der Instanz verknüpft sind.
Ich kann das folgende Ergebnis im Abschnitt „Netzwerkschnittstellen der EC2-Instanz“ sehen.
Aber ich konnte keinen Ping senden 3.104.193.180
.
Also meins ip address
ergibt folgendes Ergebnis...
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
Meine Fragen sind also ...
- Was muss ich tun, um eine andere IP verfügbar/pingbar zu machen?
- Wie erfahre ich vom Server aus meine beiden elastischen IPs?
Antwort1
Um die öffentliche IP-Adresse zu erhalten, die einer bestimmten Schnittstelle zugeordnet ist, müssen Sie zunächst die MAC-Adresse von der Schnittstelle abrufen und dann die gewünschten Informationen vom Instance Metadata Service (IMDS) abrufen. In Ihrem obigen Beispiel hat eth1 also die MAC-Adresse 06:a6:9a:4a:98:c6
, sodass Sie die öffentliche IPv4-Adresse folgendermaßen erhalten können:
curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:1d:90:af:65:a3/public-ipv4s
Weitere Informationen finden Sie unterdie AWS-Dokumentation
Überprüfen Sie in Bezug auf Ihr Verbindungsproblem als ersten Schritt die VPC-Routing-, ACL- und Sicherheitsgruppenkonfiguration, die mit jedem Ihrer ENIs verknüpft ist. Diese Details können leicht falsch konfiguriert werden und können zu Datenverkehrsabbrüchen führen, wenn Sie etwas übersehen. Überprüfen Sie zuerst diese Details und kommen Sie dann zurück und lesen Sie den Rest dieses Beitrags. Es gibt ein weiteres, subtileres Problem, das insbesondere dann auftritt, wenn Sie mehrere ENIs mit einer Instanz verknüpft haben, und das könnte Ihr Problem sein.
AWS VPC implementiert strenge Anti-Spoofing-Schutzmaßnahmen. Das ist eine gute Sache, denn es schützt AWS und seine Kunden vor der Teilnahme an verschiedenen Formen von Netzwerkangriffen, falls eine Instanz aus irgendeinem Grund kompromittiert wird. Dies müssen Sie jedoch berücksichtigen, wenn Sie mehrere ENIs an Instanzen anhängen.
Das Problem besteht darin, dass das grundlegende Routingverhalten nur durch dieZieleines ausgehenden Pakets. Dies bedeutet, dass die Antwort auf ein eingehendes Paket möglicherweise nicht über dieselbe Schnittstelle übertragen wird, über die das ursprüngliche Paket empfangen wurde. Für eine VPC gilt dies jedoch als „gefälschtes“ Paket, da die Quelladresse im Antwortpaket keiner der mit der ENI verknüpften privaten IP-Adressen entspricht.
Beachten Sie die folgende Schnittstellenkonfiguration und Routingtabelle:
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
In diesem Fall ist 10.0.0.8 eine Adresse, die ens6 zugewiesen ist. Ein eingehendes Paket an diese IP-Adresse wird über ens6 empfangen und wie erwartet verarbeitet. Eine ausgehende Antwort auf dieses Paket wird jedoch gemäß der obigen Routing-Tabelle weitergeleitet, tritt über ens5 aus und wird vom VPC gelöscht.
Du kannst das folgendermaßen testen:
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
Beachten Sie, dass das Gerät ens5 ist, obwohl 10.0.0.8 ens6 zugewiesen ist! Die VPC würde diesen Datenverkehr löschen!
Um sicherzustellen, dass Ihre Pakete vom VPC zugestellt werden, müssen Sie Folgendes implementieren:Richtlinienrouting. Allgemein gesagt bezieht sich Policy Routing auf die Situation, in der Ihr System neben dem Ziel noch weitere Informationen verwendet, um Routing-Entscheidungen zu treffen. In diesem Fall müssen Sie auch die Quell-IP-Adresse berücksichtigen. Was wir hier tun müssen, ist sicherzustellen, dass jedes ausgehende Paket mit der Quelladresse 10.0.0.8 über ens6 abgeht.
Das Richtlinienrouting in Linux wird normalerweise mit dem ip(8)
Befehl konfiguriert. Damit die Instanz mit der obigen Routingtabelle funktioniert, müssen Sie eine sekundäre Routingtabelle speziell für ens6 erstellen. Die Manipulation sekundärer Tabellen funktioniert genauso wie die Manipulation der „Haupttabelle“, außer dass Sie eine Tabellen-ID angeben. In diesem Fall können wir also eine Route zum lokalen Netzwerk und eine Standardroute über das Gateway zur Tabelle 10000 wie folgt hinzufügen:
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
Und erstellen Sie eine Regel zum Weiterleiten des ausgehenden Datenverkehrs von 10.0.0.8 gemäß dieser Tabelle:
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
Beachten Sie das Vorhandensein von Regel 10000, die zeigt, dass der Datenverkehr von 10.0.0.8 über Tabelle 10000 geleitet wird.
Wir können dies noch einmal bestätigen mit 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
Beachten Sie, dass die Weiterleitung gemäß Tabelle 10000 erfolgt, aber noch wichtiger, dass die Übermittlung über das Gerät ens6 erfolgt!
Amazon Linux richtet solche Routing-Richtlinien automatisch ein, wenn Sie mehrere ENIs an Ihre Instanz angehängt haben. Ich weiß nicht, ob Ubuntu das tut, also müssen Sie diesbezüglich vielleicht ein wenig recherchieren und möglicherweise Ihre eigene Automatisierung für Ihre spezielle Situation implementieren.