NAT via iptables e interface virtual

1

Estou tentando implementar o seguinte cenário: Um VM-host, várias guest VMs , cada um recebe seu endereço IP próprio (e domínio).

Nosso servidor tem apenas uma interface física, então o uso pretendido é adicionar interfaces virtuais em eth0 . Para complicar nossa situação, o provedor usa porta-segurança em seus switches, então não posso executar as interfaces convidadas no modo em ponte, porque o switch detecta um endereço MAC "falsificado" e mata a interface (permanentemente, forçando-me a chamar o apoio, o que, tenho certeza, vai deixá-los um pouco irritados pela terceira vez;)).

Meu primeiro palpite foi usar o iptables e o NAT para encaminhar todos os pacotes de uma interface virtual para outra, mas o iptables não parece gostar de interfaces virtuais (pelo menos eu não consigo fazer isso funcionar corretamente). Então, meu segundo palpite é usar o IP de origem dos pacotes para a interface pública.

Vamos supor que o libvirt crie uma rede virbr0 com 192.168.100.0/24 e o convidado use 192.168.100.2 como endereço IP.

Isso é o que eu tentei usar: iptables -t nat -I PREROUTING --src public_ip_on_eth0:0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:80

Isso não me dá os resultados pretendidos (acessar o servidor expira).

Existe uma maneira de fazer o que estou tentando fazer, ou mesmo rotear todo o tráfego para um determinado IP em uma interface virtual para o dispositivo da VM?

    
por Alex 29.05.2012 / 12:10

3 respostas

1

Com as respostas de Christophe Drevet e DukeLion Consegui fazer funcionar a configuração desejada.

Vou me responder explicando minha solução. Por favor, sinta-se livre para comentar sobre isso, como eu não fiz coisas de rede em poucos anos e pode muito bem ter perdido algo muito importante aqui.

A configuração abaixo funciona perfeitamente e permite adicionar mais VMs, cada uma usando um endereço IP público diferente (os IPs de 172.16.0.0 usados aqui são "públicos").

Interfaces de rede

VM-Host, eth0        -> 172.16.0.1
VM-Host, eth0:0      -> 172.16.0.2
VM-Host, br0         -> 192.168.10.1
Virt. machine, eth0  -> 192.168.10.2 (added to br0)
                        gateway: 172.16.0.2

iptables

Acompanhamento de conexão:

iptables -I FORWARD -m conntrack -d 192.168.10.0/24 --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

DNAT para o servidor da Web em nossa VM:

iptables -t nat -A PREROUTING -p tcp -d 172.16.0.2 --dport 80 -j DNAT --to-destination 192.168.10.2:80

SNAT para nossa VM alcançar o mundo externo:

iptables -t nat -I POSTROUTING -j SNAT --src 192.168.10.2 --to-source 172.16.0.2

Bloqueia todas as outras portas na VM:

iptables -A INPUT -d 172.16.0.2 -j REJECT --reject-with icmp-port-unreachable

    
por 03.06.2012 / 22:08
1

para usar o DNAT assim, você precisa que seus sistemas convidados tenham o host VM como gateway padrão.

    
por 29.05.2012 / 12:19
1

Eu tinha uma configuração de rede semelhante e usei essa configuração:

localnetwork (192.168.0.0/24) <-> host eth0 (192.168.0.10)

host tun0 (192.168.1.150) <-> vm1 eth0 (192.168.1.200) gw 192.168.1.150
                          <-> vm2 eth0 (192.168.1.201) gw 192.168.1.150

Todas as minhas VMs podem pingar umas nas outras e podem acessar a rede externa com esta regra de iptable:

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.1.0/24       0.0.0.0/0            to:192.168.0.10

A rede externa pode acessar serviços em minhas VMs com essas regras:

Chain PREROUTING (policy ACCEPT)
target  prot opt source     destination         
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:22200 to:192.168.1.200:22
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:22201 to:192.168.1.201:22
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:3389  to:192.168.1.202:3389
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:443   to:192.168.1.206:443
DNAT    tcp  --  0.0.0.0/0  192.168.0.10  tcp dpt:80    to:192.168.1.206:80

Eu configurei a interface tun0 com estas linhas no debian no arquivo / etc / network / interfaces:

auto tun0
iface tun0 inet static
  address 192.168.1.150
  netmask 255.255.255.0
  pre-up tunctl -g uml-net -t tun0
  post-down tunctl -d tun0
    
por 30.05.2012 / 12:33