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

Ниже приведена конфигурация сетевого плана:

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

0 ответов

Другие вопросы по тегам