O convidado KVM não consegue se conectar após a DNAT

2

Descrição da Rede

Ambiente de hospedagem virtual (KVM):

Convidado:

Ubuntu 14.04.5 LTS \n \l
Linux ari 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed Aug 14 15:31:16 UTC 2013 i686 i686 i686 GNU/Linux

Anfitrião:

Ubuntu 14.04.3 LTS \n \l
Linux host 3.13.0-74-generic #118-Ubuntu SMP Thu Dec 17 22:52:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Rede:

          eth0 |----------| virbr63                    eth0 |----------|
---------------|   HOST   |---------------------------------|  ari     |
  11.22.33.44  |----------| 192.168.63.1       192.168.63.2 |----------|
  • 11.22.33.44 é o endereço IP público
  • ari é uma máquina virtual (guest)
  • HOST é uma máquina física (host de máquina virtual)
  • eth0 é uma placa de rede física em HOST
  • virbr63 é um adaptador de rede virtual

Existe uma regra iptables no HOST:

-I PREROUTING -p tcp -d 11.22.33.44 --dport 80 -j DNAT --to 192.168.63.2:8888

Digamos que mydomain.com resolva para 11.22.33.44. ari está servindo todas as solicitações HTTP recebidas em 11.22.33.44. Enrolamento mydomain.com funciona em qualquer lugar na Internet.

Problema

Quando tento acessar mydomain.com através de HTTP de ari , isso não funciona (o curl trava).

Isso é o que a tentativa de dobra mal sucedida parece no tcpdump (no host):

host$ sudo tcpdump -i virbr63 port 8888
22:03:15.541155 IP 192.168.63.2.42740 > 192.168.63.2.8888: Flags [S], seq 786111635, win 14600, options [mss1460,sackOK,TS val 1662005624 ecr 0,nop,wscale 5], length 0
22:03:15.541173 IP 192.168.63.2.42740 > 192.168.63.2.8888: Flags [S], seq 786111635, win 14600, options [mss1460,sackOK,TS val 1662005624 ecr 0,nop,wscale 5], length 0

Isso continua se repetindo a cada poucos segundos.

Isso é o que uma tentativa de curva bem-sucedida (de fora) parece no tcpdump (no host):

host$ sudo tcpdump -i virbr63 port 8888
21:59:10.924031 IP external.xxx.47812 > 192.168.63.2.8888: Flags [S], seq 2881442181, win 29200, options [mss 1420,sackOK,TS val 4022859071 ecr 0,nop,wscale 7], length 0
21:59:10.924339 IP 192.168.63.2.8888 > external.xxx.47812: Flags [S.], seq 1044842547, ack 2881442182, win 14480, options [mss 1460,sackOK,TS val 1661944471 ecr 4022859071,nop,wscale 5], length 0
21:59:10.968371 IP external.xxx.47812 > 192.168.63.2.8888: Flags [.], ack 1, win 229, options [nop,nop,TS val 4022859117 ecr 1661944471], length 0
21:59:10.976415 IP external.xxx.47812 > 192.168.63.2.8888: Flags [P.], seq 1:72, ack 1, win 229, options [nop,nop,TS val 4022859117 ecr 1661944471], length 71
21:59:10.976683 IP 192.168.63.2.8888 > external.xxx.47812: Flags [.], ack 72, win 453, options [nop,nop,TS val 1661944484 ecr 4022859117], length 0
21:59:10.977985 IP 192.168.63.2.8888 > external.xxx.47812: Flags [P.], seq 1:909, ack 72, win 453, options [nop,nop,TS val 1661944484 ecr 4022859117], length 908
21:59:11.025271 IP external.xxx.47812 > 192.168.63.2.8888: Flags [.], ack 909, win 243, options [nop,nop,TS val 4022859175 ecr 1661944484], length 0
21:59:11.030033 IP external.xxx.47812 > 192.168.63.2.8888: Flags [F.], seq 72, ack 909, win 243, options [nop,nop,TS val 4022859175 ecr 1661944484], length 0
21:59:11.030375 IP 192.168.63.2.8888 > external.xxx.47812: Flags [F.], seq 909, ack 73, win 453, options [nop,nop,TS val 1661944497 ecr 4022859175], length 0
21:59:11.075205 IP external.xxx.47812 > 192.168.63.2.8888: Flags [.], ack 910, win 243, options [nop,nop,TS val 4022859223 ecr 1661944497], length 0
  • external.xxx é o DNS reverso do endereço IP que está fazendo a solicitação

