На Synology NAS, похоже, настройка по умолчанию для docker / iptables - это источник NAT-трафика c, идущего к контейнеру на IP-адрес шлюза. Это принципиально вызывает проблемы, когда контейнер должен видеть правильный / реальный IP-адрес клиента. Я не вижу этой проблемы, например, при работе в системе ubuntu.
Позвольте мне провести вас через то, что я вижу. На Synology NAS я запускаю простой контейнер nginx:
docker run --rm -ti -p 80:80 nginx
(у меня отключил Synology NAS от использования порта 80 )
I Я скручиваю со своего ноутбука, и я вижу следующую строку журнала:
172.17.0.1 - - [05/May/2020:17:02:44 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.1" "-"
Хм ... IP-адрес клиента (172.17.0.1
) - это docker0
интерфейс на NAS.
user@synology:~$ ifconfig docker0
docker0 Link encap:Ethernet HWaddr 02:42:B5:BE:C5:51
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
<snip>
Когда я впервые увидел это, я был весьма сбит с толку, потому что не припомнил, чтобы сеть docker работала таким образом. Итак, я запустил свою виртуальную машину ubuntu и попробовал тот же тест (та же команда docker run из ранее).
Строка журнала из моего тестового окна curl:
172.16.207.1 - - [05/May/2020:17:12:04 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.64.1" "-"
В этом случае docker0
IP не был источником трафика c, как его видит контейнер.
user@ubuntu-vm:~# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
<snip>
Итак, похоже, что настройка сети docker для Synolgy NAS отличается от более стандартного развертывания Ubuntu. Хорошо, аккуратно. Итак, как это исправить?
Вот где я борюсь. Ясно, что с iptables что-то происходит. Выполнение одной и той же команды iptables -t nat -L -n
в обеих системах дает совершенно разные результаты.
user@synology:~$ iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DEFAULT_OUTPUT all -- 0.0.0.0/0 0.0.0.0/0
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
DEFAULT_POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0
Chain DEFAULT_OUTPUT (1 references)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain DEFAULT_POSTROUTING (1 references)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:80
Chain DOCKER (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
user@ubuntu-vm:~# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE all -- 172.18.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:80
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
Я не совсем понимаю, как работают эти цепочки или почему они разные для разных систем. Я не менял никаких настроек уровня docker ни в одной из систем, это конфигурации по умолчанию.
Кто-нибудь сталкивался с этим раньше? Есть ли быстрый способ переключить это?