Доступен IPv6 для сети Docker

Я управляю небольшой доской, предоставляя некоторые услуги в нашей локальной сети. Когда я пытаюсь понять поддержку ipv6 в докере, я совершенно сбит с толку результатами моих первых тестов.

Моя сеть управляется одним маршрутом с использованием dhcpv6, у каждого клиента есть 2 действительных глобальных адреса ipv6 (также 1 локальный ipv4 ) и защищен межсетевым экраном маршрутизатора (не разрешая запросы из Интернета клиентам).

Arm board работает под управлением ubuntu 16.04, имеет действующий адрес ipv6 с включенными расширениями конфиденциальности.

Все контейнеры докеров используют мостовую сеть по умолчанию без каких-либо настроек.

На хосте докеров

netstat -tulpen|grep docker

показывает

tcp6       0      0 :::8080                 :::*                    LISTEN      0          22490       1559/docker-proxy

Ни одна служба ipv4 не прослушивает.

Внутри этого docker-контейнера тот же запрос netstat дает

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      0          23955       8/nginx         
tcp6       0      0 :::80                   :::*                    LISTEN      0          23956       8/nginx  

Nginx прослушивает ipv6, а также ipv4 - порт 80 доступен для порта 8080 с

docker run (...) -p 8080:80 (...) 

Проверка сети моста

docker network inspect bridge

показывает локальный мост по умолчанию

(...)
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
(...)

"b10cf3750252daf0ba11a59cfcd64c72194adcaacd4b9b5df17fae0f53fc4f00": {
                "Name": "ng",
                "EndpointID": "f42de3590072dec2b0d3fae61fc89aeffcb8e6e716b27f5736272fcc8f94f643",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
(...)

] Теперь к моему вопросу:

Насколько я понимаю, конфигурация моста докеров ipv6 отключена, в контейнере докеров нет только ipv6 - ipv4. Nginx слушает ipv4, а также ipv6 - игнорируя тот факт, что ipv6 недоступен.

Почему служба nginx на хосте, доступном через порт 8080, указана как доступная только через ipv6?

Проверка этого с помощью другого сетевого клиента с помощью

curl -g -6 http://[DOCKER_HOST_IPV6]:8080
curl http://[DOCKER_HOST_IPV4]:8080

показывает, что служба доступна с ipv6, а также с ipv4 - почему netstat не показывает службу как службу ipv4?

Если ipv6 отключен в конфигурации сети моста, как доступна ли служба?

У меня есть другой контейнер, в котором запущен openvpn на udp 1194. Я настроил сервер на использование udp6, проверенный с помощью netstat внутри контейнера. Этот контейнер отображается таким же образом с помощью флага -p, но вообще недоступен на хосте. Как правильно установить мост между этой службой?

0
задан 17 April 2018 в 17:21
1 ответ

Это не контейнер nginx, который прослушивает ipv6 (кстати, сокет tcp6, который вы видите в контейнере, привязан к его fe80 :: и :: 1, и он недоступен извне контейнерный мир). Это процесс docker-proxy, который управляет портом хоста. Когда вы используете "-p 8080: 80", docker-proxy связывает сокет tcp6 на хосте :: 0, прослушивая порт 8080 (и сокеты tcp6 также принимают tcp4).

Таким образом, поддержка ipv6 отключена в докере (по умолчанию) означает, что вашим контейнерам назначен только ipv4, но docker-proxy «переводит» v6 в v4:

(ipv6 world) -> docker host ipv6: 8080 -> [docker-proxy] -> nginx container ipv4: 80

2
ответ дан 4 December 2019 в 13:29

Теги

Похожие вопросы