Como formular regra de encaminhamento de IP usando iptables

1

Eu tenho dois sistemas A e B. A é um cliente TCP e envia uma mensagem para o servidor TCP em B.

------------------                --------------------------

  System A                        System B
  192.168.0.5 wlan0               192.168.0.3 wlan0
  127.0.0.1   lo                  127.0.0.1 lo
  TCP Client    <------------>    TCP Server on 127.0.0.1
------------------                ----------------------------

O cliente TCP envia mensagem para 192.168.0.3.

Isso deve ser redirecionado para a interface local de B como o servidor TCP está sendo executado no 127.0.0.1 na porta 8000 do sistema B.

Portanto, eu escrevi as seguintes regras da tabela ip, no entanto meu servidor em B não recebe nenhuma mensagem. Oh btw esses dois sistemas são sistemas Linux Ubuntu.

Aqui está o que eu fiz no Sistema B:

#Enable IP Forwarding for NAT
echo "1" > /proc/sys/net/ipv4/ip_forward

#Flush all iptable chains and start afresh
sudo iptables -F

#Forward incoming packets on 192.168.0.3 at wlan0 interface to 127.0.0.1
sudo iptables -t nat -A PREROUTING -p tcp -i wlan0 -d 192.168.0.3 --dport 8000 -j DNAT --to 127.0.0.1:8000

#Explicitly allow incoming connections on port 8000 
sudo iptables -A INPUT -i wlan0 -p tcp --dport 8000 -m state --state NEW,ESTABLISHED -j ACCEPT

#Explicitly allow outgoing messages from port 8000
sudo iptables -A OUTPUT -o wlan0 -p tcp --sport 8000 -m state --state ESTABLISHED -j ACCEPT

Então eu inicio o Servidor em B e envio uma mensagem do Cliente TCP em A. Eu posso ver os pacotes em wireshark do 192.168.0.5 em wlan0 mas eles nunca são encaminhados: (

Por favor ajude.

ATUALIZAÇÃO:

Depois de sugestões de especialistas aqui, criei um cenário "NAT" mais realista para aplicar as regras de encaminhamento, mas ainda tenho problemas: Eu expliquei isso no meu post mais recente: Iptables: o encaminhamento de pacotes não funciona

    
por user907810 26.04.2012 / 10:32

3 respostas

2

Aqui está uma resposta total sem resposta.
como Jens Bradler disse em seu comentário, a coisa mais simples a fazer aqui é vincular o serviço ao endereço IP público na porta 8000, em vez da conexão NAT. Você pode proteger o acesso ao único Servidor A pelas regras iptables, como assim;

 -A INPUT -s 192.168.0.5/32 -p tcp -m tcp --dport 8000 -j ACCEPT
 -A INPUT -p tcp -m tcp --dport 8000 -j REJECT
    
por 26.04.2012 / 11:44
1

A resposta não respondida de Tom H é melhor, mas se você não gostar, aqui está uma resposta direta:

Desculpe, minhas habilidades no iptables são melhores quando eu consigo consertar, testar, verificar, registrar, repetir ... e eu não tenho o seu sistema para brincar, mas aqui está o meu conselho de qualquer maneira. Você provavelmente precisará depurar usando os logs.

Altere a direção do seu redirecionamento, conforme declarado por Jens Bradler:

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

Prove que está certo

cat /proc/sys/net/ipv4/ip_forward

Saída do gato:

1

Adicione uma regra para ACCEPT usando a tabela FORWARD também.

sudo iptables -A FORWARD -i wlan0 -p tcp --dport 8000 -j ACCEPT

Remova o material "-m state" da regra de entrada (opcional ... desnecessário, eu acho):

sudo iptables -A INPUT -i wlan0 -p tcp --dport 8000 -j ACCEPT

Provavelmente em qualquer lugar que você tenha adicionado "ESTABLISHED", você também deve ter "RELATED" (não tenho certeza, mas acho que um pacote de retorno que inicia uma conexão está relacionado, mas não estabelecido).

sudo iptables -A OUTPUT -o wlan0 -p tcp --sport 8000 -m state --state RELATED,ESTABLISHED -j ACCEPT

A regra FORWARD para ir com o acima aceita, reverso do outro FORWARD.     sudo iptables -A FORWARD -o wlan0 -p tcp -s 127.0.0.1 --sport 8000 -m estado - estado RELACIONADO, ESTABELECIDO -j ACEITAR

Em vez de usar wireshark, use -j LOG.

Primeiro, verifique se ainda não existem regras de LOG (as configurações padrão são melhores que as seguintes ... mas você usou o flush; o meu enviará spam para seu servidor):

sudo iptables --list --line-numbers -v
sudo iptables -t nat --list --line-numbers -v

Se não, adicione-os:

sudo iptables -A INPUT -j LOG
sudo iptables -A OUTPUT -j LOG
sudo iptables -A FORWARD -j LOG
sudo iptables -t nat -A PREROUTING -j LOG

Assista os registros

tail -F /var/log/firewall

# or if that file doesn't exist:
tail -F /var/log/messages
    
por 26.04.2012 / 15:10
1

Você nunca pode executar -j DNAT --to 127.0.0.1 .

127.0.0.1 é um endereço super-duper-especial; só aceitaria conexões de 127.0.0.1.

A resposta do @Tom H é a maneira como você deve configurar seu servidor.

    
por 28.04.2012 / 04:32