Задний план
Экземпляр EC2 (Ubuntu 18.04 LTS), который я использую для запуска контейнеров Docker, имеет основной IP-адрес (172.31.37.95), назначенный через DHCP. Изначально это единственный адрес, присвоенный интерфейсу. Я могу получить доступ к услугам, например веб-сервер, который запускается в контейнере, а также имеет доступ в Интернет из контейнера. Это ожидаемое поведение.
Проблема
Затем я назначаю интерфейсу дополнительный статический IP-адрес (172.31.32.100) (используя netplan). Я могу войти в экземпляр с других машин в той же подсети, используя статический IP-адрес. Однако я обнаружил, что больше не могу получить доступ к Интернету и внешним хостам из контейнера.
Вопрос
Как мне настроить сеть, когда используется вторичный статический IP-адрес, чтобы я мог:
доступ в Интернет из контейнера
получить доступ к службам, работающим в контейнере, с других хостов в подсети через IP-адрес 172.31.32.100?
Мои знания в области сетей являются лишь базовыми, но я считаю, что проблема заключается в неправильной маршрутизации. Ниже приведена соответствующая информация, которая может помочь диагностировать причину. Я надеюсь, что эксперты помогут установить причину и предложить решение.
ip addr
показывает следующее:
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: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 06:79:8b:f2:6d:12 brd ff:ff:ff:ff:ff:ff
inet 172.31.32.100/20 brd 172.31.47.255 scope global ens5
valid_lft forever preferred_lft forever
inet 172.31.37.95/20 brd 172.31.47.255 scope global secondary dynamic ens5
valid_lft 3504sec preferred_lft 3504sec
inet6 fe80::479:8bff:fef2:6d12/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:dc:1a:e5:48 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:dcff:fe1a:e548/64 scope link
valid_lft forever preferred_lft forever
25: vethb33a409@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 5a:17:d4:6a:66:36 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::5817:d4ff:fe6a:6636/64 scope link
valid_lft forever preferred_lft forever
Ниже представлена конфигурация netplan:
network:
version: 2
ethernets:
ens5:
dhcp4: true
match:
macaddress: 06:79:8b:f2:6d:12
set-name: ens5
# Add secondary static IP
addresses:
- 172.31.32.100/20
Также вывод ip route
default via 172.31.32.1 dev ens5 proto dhcp src 172.31.37.95 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.31.32.0/20 dev ens5 proto kernel scope link src 172.31.32.100
172.31.32.1 dev ens5 proto dhcp scope link src 172.31.37.95 metric 100
Из iptables-save
# Generated by iptables-save v1.6.1 on Mon Sep 23 09:23:15 2019
*nat
:PREROUTING ACCEPT [2038:110370]
:INPUT ACCEPT [1955:94940]
:OUTPUT ACCEPT [2082:285254]
:POSTROUTING ACCEPT [2082:285254]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
COMMIT
# Completed on Mon Sep 23 09:23:15 2019
# Generated by iptables-save v1.6.1 on Mon Sep 23 09:23:15 2019
*filter
:INPUT ACCEPT [438553:2493249710]
:FORWARD DROP [14:8064]
:OUTPUT ACCEPT [309458:24051106]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Mon Sep 23 09:23:15 2019