Я пытаюсь настроить экземпляр EC2 для определенного варианта использования. В этом случае мне понадобятся 2 ENI с публично открытым IP-адресом. (Оба должны быть пингуемы)
На данный момент я выполнил следующие шаги:
- Подключено 2 сетевых интерфейса из одной подсети
- Запустить экземпляр
- Создано 2 эластичных IP-адреса, прикрепленных к каждой карте ENI экземпляра.
Я вижу следующий результат в разделе сетевых интерфейсов экземпляра EC2.
Но я не смог выполнить пинг 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-адрес стал видимым/пингуемым?
- Как мне узнать оба моих эластичных IP-адреса на сервере?
решение1
Чтобы получить публичный IP-адрес, связанный с данным интерфейсом, сначала получите MAC-адрес из интерфейса, затем извлеките искомую информацию из Instance Metadata Service (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
Что касается вашей проблемы с подключением, в качестве первого шага дважды проверьте маршрутизацию VPC, ACL и конфигурацию группы безопасности, связанную с каждым из ваших ENI. Эти данные легко неправильно настроить, и это может привести к потере трафика, если вы что-то упустите. Сначала проверьте эти данные, а затем вернитесь и прочитайте остальную часть этого поста. Есть еще одна более тонкая проблема, которая возникает, особенно когда у вас есть несколько ENI, связанных с экземпляром, и это может быть вашей проблемой.
AWS VPC реализует строгую защиту от спуфинга. Это хорошо, так как защищает AWS и ее клиентов от участия в различных формах сетевых атак в случае, если экземпляр по какой-либо причине будет скомпрометирован. Однако это необходимо учитывать при подключении нескольких ENI к экземплярам.
Проблема в том, что базовое поведение маршрутизации определяется толькоместо назначенияисходящего пакета. Это означает, что ответ на входящий пакет не может быть передан через тот же интерфейс, на котором был получен исходный пакет. Но для VPC это считается «поддельным» пакетом, поскольку исходный адрес в ответном пакете не совпадает ни с одним из частных IP-адресов, связанных с ENI.
Рассмотрим следующую конфигурацию интерфейса и таблицу маршрутизации:
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
Обратите внимание, что устройство — ens5, хотя 10.0.0.8 назначено ens6! VPC отбросит этот трафик!
Чтобы гарантировать доставку ваших пакетов через VPC, вам необходимо реализоватьмаршрутизация политики. В широком смысле, маршрутизация политик относится к ситуации, когда ваша система использует дополнительную информацию, выходящую за рамки только пункта назначения, для принятия решений о маршрутизации. В этом случае вам также необходимо учитывать исходный IP-адрес. Здесь нам нужно убедиться, что любой исходящий пакет с исходным адресом 10.0.0.8 уходит через ens6.
Маршрутизация политик в Linux обычно настраивается с помощью ip(8)
команды. Чтобы экземпляр с таблицей маршрутизации выше заработал, вам нужно создать вторичную таблицу маршрутизации, специфичную для ens6. Манипулирование вторичными таблицами работает так же, как и манипулирование «главной» таблицей, за исключением того, что вы указываете идентификатор таблицы. Таким образом, в этом случае мы можем добавить маршрут к локальной сети и маршрут по умолчанию через шлюз к таблице 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, поэтому вам, возможно, придется провести небольшое исследование на этом фронте и, возможно, реализовать собственную автоматизацию для вашей конкретной ситуации.