Как запретить Docker исходному трафику NAT c на Synology NAS - PullRequest
0 голосов
/ 06 мая 2020

На 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 ни в одной из систем, это конфигурации по умолчанию.

Кто-нибудь сталкивался с этим раньше? Есть ли быстрый способ переключить это?

1 Ответ

0 голосов
/ 30 мая 2020

Я сам столкнулся с этой проблемой при использовании Pi-hole (описанного здесь ), и это правило iptables, похоже, исправляет это:

sudo iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

Имейте в виду, что это не навсегда , поэтому, если вы перезагрузите NAS, вам придется применить его снова.

...