Назад | Перейти на главную страницу

Docker - невозможно получить доступ к Интернету из контейнера, когда у хоста есть вторичный статический IP-адрес

Задний план

Экземпляр EC2 (Ubuntu 18.04 LTS), который я использую для запуска контейнеров Docker, имеет основной IP-адрес (172.31.37.95), назначенный через DHCP. Изначально это единственный адрес, присвоенный интерфейсу. Я могу получить доступ к услугам, например веб-сервер, который запускается в контейнере, а также имеет доступ в Интернет из контейнера. Это ожидаемое поведение.

Проблема

Затем я назначаю интерфейсу дополнительный статический IP-адрес (172.31.32.100) (используя netplan). Я могу войти в экземпляр с других машин в той же подсети, используя статический IP-адрес. Однако я обнаружил, что больше не могу получить доступ к Интернету и внешним хостам из контейнера.

Вопрос

Как мне настроить сеть, когда используется вторичный статический IP-адрес, чтобы я мог:

  1. доступ в Интернет из контейнера

  2. получить доступ к службам, работающим в контейнере, с других хостов в подсети через 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