Como configurar o tráfego de um IP específico codificado para um IP para encaminhar para outro IP: PORT usando iptables?

5

Infelizmente, temos um cliente que codificou um dispositivo para apontar para um IP e uma porta específicos. Gostaríamos de redirecionar o tráfego de seu IP para o nosso balanceador de carga, que enviará os POSTs HTTP para um pool de servidores capaz de lidar com essa solicitação. Gostaria que o tráfego existente de todos os outros IPs não fosse afetado.

Eu acredito que o iptables é a melhor maneira de conseguir isso e acho que este comando deve funcionar:

/sbin/iptables -t nat -A PREROUTING -s $CUSTIP -j DNAT -p tcp --dport 8080 -d $CURR_SERVER_IP --to-destination $NEW_SERVER_IP:8080

Infelizmente, não está funcionando como esperado. Não tenho certeza se preciso adicionar outra regra, potencialmente na cadeia POSTROUTING?

Abaixo, substituí as variáveis acima por IPs reais e tentei replicar o layout no meu ambiente de teste em etapas incrementais. $ CURR_SERVER_IP = 192.168.2.11
$ NEW_SERVER_IP = 192.168.2.12
$ CUST_IP = 192.168.0.50

  • Encaminhar para a frente no mesmo IP

    /sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.11:8080

Funciona exatamente como esperado.

  • IP e porta encaminham para uma máquina diferente

    /sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080

As conexões parecem expirar.

  • Restringir o IP e o encaminhamento de porta para serem aplicados somente a solicitações de um IP específico

    /sbin/iptables -t nat -A PREROUTING -p tcp -s 192.168.0.50 -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080

Eu adicionei a regra ACCEPT, como sugerido pelo @Massimo, mas ainda não vejo nenhum sucesso.

Comecei de novo e executei os seguintes comandos:

# /sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080   
# iptables -A FORWARD -j ACCEPT

E as regras agora parecem:

# iptables -L  -v --line-numbers  (see FORWARD rule 7)

Chain INPUT (policy ACCEPT 1115M packets, 889G bytes)  
num   pkts bytes target     prot opt in     out     source               destination           
1        0     0 ACCEPT     udp  --  virbr0 any     anywhere             anywhere            udp dpt:domain   
2        0     0 ACCEPT     tcp  --  virbr0 any     anywhere             anywhere            tcp dpt:domain   
3        0     0 ACCEPT     udp  --  virbr0 any     anywhere             anywhere            udp dpt:bootps   
4        0     0 ACCEPT     tcp  --  virbr0 any     anywhere             anywhere            tcp dpt:bootps   

Chain FORWARD (policy ACCEPT 112 packets, 5936 bytes)  
num   pkts bytes target     prot opt in     out     source               destination           
1        0     0 ACCEPT     all  --  any    virbr0  anywhere             192.168.122.0/24    state RELATED,ESTABLISHED 
2        0     0 ACCEPT     all  --  virbr0 any     192.168.122.0/24     anywhere              
3        0     0 ACCEPT     all  --  virbr0 virbr0  anywhere             anywhere              
4        0     0 REJECT     all  --  any    virbr0  anywhere             anywhere            reject-with icmp-port-unreachable 
5        0     0 REJECT     all  --  virbr0 any     anywhere             anywhere            reject-with icmp-port-unreachable 
6        0     0 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED 
7        6   336 ACCEPT     all  --  any    any     anywhere             anywhere            

Chain OUTPUT (policy ACCEPT 813M packets, 428G bytes)
num   pkts bytes target     prot opt in     out     source               destination         

e

# iptables -L -t nat -v --line-numbers
Chain PREROUTING (policy ACCEPT 3108K packets, 242M bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DNAT       tcp  --  any    any     anywhere             192.168.2.11 tcp dpt:16000 to:192.168.2.12:8080 

Chain POSTROUTING (policy ACCEPT 13M packets, 790M bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     8644 1979K MASQUERADE  all  --  any    any     192.168.122.0/24     anywhere            

Chain OUTPUT (policy ACCEPT 13M packets, 792M bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Alguém vê problemas óbvios que provocariam o tempo de inatividade de um navegador quando eu acessar o link ?

obrigado,

    
por cclark 10.06.2010 / 06:26

5 respostas

2

Sua regra NAT parece ok, mas você também adicionou uma regra ACCEPT para esse tráfego?

Caso contrário, o NAT entrará em ação, mas o pacote resultante será silenciosamente descartado ...

Atualização:

Você precisa desta regra na cadeia FORWARD (que é onde os pacotes que vão para o firewall, mas não diretamente relacionados a ela, são processados).

Regras FORWARD são aplicadas após regras PREROUTING (como NAT), portanto, quando esta regra é aplicada, os pacotes aparecerão como se estivessem vindo do IP original, mas direcionados para o novo IP de destino modificado. A regra deve ser assim:

/sbin/iptables -A FORWARD -s $CUSTIP -d $NEW_SERVER_IP -j ACCEPT
    
por 10.06.2010 / 07:47
1

(Um dos problemas mais sérios aqui é que as pessoas não sabem como fazer perguntas. Isso faz com que o Serverfault.com se pareça com o Guesswhatfault.com.)

Na sua pergunta nada é dito sobre topologia , infelizmente. Não sabemos se o seu servidor pode recuperar o seu cliente - na verdade, eles estão em sub-redes diferentes. O cliente acha que o servidor está acessível é outra questão. Você pode tentar usar MASQUERADE / SNAT para alterar o IP do cliente ou pensar um pouco como explicar qual é realmente a sua pergunta.

    
por 12.02.2011 / 05:04
1

Existe uma configuração de sysctl que impede que o dna faça loopback. substitua eth0 abaixo pelo tráfego da sua interface externa.

Para permitir

sysctl -w net.ipv4.conf.eth0.route_localnet=1

ou

echo 1 > /proc/sys/net/ipv4/conf/eth0/route_localnet

e para verificar a configuração.

cat /proc/sys/net/ipv4/conf/eth0/route_localnet

agora você pode dnat para 127.0.0.1

    
por 30.06.2015 / 22:08
0

Eu presumo que você esteja usando a caixa linux como um roteador e que esta caixa linux possa ver o novo IP.

Acredito que a tabela NAT só entra em ação quando / proc / sys / net / ipv4 / ip_forward estiver definido como 1. Para tornar isso persistente, coloque a seguinte linha em /etc/sysctl.conf:

net.ipv4.ip_forward = 1
    
por 21.05.2011 / 16:06
0

Eu tinha postado uma pergunta semelhante e encontrei a resposta para mim mesmo. Aqui está o link: -

Como usar o iptables para encaminhar solicitações para um servidor jBoss em execução em uma máquina diferente?

    
por 30.06.2011 / 07:44