Tudo o que você precisa fazer é NAT o tráfego proveniente do IP privado do contêiner para a interface do host para o IP público do contêiner ($ publicIP2):
iptables -t nat -A POSTROUTING -s 10.204.119.5/32 -j SNAT --to-source $publicIP2
eu configurei o lxd no meu sistema host com a ponte lxdbr0. Agora meus contêineres obtêm seus endereços IP via dhcp de lxdbr0 (no intervalo de 10.204.x.x).
Também tenho 2 endereços IP públicos. Um para o host (x.x.x.x) e outro para o contêiner (b.b.b.b). O contêiner deve usar o segundo ip público para o tráfego de saída e de entrada. Ambos os endereços IP públicos vão para o sistema host, então meu sistema host recebe todo o tráfego em primeiro lugar.
Eu já realizei para configurar um preroute (no host) do meu ip público para o ip privado para que todo o tráfego de entrada para o ip público vá para um container específico.
MAS eu não consigo descobrir como encaminhar o tráfego de saída do contêiner para o ip público. Eu tentei configurar um preroute como eu fiz com o tráfego de entrada, mas nenhum resultado.
iptables -L mostra
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:domain /* managed by lxd-bridge */
ACCEPT udp -- anywhere anywhere udp dpt:domain /* managed by lxd-bridge */
ACCEPT tcp -- anywhere anywhere tcp dpt:bootps /* managed by lxd-bridge */
ACCEPT udp -- anywhere anywhere udp dpt:bootps /* managed by lxd-bridge */
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere /* managed by lxd-bridge */
ACCEPT all -- anywhere anywhere /* managed by lxd-bridge */
iptables -t nat -L mostra
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT all -- anywhere ip-b.ip-b-b-b.eu to:10.204.119.5
DNAT all -- anywhere 10.204.119.5 to:b.b.b.b
b.b.b.b --> second public ip (for the container)
10.204.119.5 --> containers (private) ip in the lxdbr0 bridge
O tráfego de entrada no ip público é roteado para o contêiner, mas o tráfego de saída do contêiner não.
Também defino LXD_IPV4_NAT="false"
na configuração da ponte lxd, pois isso permitiu que os contêineres usassem o endereço IP de meus hosts para o tráfego de saída (o que eu não quero)
EDIT # 1: rota -n mostra
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 x.x.x.1 0.0.0.0 UG 0 0 0 ens3
10.204.119.0 0.0.0.0 255.255.255.0 U 0 0 0 lxdbr0
x.x.x.1 0.0.0.0 255.255.255.255 UH 0 0 0 ens3
x.x.x.1 --> gateway of my hosts ip (x.x.x.x)
EDIT # 2: Exemplo
- pIP1 = public ip 1, should be used for host
- pIP2 = " " 2, should be used for the container
the container runs on the host system.
container = 10.204.119.5 (device lxdbr0)
host = pIP1 (device ens3) and pIP2 (device ens3:0)
Outgoing packets from the container come with the source ip 10.204.119.5.
Now these packets should change the source ip to pIP2 and then sent to the
gateway (so it appears to the router, that the packet from the container
comes from the pIP2)
Tags networking iptables lxc lxd bridge