Docker в AWS – Множественные эластичные сетевые интерфейсы

Вопрос или проблема

У меня есть контейнер Docker, на котором работает веб-сервер, слушающий на порту 80 (jenkins/jenkins:lts)

У меня есть 2 интерфейса на хосте, один из которых должен быть выделен только для контейнера (после того, как это заработает, он будет ограничен только HTTP/HTTPS

Вот конфигурация сетевого интерфейса на экземпляре (это AWS, поэтому это эластичные сетевые интерфейсы):

  • Шлюз: 10.10.20.1
  • eth0 ip 10.10.20.200
  • eth1 ip 10.10.20.111

Конфигурация маршрута, так как это асимметричная маршрутизация:

  • ip route add default via 10.10.20.1 dev eth0 tab 1
  • ip route add default via 10.10.20.1 dev eth1 tab 2
  • ip rule add from 10.10.20.111/32 tab 2 priority 500
  • ip rule add from 10.10.20.200/32 tab 1 priority 600

Вот некоторые выводы после установки вышеприведенных правил маршрута:

root@docker01:/home/ubuntu#ip route show tab 1 
default via 10.10.20.1 dev eth0 

root@docker01:/home/ubuntu# ip route show tab 2 
default via 10.10.20.1 dev eth1 

root@docker01:/home/ubuntu# ip rule 
0:  from all lookup local 
500:    from 10.10.20.111 lookup 2 
600:    from 10.10.20.200 lookup 1 
32766:  from all lookup main 
32767:  from all lookup default

Контейнер Docker слушает на 0.0.0.0:80

При попытке доступа вот результаты:

  • http://10.10.20.200 — РАБОТАЕТ (загружает интерфейс Jenkins)
  • http://10.10.20.111 — НЕ РАБОТАЕТ
  • ping 10.10.20.200 — РАБОТАЕТ
  • ping 10.10.20.111 — РАБОТАЕТ
  • ssh 10.10.20.200 — РАБОТАЕТ
  • ssh 10.10.20.111 — РАБОТАЕТ

Поскольку ping и ssh работают, у меня есть чувство, что это связано с самим Docker.

Вот вывод команды “docker ps” для портов:

0.0.0.0:443->443/tcp, 0.0.0.0:50000->50000/tcp, 0.0.0.0:80->8080/tcp

Что я проверил:

  • Межсетевые экраны/Группы безопасности — оба ENI позволяют порт 80 и ICMP, и все разрешают неограниченный исходящий трафик. Нет правил iptables, кроме тех, что создает Docker автоматически
  • Запуск контейнера с явным IP слушания (например: -p 10.10.20.111:80:80), что не дало результата, однако это, очевидно, убило возможность доступа к нему через другой адрес.
  • netstat показывает, что порт 80 открыт и слушает глобально

Ответ или решение

Docker в AWS: Работа с несколькими Эластичными Сетевыми Интерфейсами (ENI)

В данной статье мы рассмотрим настройку и использование нескольких Эластичных Сетевых Интерфейсов (ENI) в AWS для Docker-контейнера, на примере веб-сервера Jenkins, работающего на порту 80. Рассмотрим обозначенные проблемы, включая маршрутизацию и конфигурацию безопасности.

Конфигурация сетевых интерфейсов

У вас есть два Эластичных Сетевых Интерфейса, настроенных следующим образом:

  • eth0 IP: 10.10.20.200
  • eth1 IP: 10.10.20.111
  • Шлюз (Gateway): 10.10.20.1

Маршрутизация

Ваша маршрутизация настроена на основе правил, которые создают отдельные таблицы маршрутизации для каждого интерфейса. Это позволяет избежать ассиметричной маршрутизации и поддерживать контролируемый доступ к контейнеру.

ip route add default via 10.10.20.1 dev eth0 tab 1
ip route add default via 10.10.20.1 dev eth1 tab 2
ip rule add from 10.10.20.111/32 tab 2 priority 500
ip rule add from 10.10.20.200/32 tab 1 priority 600

Состояние контейнера и доступные порты

Ваш контейнер Docker (Jenkins) настроен для прослушивания на 0.0.0.0:80, с перенаправлением портов:

0.0.0.0:443->443/tcp, 0.0.0.0:50000->50000/tcp, 0.0.0.0:80->8080/tcp

Подключение происходит с использованием разных IP-адресов. Ваша текущая конфигурация позволяет доступ по следующему:

  • 10.10.20.200 — успешно загружает интерфейс Jenkins.
  • 10.10.20.111 — не удается подключиться.

Потенциальные проблемы и их решение

1. Обращение к IP-адресу контейнера

Одной из причин, по которой не удается получить доступ к Jenkins на 10.10.20.111, может быть то, что Docker не обрабатывает запросы, приходящие от этого интерфейса должным образом. Попробуйте явно указать IP при запуске контейнера:

docker run -p 10.10.20.111:80:8080 jenkins/jenkins:lts

Однако помните, что это приведет к потере доступа к интерфейсу через 10.10.20.200.

2. Настройки iptables

Проверьте настройки iptables, так как Docker автоматически создает правила, которые могут блокировать трафик. Используйте команду iptables -L -n -v для проверки. Не забудьте рассмотреть созданные правила, которые могут ограничивать трафик для определённых интерфейсов.

3. Безопасность и группы контроля

Проверьте настройки безопасности AWS для обоих ENI. Убедитесь, что они разрешают inbound-трафик на порт 80 для обоих IP-адресов. Убедитесь, что ваша конфигурация Security Group включает правила для разрешения трафика от всех нужных источников.

Заключение

Для успешного доступа к веб-серверу Jenkins на разных IP-адресах, убедитесь, что все настройки маршрутизации, безопасности и правил iptables правильно настроены. Если у вас остаются проблемы, рассмотрите возможность использования проброса портов в Docker или переписывания правил маршрутизации.

Эта пошаговая инструкция поможет вам правильно настроить Docker-контейнеры в AWS с использованием нескольких Эластичных Сетевых Интерфейсов, что сделает ваш веб-сервис более доступным и защищенным.

Оцените материал
Добавить комментарий

Капча загружается...