- Вопрос или проблема
- Ответ или решение
- Docker в AWS: Работа с несколькими Эластичными Сетевыми Интерфейсами (ENI)
- Конфигурация сетевых интерфейсов
- Маршрутизация
- Состояние контейнера и доступные порты
- Потенциальные проблемы и их решение
- 1. Обращение к IP-адресу контейнера
- 2. Настройки iptables
- 3. Безопасность и группы контроля
- Заключение
Вопрос или проблема
У меня есть контейнер 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 с использованием нескольких Эластичных Сетевых Интерфейсов, что сделает ваш веб-сервис более доступным и защищенным.