solicitação http via iptables - destino redirecionado ip resulta em nenhuma resposta

1

Eu tenho dois servidores Ubuntu, cada um com seus próprios endereços IP.

Vamos chamá-los server1 e server2, tendo respectivamente ip 1.1.1.1 e 2.2.2.2

Eu tenho um nginx em execução no server2. O único propósito que eu quero que o server1 tenha é redirecionar todas as requisições http (para a porta 80) recebidas para o server2 sem que os clientes percebam que sua requisição está sendo redirecionada.

Eu tentei o seguinte comando no server1:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 2.2.2.2

Mas quando eu entro em 1.1.1.1 no meu navegador eu não recebo resposta: a página continua tentando carregar sem dar nenhuma mensagem ou mensagem de erro (eu recebo um tempo limite após 2-3 minutos).

Mas quando eu removo a regra acima do iptables eu imediatamente recebo um erro "page not found" quando eu entro 1.1.1.1 no meu navegador; então algo está funcionando, mas não como deveria: quando eu entro 1.1.1.1 eu quero carregar a página html que está hospedada no 2.2.2.2

Porque quando eu digito 2.2.2.2 no meu navegador, vejo a página da Web carregada.

Alguém poderia me ajudar com isso? Estou pesquisando há algum tempo (no severfault & Google) sobre isso agora e é por isso que eu pergunto.

Muito obrigado por ler minha pergunta!

Atualização: Obrigado a todos pela sua informação. Infelizmente ainda não obtenho resposta

Eu tenho a seguinte configuração do iptables:

root@ip-10-48-238-216:/home/ubuntu# sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
root@ip-10-48-238-216:/home/ubuntu# sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:www to:2.2.2.2

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination

Quando eu executo o tcpdump e peço via chrome para 1.1.1.1 i recebo o seguinte

root@ip-10-48-238-216:/home/ubuntu# sudo tcpdump -i eth0 port 80 -vv
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
13:56:18.346625 IP (tos 0x0, ttl 52, id 12055, offset 0, flags [DF], proto TCP (6), length 60)
212-123-161-112.ip.telfort.nl.16386 > ip-10-48-238-216.eu-west-1.compute.internal.www: Flags [S], cksum 0xb398 (correct), seq 2639758575, win 5840, options [mss 1460,sackOK,TS val 1223672 ecr 0,nop,wscale 6], length 0
13:56:18.346662 IP (tos 0x0, ttl 51, id 12055, offset 0, flags [DF], proto TCP (6), length 60)
212-123-161-112.ip.telfort.nl.16386 > ww1dc1.shopreme.com.www: Flags [S], cksum 0x9ee0 (correct), seq 2639758575, win 5840, options [mss 1460,sackOK,TS val 1223672 ecr 0,nop,wscale 6], length 0
13:56:18.598747 IP (tos 0x0, ttl 52, id 10138, offset 0, flags [DF], proto TCP (6), length 60)
212-123-161-112.ip.telfort.nl.16387 > ip-10-48-238-216.eu-west-1.compute.internal.www: Flags [S], cksum 0xac40 (correct), seq 2645658541, win 5840, options [mss 1460,sackOK,TS val 1223735 ecr 0,nop,wscale 6], length 0
13:56:18.598777 IP (tos 0x0, ttl 51, id 10138, offset 0, flags [DF], proto TCP (6), length 60)
212-123-161-112.ip.telfort.nl.16387 > ww1dc1.shopreme.com.www: Flags [S], cksum 0x9788 (correct), seq 2645658541, win 5840, options [mss 1460,sackOK,TS val 1223735 ecr 0,nop,wscale 6], length 0
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel

o endereço mencionado refere-se ao seguinte: 212-123-161-112.ip.telfort.nl.16386 : meu computador pessoal
ww1dc1.shopreme.com.www : dns do servidor2 ( 2.2.2.2 )
ip-10-48-238-216.eu-west-1.compute.internal.www : serviços da Web amazon ec2 endereço interno do server1 ( 1.1.1.1 )

No entanto, o log do tcpdump no servidor2 ( 2.2.2.2 ) permanece vazio e não obtenho resposta no meu navegador.

Eu sou capaz de ping de server1 para server2.
E net.ipv4.ip_forward está definido como 1 e por isso é /proc/sys/net/ipv4/ip_forward
Poderia haver mais alguma coisa que está faltando?

Update2:

O servidor1 é uma microinstância aws ec2, está conectado a um ip elástico que eu chamei de 1.1.1.1. o tempo todo. O micro servidor costumava ser um servidor ec2 maior, mas devido aos seus altos custos, estamos mudando para hospedagem dedicada. Mas no nosso cliente de iPhone usamos um endereço IP fixo, ou seja, o ip elástico mencionado acima. O cliente do iPhone usa serviços REST no servidor. Portanto, agora usamos um micro servidor nesse IP elástico que deve redirecionar todas as solicitações para um vps de outra empresa (www.xlshosting.nl) que tenha uma sub-rede diferente. Eu não sei a funcionalidade que pode redirecionar um ip elástico aws para um endereço IP externo, é por isso que eu tento com uma micro instância + iptables. Esse vps é o que eu chamo de server2 o tempo todo com ip 2.2.2.2. Então server1 e server2 estão em uma sub-rede diferente. Isso ajuda você?

    
por Wouter Vegter 11.02.2011 / 17:26

4 respostas

1

Parece que você pode ter um problema de roteamento. Verifique usando o tcpdump em ambos os servidores e apontando tcpdump com a opção -i para o dispositivo ethX correto para verificar se os pacotes estão sendo enviados através do dispositivo de rede correto no servidor1 e se esses pacotes também chegam ao servidor2.

tcpdump -i ethX host 1.1.1.1 and port 80

Será que os pacotes chegam ao servidor2, mas o servidor2 não sabe para onde enviar as respostas? O servidor2 tem um gateway padrão correto configurado?

Verifique com

route -n
    
por 11.02.2011 / 17:34
0

executar

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

Para tornar a mudança permanente, coloque o seguinte em /etc/sysctl.conf

net.ipv4.ip_forward = 1
    
por 11.02.2011 / 18:15
0

Seu problema pode ser:

1- Problema de roteamento: você precisa verificar o seguinte:

1.1- O roteamento está habilitado no Server1 como sugerido por Patrick. O arquivo /proc/sys/net/ipv4/ip_forward está definido como 1 .

1.2- O Servidor2 é capaz de alcançar o cliente solicitante. Você pode tentar pingar server2 2.2.2.2 do seu cliente. Você pode adicionar rota estática usando o comando route add .

2- Problema de firewall: Você precisa verificar se o seu firewall permite que você acesse o IP 2.2.2.2 . Você pode, por simplicidade, definir a política de firewall para aceitar todo o tráfego (INPUT, OUTPUT, FORWARD).

    
por 11.02.2011 / 19:39
0

Eu tenho algumas perguntas:

Qual é o objetivo da sua configuração? O server1 deveria ser um firewall que faz proxy para o server2 porque você não quer que o servidor2 seja diretamente acessível pela rede?

Como as duas máquinas estão conectadas? Diretamente através de um crossover ou através de um roteador ou outra coisa?

Já tentou executar o tcpdump em ambas as interfaces do server1, bem como na interface no server2? Executar todos os três ao mesmo tempo durante uma solicitação lhe dará uma boa ideia de onde as coisas estão ficando sujas.

    
por 12.02.2011 / 16:53