Конфигурация сетевого адаптера AWS

Конфигурация сетевого адаптера AWS

Я пытаюсь настроить экземпляр EC2 для определенного варианта использования. В этом случае мне понадобятся 2 ENI с публично открытым IP-адресом. (Оба должны быть пингуемы)

На данный момент я выполнил следующие шаги:

  • Подключено 2 сетевых интерфейса из одной подсети
  • Запустить экземпляр
  • Создано 2 эластичных IP-адреса, прикрепленных к каждой карте ENI экземпляра.

Я вижу следующий результат в разделе сетевых интерфейсов экземпляра EC2.

PublicIP

Но я не смог выполнить пинг 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, поэтому вам, возможно, придется провести небольшое исследование на этом фронте и, возможно, реализовать собственную автоматизацию для вашей конкретной ситуации.

Связанный контент