Чтобы получить общедоступный IP-адрес, связанный с данным интерфейсом, сначала получите MAC-адрес от интерфейса, а затем получите нужную информацию из службы метаданных экземпляра (IMDS). Итак, в вашем примере выше eth1 имеет
MAC-адрес 06:a6:9a:4a:98:c6
, поэтому вы можете получить общедоступный IPv4-адрес с помощью:
завиток 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 адрес
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
инет 127.0.0.1/8 область хоста lo
valid_lft навсегда
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
альтернативное имя enp0s5
inet 10.0.0.115/24 brd 10.0.0.255 область действия глобальная динамическая ens5
valid_lft 2801 сек. preferred_lft 2801 сек.
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
альтернативное имя enp0s6
inet 10.0.0.8/24 brd 10.0.0.255 область действия глобальная динамическая ens6
valid_lft 2889 сек. selected_lft 2 889 сек.
admin@ip-10-0-0-115:~$ ip ro
по умолчанию через 10.0.0.1 dev ens5
10.0.0.0/24 dev ens5 ссылка на область действия ядра proto src 10.0.0.115
10.0.0.0/24 dev ens6 ссылка на область ядра proto src 10.0.0.8
В данном случае 10.0.0.8 — это адрес, присвоенный ens6. Входящий пакет на этот IP-адрес будет получен через ens6 и обработан должным образом. Но исходящий ответ на этот пакет будет маршрутизироваться в соответствии с приведенной выше таблицей маршрутизации, выходить через ens5 и отбрасываться VPC.
Вы можете проверить это следующим образом:
admin@ip-10-0-0-115:~$ ip ro получить 8.8.8.8 с 10.0.0.8
8.8.8.8 с 10.0.0.8 через 10.0.0.1 dev ens5 uid 1000
тайник
Обратите внимание, что это устройство 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 таблица 10000
admin@ip-10-0-0-115:~$ sudo ip ro добавить по умолчанию через таблицу 10.0.0.1 10000
admin@ip-10-0-0-115:~$ ip ro показать таблицу 10000
по умолчанию через 10.0.0.1 dev ens6
Ссылка на объем 10.0.0.0/24 dev ens6
И создадим правило для маршрутизации исходящего трафика с 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-правило
0: из всех локальных поисковых систем
10000: из 10.0.0.8 поиск 10000
32766: из всех основных поисковых запросов
32767: из всех поисковых запросов по умолчанию
Обратите внимание на наличие правила 10000, показывающего, что трафик с 10.0.0.8 будет маршрутизироваться через таблицу 10000.
Мы можем подтвердить это с помощью IP ро получить
еще раз:
admin@ip-10-0-0-115:~$ ip ro получить 8.8.8.8 с 10.0.0.8
8.8.8.8 с 10.0.0.8 через 10.0.0.1 dev ens6 таблица 10000 uid 1000
тайник
Обратите внимание, что он маршрутизируется в соответствии с таблицей 10000, но, что более важно, он будет отправлен через устройство ens6!
Amazon Linux автоматически устанавливает подобные правила маршрутизации политик, если к вашему инстансу подключено несколько ENI. Я не знаю, работает ли Ubuntu, поэтому вам, возможно, придется провести небольшое исследование в этом направлении и, возможно, внедрить собственную автоматизацию для вашей конкретной ситуации.