Как подключиться к сети хостов из контейнера Docker? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть два физических сервера, подключенных друг к другу в локальной сети. Сервер A запускает Docker с контейнером Ubuntu. Сервер B работает с базой данных MySQL (без каких-либо дополнительных действий).

Теперь мне нужно получить доступ к базе данных MySQL на сервере B из docker-контейнера на сервере A.

Сервер B имеет только ipv6-адрес.

Когда я запускаю ping6 <ipv6_server_b> на хосте А, это работает. Эта же команда из docker-контейнера на хосте A дает мне unknown host.

Я думаю, что мне нужно создать докерский мост к ipv6-подсети Сервера B. Все мои усилия привели к той же самой ошибке unknown host. И я не хочу использовать --network=host.

Общедоступный Интернет подключен по интерфейсу хостов ens16, пока Сервер B находится в локальной зоне безопасности, подключенной по интерфейсу ens17

Подробное описание

Я включил ipv6 в опциях докера, как это:

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ipv6 --fixed-cidr-v6=2001:db8:1::/64 "

1. Я пытался создать мостовую сеть для подсети ipv6 зоны безопасности

docker network create --driver bridge --ipv6 --subnet=fcfc:0:0:1::/64 db-link

2. Это команда, которую я использую для запуска контейнера и назначения сети

docker run -it --network=db-link nicolaka/netshoot

(nicolaka / netshoot содержит много полезных диагностических материалов)

3. Попытка пропинговать адрес Сервера B из контейнера:

ping6 fcfc::1:24fc:25ff:fe25:c903
PING fcfc::1:24fc:25ff:fe25:c903(fcfc::1:24fc:25ff:fe25:c903) 56 data bytes
From fcfc:0:0:1::2: icmp_seq=1 Destination unreachable: Address unreachable
From fcfc:0:0:1::2: icmp_seq=2 Destination unreachable: Address unreachable
From fcfc:0:0:1::2: icmp_seq=3 Destination unreachable: Address unreachable

ping google.com
PING google.com (172.217.18.14) 56(84) bytes of data.
64 bytes from fra02s19-in-f14.1e100.net (172.217.18.14): icmp_seq=1 ttl=56 time=0.787 ms
64 bytes from fra02s19-in-f14.1e100.net (172.217.18.14): icmp_seq=2 ttl=56 time=0.631 ms

4. Это вывод ip -команд в контейнере

ip -6 route show
fcfc:0:0:1::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via fcfc:0:0:1::1 dev eth0 metric 1024 pref medium

ip route show
default via 172.21.0.1 dev eth0
172.21.0.0/16 dev eth0 proto kernel scope link src 172.21.0.2

5. Я пытался создать macvlan сеть

docker network create --driver macvlan --ipv6 --subnet=fcfc:0:0:1::/64 -o parent=ens17 db-link

Теперь я могу пропинговать IP-адрес Сервера B fcfc::1:24fc:25ff:fe25:c903, но, поскольку macvlan ограничивает доступ к отдельному интерфейсу, я не могу подключиться к общедоступному Интернету.

6. Заключение

  • Мостовая сеть создана, но я не получаю соединение / маршрут к отправке ipv6 Сервера B - Почему?
  • Сеть macvlan позволяет контейнеру пропинговать сервер B, но невозможно подключиться к общедоступному Интернету.

1 Ответ

0 голосов
/ 04 апреля 2019

Вместе с провайдером мы нашли решение:

В /etc/docker/daemon.json мы изменили подсеть на:

{
"ipv6": true,
"fixed-cidr-v6": "fefe:1234::/80"
}

А затем запустил следующие iptables-команды:

ip6tables -t nat -I POSTROUTING -s fefe:1234::/80 -o ens16 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -s fefe:1234::/80 -d fcfc::1/32 -o ens17 -j MASQUERADE

Теперь я могу пинговать ipv6-адрес изнутри контейнера, а также с надлежащим доступом к общедоступному Интернету без использования каких-либо пользовательских мостов или сетей Macvlan.

...