Esta é uma configuração de monitoramento, portanto, estou procurando uma solução com o mínimo de alterações possíveis em host . De preferência, nenhuma alteração no host, apenas convencendo ari (guest) a aceitar os pacotes e rotear as respostas através da rede.

Não-Soluções

O que não resolve meu problema

Access ari: 8888 diretamente

Isso não ajuda, porque esta é uma configuração de monitoramento e todo o propósito é testar se o 11.22.33.44:80 funciona.

Acesso de outro convidado (máquina virtual)

Ele funciona (também da mesma rede, 192.168.63.0/24 ), mas não resolve o problema.

O que eu tentei e não funciona

Perguntas similares

Eu olhei as seguintes perguntas e as respostas:

DNAT do host local (127.0.0.1)

O convidado KVM não pode se conectar ao host, mas funciona vice-versa

accept_local

ari$ sudo sysctl -w net.ipv4.conf.eth0.accept_local=1

Não resolve o problema, não altera a saída do tcpdump.

route_localnet

ari$ sudo sysctl -w net.ipv4.conf.eth0.route_localnet=1

Não resolve o problema, não altera a saída do tcpdump.

rp_filter

ari$ sudo sysctl -w net.ipv4.conf.eth0.rp_filter=0

Não resolve o problema, não altera a saída do tcpdump.

Segunda interface de rede (virtual) em ari

Eu tentei adicionar uma segunda interface de rede eth0:1 com o endereço IP 192.168.63.200 . Acessar 192.168.63.2:8888 de 192.168.63.200 falha da mesma maneira:

17:42:08.746328 IP 192.168.63.200.41676 > 192.168.63.2.8888: Flags [S], seq 3211292625, win 14600, options [mss 1460,sackOK,TS val 1744488483 ecr 0,nop,wscale 5], length 0
17:42:08.746351 IP 192.168.63.200.41676 > 192.168.63.2.8888: Flags [S], seq 3211292625, win 14600, options [mss 1460,sackOK,TS val 1744488483 ecr 0,nop,wscale 5], length 0

EDITAR: Solução Similar

Após a resposta de kupson, encontrei uma solução muito semelhante aqui:

link (procure por "Muitos clientes - muito SNAT"). Tem:

iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -d 172.16.0.0/24 -m conntrack --ctstate DNAT  -j SNAT --to 172.16.0.254
    
por Mate 21.05.2018 / 17:44

1 resposta

1

Uma solução possível é usar o SNAT no HOST para alterar o endereço de origem dos pacotes e encaminhá-los de volta para a VM "ari". Não é a solução com maior desempenho, mas é simples e boa o suficiente para muitas configurações.

# fixup chain
iptables -t nat -N fixup-snat
iptables -t nat -A fixup-snat -m conntrack --ctstate DNAT -j MASQUERADE

# please select proper network ranges and NIC names below
iptables -t nat -I POSTROUTING -s 192.168.63.0/24 -d 192.168.63.0/24 -o virbr63 -j fixup-snat

Você pode mesclar isso na regra iptables única, prefiro separar cadeia para clareza.

Você também deve desativar o processamento de pacotes pelo iptables na interface da bridge:

sysctl -w net.bridge.bridge-nf-call-arptables=0
sysctl -w net.bridge.bridge-nf-call-ip6tables=0
sysctl -w net.bridge.bridge-nf-call-iptables=0

Para fazê-los sobreviver a reinicialização nos sistemas Debian, edite o arquivo /etc/sysctl.conf ou crie um novo arquivo no diretório /etc/sysctl.d/ .

    
por 21.05.2018 / 18:18