Roteando pacotes entre redes com iptables

1

Estou tentando criar um tipo de proxy usando apenas iptables.

O computador linux (meu proxy) tem duas portas:

  • p2p1 está conectado à Internet.
  • em1 está conectado a uma rede local.

Existem dois dispositivos na rede local (sem incluir a máquina linux). Para se conectar a estes, devemos digitar (de qualquer computador na Internet):

  • xx.xx.xx.xx: 10001
  • xx.xx.xx.xx: 10002

em que xx.xx.xx.xx é o IP público (e é dinâmico).

Estes dispositivos podem ser acessados a partir da máquina linux na porta em1, acessando os seguintes IPs:

  • 192.168.3.100:80
  • 192.168.3.101:80

Assim, todo o tráfego encaminhado para xx.xx.xx.xx: 10001 no p2p1 deve ser redefinido para o 192.168.3.100 no em1.

Eu também preciso manter o IP de origem, ou algo assim, para que os pacotes possam encontrar o caminho de volta.

Veja o que estou usando no meu script de tabelas de IP.

iptables -t nat -F  # Clear out any old rules.

MyIP=10.27.155.200
MyPort=10001
DestIP=192.168.3.100
DestPort=80

iptables -t nat -A PREROUTING --dst $MyIP -p tcp --dport $MyPort -j DNAT --to-destination $DestIP:$DestPort
iptables -t nat -A POSTROUTING -p tcp --dst $DestIP --dport $DestPort -j SNAT --to-source $MyIP
iptables -t nat -A OUTPUT --dst $MyIP -p tcp--dport $MyPort -j DNAT --to-destination $DestIP:$DestPort

Obviamente, existem alguns problemas porque meu IP é dinâmico, mas eu o codifico sempre. Além disso, os pacotes, uma vez que retornam ao computador, não sabem como chegar à fonte original.

Eu não sei para onde ir a partir daqui.

    
por jack b 28.05.2014 / 16:04

1 resposta

0

Para encaminhar uma porta, a primeira coisa que você precisa fazer é ativar o encaminhamento no kernel usando um dos dois métodos:

  • Modifique as configurações em /proc como root; dura apenas até a reinicialização:

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

  • Modifique as configurações em /etc/sysctl.conf ; isso é persistente:

    acrescente net.ipv4.ip_forward=1 a /etc/sysctl.conf e execute $ sudo sysctl -p

A segunda coisa que você precisa fazer é configurar a regra de encaminhamento em iptables usando a seguinte sintaxe:

iptables -t nat -A PREROUTING -i [external_interface] -p [protocol] \ 
--dport [external_port] -j DNAT --to-destination [internal_ip]:[internal_port]

Então, usando seu script:

external_iface=p2p1
iptables -t nat -A PREROUTING -i $external_iface -p tcp \
--dport $MyPort -j DNAT --to-destination ${DestIP}:${DestPort}

Isso encaminhará todo o tráfego da porta 10001 na psp1 (independentemente do seu endereço IP) para a porta 80 em 192.168.3.100. No 192.168.3.100, o tráfego parecerá vir de qualquer endereço IP atribuído a em1.

O \ não é obrigatório na regra. Só é usado para dividir a regra em duas linhas.

    
por 28.05.2014 / 17:23