NAT e IPTables interfaces virtuais

0

Eu tenho 2 VMs executando o CentOS 7 com as seguintes ifconfigconfigurações:

VM1: ifconfig
eth0: public ip
eth0:0: LAN IP 172.22.xx.x1

VM2: ifconfig
eth0: no public ip
eth0:0: LAN IP 172.22.xx.x2

E eu quero VM2poder acessar a internet. Alguma idéia de como conseguir isso?

Eu tentei todas as combinações de iptables POSTROUTING, PREROUTING, FORWARD, DNAT, SNETe routevocê pode pensar sem sucesso. Eu devo estar fazendo algo errado.

Alguém tem um exemplo simples de como conseguir isso?

Para testar VM2o acesso externo, estou executando ping www.google.com(e IP) - mas obtendo host desconhecido e 100% de perda de pacotes, respectivamente.

EDIT - Mais informações

Correndo tcpdump -nni eth0:0 icmpem VM1e ping 8.8.8.8sobre VM2os rendimentos os seguintes resultados:

09:28:05.957841 IP VM2 private ip > 8.8.8.8: ICMP echo request, id 13950, seq 6, length 64
09:28:05.957900 IP VM1 public ip > 8.8.8.8: ICMP echo request, id 13950, seq 6, length 64
09:28:05.959157 IP 8.8.8.8 > VM1 public ip: ICMP echo reply, id 13950, seq 6, length 64
09:28:05.959172 IP 8.8.8.8 > VM2 private ip: ICMP echo reply, id 13950, seq 6, length 64

Mas VM2não recebe os pacotes. Aqui está o meu iptablesscript para VM1:

echo 1 > /proc/sys/net/ipv4/ip_forward

# Flush tables
iptables -F
iptables -t nat -F

iptables -A FORWARD -i eth0:0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables-save > /etc/sysconfig/iptables
service iptables restart

E routepara VM2:

route add default gw <VM1 private ip>

EDIT 2 - Mais informações

VM2 route:

[travis@VM2 ~]$ sudo route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.22.20.195   0.0.0.0         UG    0      0        0 eth0
172.22.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

E VM1 iptables:

[travis@VM1 ~]$ sudo iptables -vnL
Chain INPUT (policy ACCEPT 3039 packets, 651K bytes)
 pkts bytes target     prot opt in     out     source               destination        

Chain FORWARD (policy ACCEPT 88 packets, 6598 bytes)
 pkts bytes target     prot opt in     out     source               destination        
    0     0 ACCEPT     all  --  eth0:0 eth0    0.0.0.0/0            0.0.0.0/0          

Chain OUTPUT (policy ACCEPT 2602 packets, 304K bytes)
 pkts bytes target     prot opt in     out     source               destination        

[travis@VM1 ~]$ sudo iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 114 packets, 9000 bytes)
 pkts bytes target     prot opt in     out     source               destination        

Chain INPUT (policy ACCEPT 81 packets, 6692 bytes)
 pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy ACCEPT 167 packets, 10845 bytes)
 pkts bytes target     prot opt in     out     source               destination        

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination        
  200 13153 MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0 
Travis Liew
fonte
Pode ser que o problema não possa ser resolvido com o iptables; talvez seja necessário configurar a ponte. Como é o seu anfitrião VM configurado (e você é capaz de ping-lo a partir dos clientes VM)
davidgo
Obrigado pela sua resposta. Todas as VMs ficam na mesma LAN 172.22.xx.xxe podem executar ping uma na outra.
Travis Liew
Se você faz um ping contínuo do seu cliente e tcpdump em cada uma das interfaces virtuais e reais no host da VM, que tráfego você vê? O gateway está definido corretamente nos clientes da VM?
Davidgo
Gateway está definido como route add default gw host. tcpdump -nni eth0:0 icmpon VM Hoste ping host(host é hostname) on VM clientmostra pings bem-sucedidos tcpdump. Fazer um ping google.comfrom VM clientnão produz nada e a ping 8.8.8.8aparece VM Host tcpdump, mas 100% de perda de pacotes ativada VM Client. Isso indica que as icmprespostas não estão sendo encaminhadas de volta VM Client? Eu ip_forwardconfigurei para 1. Veja OP para mais detalhes ..
Travis Liew
O que você quer dizer com "host" quando você diz route add host gw padrão. Realmente, ao trabalhar com uma tabela de roteamento, você deve fazer tudo por endereço IP. Você pode fornecer a saída de 'route -n' e confirmar o endereço IP do seu servidor VM. Além disso, vamos verificar as regras do iptables - qual é o resultado de 'iptables -t nat -vnL'. Olhando para outras coisas, por que você tem eth0: 0 - isso parece não fazer sentido na configuração padrão (e um comando tcpdump deve ser executado na interface subjacente, não na interface virtual, por exemplo, tcpdump -n eth0) ... cont.
davidgo