Я запускаю службу 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