Como posso portar forward com iptables?

111

Eu quero conexões entrando em ppp0 na porta 8001 para ser roteado para 192.168.1.200 em eth0 na porta 8080.

Eu tenho essas duas regras

-A PREROUTING  -p tcp -m tcp --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

e isso não funciona. O que estou perdendo?

    
por Stu 05.12.2008 / 21:06

7 respostas

91

Primeiro de tudo - você deve verificar se o encaminhamento é permitido:

cat /proc/sys/net/ipv4/conf/ppp0/forwarding 
cat /proc/sys/net/ipv4/conf/eth0/forwarding 

Se os dois retornarem 1 , tudo bem. Se não fizer o seguinte:

echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding

A segunda coisa - DNAT poderia ser aplicada apenas na tabela nat . Assim, sua regra deve ser estendida adicionando também a especificação da tabela ( -t nat ):

iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080
iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Ambas as regras são aplicadas apenas ao tráfego TCP (se você quiser alterar o UDP também, é necessário fornecer regras semelhantes, mas com -p udp opção definida).

Por último, mas não menos importante, é a configuração de roteamento. Tipo:

ip route

e verifique se 192.168.1.0/24 está entre as entradas de roteamento retornadas.

    
por 24.03.2009 / 11:24
14

Acho que o que você quer é:

iptables -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state 
    NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination
    192.168.1.200:8080
    
por 05.12.2008 / 21:43
12

Você se esquece do endereço de origem pós-pago SNAT:

sysctl net.ipv4.ip_forward=1
yours_wan_ip=101.23.3.1
-A PREROUTING  -p tcp -m tcp -d $yours_wan_ip --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

E não se esqueça de configurar seu firewall Linux como gateway padrão no computador com o endereço 192.168.1.200.

    
por 09.06.2011 / 11:09
5

Eu criei o seguinte script bash para fazer isso no meu roteador linux. Ele automaticamente infere o IP da WAN e confirma suas seleções antes de continuar.

#!/bin/bash

# decide which action to use
action="add"
if [[ "-r" == "$1" ]]; then
  action="remove"
  shift
fi

# break out components
dest_addr_lan="$1"
dest_port_wan="$2"
dest_port_lan="$3"

# figure out our WAN ip
wan_addr='curl -4 -s icanhazip.com'

# auto fill our dest lan port if we need to
if [ -z $dest_port_lan ]; then
  dest_port_lan="$dest_port_wan"
fi

# print info for review
echo "Destination LAN Address: $dest_addr_lan"
echo "Destination Port WAN: $dest_port_wan"
echo "Destination Port LAN: $dest_port_lan"
echo "WAN Address: $wan_addr"

# confirm with user
read -p "Does everything look correct? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]; then
  if [[ "remove" == "$action" ]]; then
    iptables -t nat -D PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -D FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -D POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport     $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule removed"
  else
    iptables -t nat -A PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -A FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -A POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule added"
  fi
else
  echo "Info not confirmed, exiting..."
fi

O uso do script é simples, basta copiá-lo e colá-lo em um arquivo e, em seguida.

# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added

Para remover a mesma regra

# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed

Pensei que isso economizaria tempo para o respectivo roteador.

    
por 14.12.2015 / 22:02
1

Tente

echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding

Esses arquivos dizem ao kernel que é permitido encaminhar pacotes entre as interfaces.

    
por 10.12.2008 / 02:58
1

Eu tive a tarefa de fazer MACHINE_A pensar que o serviço está sendo executado fisicamente em MACHINE_B, mas redirecionar de forma transparente todos os pedidos para MACHINE_C.

O truque era usar o MASQUERADE.

sysctl net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp -d MACHINE_B --dport 443 -j DNAT --to-destination MACHINE_C

iptables -t nat -A POSTROUTING -s MACHINE_A -o INTERFACE_NAME -j MASQUERADE

Por favor, note que você pode querer ajustar os comandos:

  1. Para permitir o encaminhamento de pacotes somente em uma interface específica. Por exemplo:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Para permitir que não apenas o MACHINE_A, mas também todos os outros usem o encaminhamento de porta, remova:

    -s MACHINE_A
    
por 17.03.2017 / 09:02
0

Este comando não funciona para mim:

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

Eu tenho 2 interfaces de rede local e trabalho FORWARD quando escrevo:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • Interface LAN_IF - LAN (por exemplo, eth1, br0 ...)
  • FW_PORD - porta encaminhada (no host de detecção)
  • LAN_IP - endereço IP na interface da LAN (no roteador)

PREROUTING e FORWARD também são necessários, claro:)

    
por 24.05.2017 / 12:04