У меня есть служба 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
Также требуется включение net.ipv4.conf.all.route_localnet
sysctl вариант.
Потому что на хосте приложение слушает только 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
для устранения неполадок.