У меня проблема с докером и подключением изнутри контейнера к внешней сети (например, ping to google.com)
Я настроил новый хост (Ubuntu 18.04) и установил докер. Я создал свой первый контейнер с docker run -it --rm busybox
** Когда я подключаюсь к этому контейнеру, я пытаюсь пинговать
iptables -t nat -A POSTROUTING -s ! -o docker0 -j MASQUERADE
эт вуаля, ping до сетевых хостов работает! Но пинг на внешние IP-адреса (например, 8.8.8.8) не работает изнутри контейнера. С хозяином все хорошо. **tcpdump icmp -i docker0
дал такие результаты:
Внутренняя сеть:
12:37:38.306697 IP 172.17.0.2>ping-target: ICMP echo request, id 2560, seq 12, length 64
12:37:38.309111 IP ping-target>172.17.0.2: ICMP echo reply, id 2560, seq 12, length 64
Внешняя сеть:
12:37:48.590309 IP 172.17.0.2>dns.google: ICMP echo request, id 2816, seq 2, length 64
12:37:49.640603 IP host>172.17.0.2: ICMP host dns.google unreachable, length 92
tcpdump icmp -i br0
не дает никаких результатов при pinging external, но при pinging internal:
12:41:53.672256 IP host>ping-target: ICMP echo request, id 3328, seq 0, length 64
12:41:53.674789 IP ping-target>172.17.0.2: ICMP echo reply, id 3328, seq 0, length 64
Итак, я думаю, что мне что-то здесь не хватает.
См. Ниже вывод правил iptables и конфигурации системы. Дело в том, что у меня аналогичная установка на другом работающем хосте (более старая версия докера). Попытка перенести все правила iptables ничего не меняет. Вывод команд iptables похож на новую установку докера (за исключением одного правила маскарада).
Мне было интересно, почему я все еще вижу сетевые пакеты с адресом 172.17.0.2 при внутреннем пинге.
Выход iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain FORWARD (policy DROP)
num target prot opt source destination
1 DOCKER-USER all -- anywhere anywhere
2 DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
4 DOCKER all -- anywhere anywhere
5 ACCEPT all -- anywhere anywhere
6 ACCEPT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain DOCKER (1 references)
num target prot opt source destination
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
num target prot opt source destination
1 DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
2 RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (1 references)
num target prot opt source destination
1 DROP all -- anywhere anywhere
2 RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
num target prot opt source destination
1 RETURN all -- anywhere anywhere
Выход iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DOCKER all -- anywhere !localhost/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 MASQUERADE all -- 172.17.0.0/16 anywhere
Chain DOCKER (2 references)
num target prot opt source destination
1 RETURN all -- anywhere anywhere
Системные конфигурации:
uname -a:
Linux host 4.15.0-37-generic #40~upboard06-Ubuntu SMP Wed Nov 27 11:29:44 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.4 LTS
Release: 18.04
Codename: bionic
docker:
docker-ce 5:19.03.11~3-0~ubuntu-bionic amd64 Docker: the open-source application container engine
ip route:
default via 172.16.21.254 dev br0
default via 192.168.0.254 dev br0
169.254.111.0/24 dev br0 proto kernel scope link src 169.254.111.111
172.16.21.0/24 dev br0 proto kernel scope link src 172.16.21.150
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.0.0/24 dev br0 proto kernel scope link src 192.168.0.156
(У меня есть мостовое устройство с br0, br0: 1 и br0: 100, использующее разные IP-адреса, где br0 - это DHCP, но br0: 1 и br0: 100 - статические)
Есть идеи, как это исправить?
Жду возможности попробовать ваши идеи :)
BTW: Что нужно иметь в виду при попытке доступа к контейнеру из внешних источников?
Любая помощь приветствуется!
С уважением, Олаф