Atualmente, temos alguns servidores que usam a mesma LAN:
Host1: eth0 10.0.0.1/24
Host2: eth0 10.0.0.2/24
Host3: eth0 10.0.0.3/24
Gateway: 10.0.0.254
Queremos executar algumas VMs (VirtualBox) nesses servidores. Podemos configurá-los para fazer a ponte sobre a eth0 do host, mas não podemos usar endereços da faixa 10.0.0.0/24, pois eles podem ser alocados no futuro.
Então, achamos que usaríamos uma sub-rede diferente:
Host1VM: eth0 192.168.0.1/24 (bridge to host eth0)
Host2VM: eth0 192.168.0.2/24 (bridge to host eth0)
Host3VM: eth0 192.168.0.3/24 (bridge to host eth0)
Tudo bem e todas as VMs podem se comunicar umas com as outras, pois estão na mesma sub-rede que usa a mesma interface física.
O problema que enfrentamos é que precisamos dar acesso a essas VMs à Internet através do gateway 10.0.0.254. Então nós imaginamos porque não escolher um dos hosts e usá-lo como um roteador / NAT?
Host1: eth0 10.0.0.1/24, eth0:0 192.168.0.254/24
Agora podemos fornecer às VMs um gateway de 192.168.0.254. O problema que vemos então é que o Host1 não parece corretamente ao NAT.
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 10.0.0.1
Eu achei que funcionaria, e nós vemos pacotes correspondentes. Se uma VM pinga a internet, vemos o pacote ICMP entrar no Host1 (já que é o roteador) e, em seguida, o host reenvia o ICMP porque é NAT, o host da Internet responde ao host - mas, em seguida, morre lá. Eu esperava que o host enviasse o pacote de volta para a VM, mas isso não acontece.
O que estou perdendo ou essa configuração simplesmente não é possível?
Editar : Só para esclarecer, não temos regras DENY dentro do iptables, tudo é o padrão ACCEPT. Também habilitamos o encaminhamento de IP.
Update1 - iptables
Ignore o virbr0 - que não está relacionado a VMs do VirtualBox
# Completed on Fri Sep 20 16:50:45 2013
# Generated by iptables-save v1.4.12 on Fri Sep 20 16:50:45 2013
*nat
:PREROUTING ACCEPT [171383:10358740]
:INPUT ACCEPT [1923:115365]
:OUTPUT ACCEPT [192:21531]
:POSTROUTING ACCEPT [169544:10254463]
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 10.0.0.1
COMMIT
# Completed on Fri Sep 20 16:50:45 2013
# Generated by iptables-save v1.4.12 on Fri Sep 20 16:50:45 2013
*filter
:INPUT ACCEPT [96628707:25146145432]
:FORWARD ACCEPT [195035595:22524430122]
:OUTPUT ACCEPT [44035412:304951330498]
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Fri Sep 20 16:50:45 2013
# Generated by iptables-save v1.4.12 on Fri Sep 20 16:50:45 2013
*mangle
:PREROUTING ACCEPT [291641356:47665886851]
:INPUT ACCEPT [96628707:25146145432]
:FORWARD ACCEPT [195035595:22524430122]
:OUTPUT ACCEPT [44035838:304951365412]
:POSTROUTING ACCEPT [239078922:327477732680]
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Fri Sep 20 16:50:45 2013
Atualização 2 - tcpdump
16:58:37.189758 IP 192.168.0.2 > 74.125.128.106: ICMP echo request, id 1, seq 2, length 40
16:58:37.189805 IP 10.0.0.1 > 74.125.128.106: ICMP echo request, id 1, seq 2, length 40
16:58:37.194607 IP 74.125.128.106 > 10.0.0.1: ICMP echo reply, id 1, seq 2, length 40
(no final reply back to the VM)