KVM Guest com rede NAT + Bridged

4

Atualmente, tenho alguns convidados do KVM em um servidor dedicado com rede em ponte (isso funciona) e posso executar o ping com êxito dos ips externos que eu atribuo por meio do ifconfig (no guest).

No entanto, devido ao fato de eu ter apenas 5 endereços IP ipv4 públicos, gostaria de encaminhar serviços de encaminhamento da seguinte forma:

hostip: port - > kvm_guest: port

UPDATE

Descobri que o KVM vem com uma interface NAT "padrão", então, adicionamos o NIC virtual à configuração do Guest virsh e o configuramos no Guest, ele tem o endereço IP:

192.168.122.112

Eu posso pingar com sucesso 192.168.122.112 e acessar todas as portas em 192.168.122.112 do KVM Host, então tentei encaminhar como assim:

iptables -t nat -I PREROUTING -p tcp --dport 5222 -j DNAT --to-destination 192.168.122.112:2521
iptables -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

telnet KVM_HOST_IP 5222 apenas trava "tentando"

telnet 192.168.122.112 2521 funciona

[root@node1 ~]# tcpdump port 5222
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
23:43:47.216181 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445777813 ecr 0,sackOK,eol], length 0
23:43:48.315747 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445778912 ecr 0,sackOK,eol], length 0
23:43:49.415606 IP 1.152.245.247.51183 > null.xmpp-client: Flags [S], seq 1183303931, win 65535, options [mss 1400,nop,wscale 3,nop,nop,TS val 445780010 ecr 0,sackOK,eol], length 0

7 pacotes recebidos pelo filtro 0 pacotes descartados pelo kernel

[root@node1 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.122.0/24    state NEW,RELATED,ESTABLISHED 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   


[root@node1 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 976 packets, 57008 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   11   640 ACCEPT     all  --  *      *       0.0.0.0/0            192.168.122.0/24    state NEW,RELATED,ESTABLISHED 

Chain OUTPUT (policy ACCEPT 673 packets, 40901 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@node1 ~]# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 549 packets, 34067 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    64 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5222 to:192.168.122.112:2521 
    3   192 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5222 to:192.168.122.112:2521 
    1    64 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5225 to:192.168.122.112:2521 
    1    64 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:5222 to:192.168.122.112:2521 

Chain POSTROUTING (policy ACCEPT 45 packets, 3169 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

Toda ajuda é apreciada.

Obrigado.

    
por Daniel 25.10.2012 / 09:09

2 respostas

1

se você executar o kvm desta maneira:

kvm -drive... -net nic -net tap .... 

você se tornará uma nova interface (no host raiz) chamada tapX (onde X é um número). Esta interface é normalmente configurada por padrão através de um script localizado em algum lugar em /etc ( /etc/kvm/kvm-ifup , /etc/qemu-ifup ou mais) você poderia alterá-las com: kvm -drive... -net nic -net tap,script=mynatbrigescript ...

A partir daí, essa interface precisa ser configurada em cada ponto:

ifconfig tapX 192.168.124.1/30

e no sistema operacional do cliente:

ifconfig eth0 192.168.124.2/30

então se você apertar (no host raiz), você verá uma nova rede local (supondo que seu ip público é 1.2.3.4):

ip r s
1.2.3.4 dev eth0 ...
192.168.124.0/30 dev tapX  proto kernel  scope link src 192.168.124.1

De lá, você deve poder fazer o ping para 192.168.124.2 do host raiz. Você poderia então DNAT seus pacotes de entrada com:

iptables -t nat -A PREROUTING -i eth0 -d 192.168.122.31 --dport 5222 -j DNAT --to-destination 192.168.124.2:2521

e SNAT os pacotes de resposta na outra direção:

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.124.2 -j SNAT --to-source 192.168.122.31

agora se para o nó raiz, este trabalho:

telnet 192.168.124.2 2521

Depois do seu domínio local, isso deve ser o mesmo:

telnet 1.2.3.4 5222

Em tudo, seu host raiz tem que encaminhar pacotes ip, isso pode ser verificado por:

cat /proc/sys/net/ipv4/ip_forward 
1

ou

sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1

Isso pode ser definido por:

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

ou

sysctl net.ipv4.conf.all.forwarding=1
    
por 30.10.2012 / 13:57
0

Primeiro, sua regra DNAT deve ser atualizada para incluir o IP de destino do host KVM. Assim, até mesmo o tráfego da sua máquina virtual para a Internet (na porta 5222) seria DNATted.

iptables -t nat -F PREROUTING
iptables -t nat -A PREROUTING 1 -d KVM_HOST_IP -p tcp --dport 5222 -j DNAT --to-destination 192.168.122.112:2521

Diferente do que sua configuração do iptables parece bem. A única coisa que posso sugerir é garantir que seu sistema permita o encaminhamento de IP:

sysctl -w net.ipv4.ip_forward=1

Se a execução do comando acima resolver o problema, você deve atualizar /etc/sysctl.conf para que ele seja preservado durante as reinicializações.

Como outros sugeriram, executar tcpdump -nn -i any port 5222 or port 2521 no host KVM pode lhe dar uma dica se o pacote está sendo encaminhado ou não. Quando você tenta telnet KVM_HOST_IP 5222 você deve ver dois pacotes. Um indo para KVM_HOST_IP.5222 e outro indo para 192.168.122.112.2521 .

    
por 30.10.2012 / 15:42