I want to redirect all traffic generated inside a docker container itself over proxy, to not exposure dock machines public IP.
Se isso é tudo que você quer, não é necessário NAT entre as duas instâncias do docker.
Você precisa ativar o encaminhamento na instância proxy (por exemplo, via sysctl).
Se o IP público de proxy for visible dentro de proxy , será necessário fazer SNAT com esse IP público dentro de proxy (não em dock ). Isso também é chamado de MASQUERADE. É uma configuração padrão, google de "masquerade".
Se o IP público de proxy for não visível dentro de proxy (ou seja, listado quando você faz ip addr ), porque o host de proxy (ou até mesmo algum outro host mais acima) faz o NAT, então você deve evitar o NAT duplo e fazer com que dock apareça como outro container para o host. Os detalhes dependem de como a rede está configurada no host (o que você não disse), mas basicamente o final do túnel em dock terá que ter um IP na mesma sub-rede que os contêineres no host proxy . / p>
Um túnel ipip não é criptografado; você não deve usar este túnel a menos que o transporte esteja totalmente dentro de uma rede confiável (o que provavelmente não é o caso, porque você parece querer endereços IP públicos diferentes). Portanto, use OpenVPN ou fácil de configurar alternativas como tinc . Libreswan não é tão fácil de configurar.
Editar
Passo-a-passo:
1) Verifique se o túnel funciona. Em proxy , faça ping 192.168.10.2 . Em dock , faça ping 192.168.10.1 . Depure com tcpdump em todas as interfaces de rede que você tem acesso. Se o ipip-tunnel não funcionar, use um túnel diferente e faça-o funcionar.
2) Remova todas as regras iptables em dock . Definir a rota padrão através do túnel. Teste com ip route get 8.8.8.8 se a rota funcionar.
3) Supondo que eth0 on proxy tenha o IP público, exclua todas as regras iptables , do:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o tun10 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o eth0 -i tun10 -j ACCEPT
Isso diz "encaminhar pacotes, mascarar todos os pacotes encaminhados saindo em eth0 dando a eles o endereço IP público em eth0 como endereço de origem e conexão rastreá-los. Pacotes de tun10 sempre podem ser encaminhados para eth0 , os pacotes recebidos em eth0 somente serão encaminhados para tun10 se a conexão foi estabelecida por dock . "
Teste fazendo ping 8.8.8.8 em dock , enquanto executa tcpdump em tun10 e eth0 on proxy . Você deve ver os pacotes encaminhados e a fonte sendo reescrita.
4) Quando tudo estiver funcionando, torne-o permanente: Edite /etc/sysctl.conf ou um arquivo em /etc/sysctl.d para ter net.ipv4.ip_forward = 1 . Use um script de inicialização para adicionar as regras iptables ou use qualquer pacote que sua distribuição forneça para salvar as regras.