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