Назад | Перейти на главную страницу

Перенаправлять входящие внешние DNS-пакеты во встроенный докер DNS

Я запускаю службу openvpn в контейнере докеров. С этим контейнером связаны некоторые другие контейнеры, включая контейнер gitlab. Я хочу получить доступ к этому контейнеру gitlab, используя его имя контейнера в качестве хоста от клиентов VPN. Мне нравится идея использовать сети докеров для управления тем, какие контейнеры будут доступны через VPN.

Поскольку в докере есть встроенная функция DNS, я думаю, что это должно быть возможно путем пересылки ему пакетов DNS (127.0.0.11:53), поэтому я могу использовать адрес VPN-сервера в качестве сервера имен на клиентах.

По крайней мере, выполняется локально в контейнере OVPN, похоже, есть работающая служба DNS:

bash-4.3# nslookup gitlab 127.0.0.11             
Server:    127.0.0.11
Address 1: 127.0.0.11

Name:      gitlab
Address 1: 172.19.0.2 gitlab_gitlab_1.gitlab_default

Однако мои маршруты iptables не будут работать:

iptables -t nat -I PREROUTING 1 -p udp -s 192.168.255.0/24 --dport 53 -j DNAT --to-destination 127.0.0.11:53
iptables -t nat -I PREROUTING 1 -p tcp -s 192.168.255.0/24 --dport 53 -j DNAT --to-destination 127.0.0.11:53

Где 192.168.255.0/24 - моя сеть VPN.

Это весь список iptables:

bash-4.3# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  192.168.255.0/24     anywhere             tcp dpt:domain to:127.0.0.11:53
DNAT       udp  --  192.168.255.0/24     anywhere             udp dpt:domain to:127.0.0.11:53

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER_OUTPUT  all  --  anywhere             127.0.0.11          

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER_POSTROUTING  all  --  anywhere             127.0.0.11          
MASQUERADE  all  --  192.168.255.0/24     anywhere            

Chain DOCKER_OUTPUT (1 references)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             127.0.0.11           tcp dpt:domain to:127.0.0.11:36429
DNAT       udp  --  anywhere             127.0.0.11           udp dpt:domain to:127.0.0.11:33172

Chain DOCKER_POSTROUTING (1 references)
target     prot opt source               destination         
SNAT       tcp  --  127.0.0.11           anywhere             tcp spt:36429 to::53
SNAT       udp  --  127.0.0.11           anywhere             udp  spt:33172 to::53

Все правила, кроме двух упомянутых выше, создаются докером автоматически. Что я делаю не так?

Порт назначения встроенного DNS докеров изменяется при каждом запуске (to:127.0.0.11:36429). Попробуйте направить входящий трафик на DOCKER_OUTPUT правило:

iptables -t nat -A PREROUTING -p udp --dport 53 -j DOCKER_OUTPUT
iptables -t nat -A PREROUTING -p tcp --dport 53 -j DOCKER_OUTPUT

Чтобы переслать ответ исходному запросчику, добавьте правило маскарада к любому пакету, который был создан за пределами вашего localhost:

iptables -t nat -A POSTROUTING ! -s 127.0.0.1 -p udp --dport 53 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -s 127.0.0.1 -p tcp --dport 53 -j MASQUERADE