У меня есть служба A, запущенная на хосте и привязанная к порту 127.0.0.1:7800.
У меня есть служба B, запущенная внутри моего контейнера LXC, которая хочет подключиться к службе A через 127.0.0.1:7800, но в настоящее время не может.
Как мне настроить контейнер или iptables для перенаправления трафика?
На стороне контейнера вы должны добавить эти правила:
iptables -t nat -A OUTPUT \
-d 127.0.0.1 \
-p tcp --dport 7800 \
-j DNAT --to-address <HOST.EXT.IP>
iptables -t nat -A POSTROUTING \
-o <LXC.HOST.IFACE> \
-d <HOST.EXT.IP> -s 127.0.0.1 \
-p tcp --dport 7800 \
-j MASQUERADE
Также требуется включить параметр sysctl net.ipv4.conf.all.route_localnet
.
Поскольку на хосте приложение прослушивает только адрес 127.0.0.1
, это означает, что по умолчанию не может принимать внешние подключения. Но вы можете использовать цели DNAT / REDIRECT
в качестве обходного пути.
iptables -t nat -A PREROUTING \
-i <HOST.LXC.IFACE> \
-d <HOST.LXC.IP> -s <LXC.IP> \
-p tcp --dport 7800 \
-j DNAT --to-address 127.0.0.1:7800
Для этого также требуется включенная опция route_localnet
.
Используйте iptables-save -c
(проверьте счетчики правил) и tcpdump
для устранения неполадок.