Como posso avançar com iptables?

118

Quero que as conexões que entram no ppp0 na porta 8001 sejam roteadas para 192.168.1.200 no 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?

Stu
fonte
6
NAT HOWTO
Paul Tomblin
Eu estou indo para ir com a tag NPR (embora este poderia ser programando-relacionados, apesar de mal formulada, é claro.)
Mihai Limbăşan
Que tal isso: eu sou um programador tentando configurar um ambiente para poder depurar meu aplicativo de servidor no eclipse que está sendo chamado a partir da Internet. Perto o suficiente?
Claro, foi isso que eu quis dizer com "fraseado" ... Você poderia editar a pergunta de acordo?
Mihai Limbăşan

Respostas:

97

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 ambos retornarem, 1tudo bem. Caso contrário, faça o seguinte:

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

Segunda coisa - DNATpoderia ser aplicada natapenas na mesa. Portanto, sua regra deve ser estendida adicionando a especificação da tabela também ( -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ê deseja alterar também o UDP, é necessário fornecer regras semelhantes, mas com o -p udpconjunto de opções).

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

ip route

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

oo_olo_oo
fonte
16
Eu, pessoalmente, prefiro a sysctlsintaxe comosysctl net.ipv4.conf.eth0.forwarding=1
Doud
11
Como removo a regra inserida incorretamente?
Nickolai Leschov
2
segunda linha: "iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NOVO, ESTABELECIDO, RELACIONADO -j ACEITO" NÃO será necessário se você não tiver restrições / segurança de firewall, o que é o caso da maioria das LANs domésticas, caso contrário, tenha cuidado com -A, porque ele a adicionará APÓS restrições / segurança e pode não funcionar (portanto, verifique -I em vez disso, que está adicionando IN FRONT of iptables rules)
THESorcerer
2
@ ÁronLőrincz, Não. As regras do iptables são voláteis, a menos que sejam explicitamente carregadas na inicialização.
precisa saber é o seguinte
11
@Nickolai Leschov, entram mesmo substituindo -Acom-D
Alexei Martianov
14

Eu 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
Robert Gamble
fonte
2
ummm ... isso é o que eu já tenho. Eu uso o iptables-restore para carregá-lo para que cada um esteja em sua própria seção, mas foi o que escrevi acima.
Ok, a sintaxe parecia ruim no original. Você tentou -i ppp0 nas regras? Qual é o problema exatamente?
Robert Gamble
13

Você esquece o endereço de origem pós-rastreamento SNAT 'ing:

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 definir seu firewall linux como gateway padrão no computador com endereço 192.168.1.200.

Zelotous
fonte
Você conseguiu isso no POSTROUNTINGdegrau. Neste ponto, a conversa ainda é sobre --destinatione não --source.
precisa saber é o seguinte
6

Eu criei o seguinte script bash para fazer isso no meu roteador linux. Ele infere automaticamente 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 copiar e colar em um arquivo e depois.

# 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

Eu pensei que isso poderia economizar tempo de alguém em seu respectivo roteador.

Nullivex
fonte
2

Eu tive a tarefa de fazer MACHINE_A pensar que o serviço está sendo executado fisicamente em MACHINE_B, mas redirecione de forma transparente todas as solicitações 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

Observe que você pode querer ajustar os comandos:

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

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

    -s MACHINE_A
    
Denis Scherbakov
fonte
1

Experimentar

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

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

Adam Liss
fonte
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 o FORWARD funciona quando vou escrever:

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

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

Andrew
fonte