AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 140622
Accepted
Stu
Stu
Asked: 2008-12-06 13:06:59 +0800 CST2008-12-06 13:06:59 +0800 CST 2008-12-06 13:06:59 +0800 CST

Como posso portar para frente com o iptables?

  • 772

Eu quero que as conexões que chegam em ppp0 na porta 8001 sejam roteadas 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 não funciona. o que estou perdendo?

linux port-forwarding iptables
  • 8 8 respostas
  • 516801 Views

8 respostas

  • Voted
  1. Best Answer
    oo_olo_oo
    2009-03-25T03:24:13+08:002009-03-25T03:24:13+08:00

    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 1, tudo bem. Caso não 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 - DNATpode ser aplicado natapenas na mesa. Portanto, 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, precisará fornecer regras semelhantes, mas com o -p udpconjunto de opções).

    Por último, mas não menos importante, está a configuração de roteamento. Modelo:

    ip route
    

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

    • 110
  2. Zealotous
    2011-06-10T03:09:23+08:002011-06-10T03:09:23+08:00

    Você esqueceu o endereço de origem do pós-roteamento 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 configurar seu firewall linux como gateway padrão no computador com o endereço 192.168.1.200.

    • 17
  3. Robert Gamble
    2008-12-06T13:43:59+08:002008-12-06T13:43:59+08:00

    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
    
    • 16
  4. Nullivex
    2015-12-15T14:02:36+08:002015-12-15T14:02:36+08:00

    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 prosseguir.

    #!/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 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.

    • 9
  5. rustyx
    2020-05-14T12:40:58+08:002020-05-14T12:40:58+08:00

    A solução aceita funciona quando o host de destino e o gateway estão na mesma sub-rede (como no seu caso, ambos estão em eth0192.168.1.0/24).

    Abaixo está uma solução genérica para quando o gateway, a origem e o destino estão em sub-redes diferentes .

    1) Habilite o encaminhamento de IP:

    sysctl net.ipv4.conf.eth0.forwarding=1 
    sysctl net.ipv6.conf.eth0.forwarding=1 
    

    2) Adicione 2 regras do iptables para encaminhar uma porta TCP específica:

    Para reescrever o IP de destino do pacote (e de volta no pacote de resposta):

    iptables -A PREROUTING -t nat -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080  
    

    Para reescrever o IP de origem do pacote para o IP do gateway (e de volta no pacote de resposta):

    iptables -A POSTROUTING -t nat -p tcp -d 192.168.1.200 --dport 8080 -j MASQUERADE
    

    3) Se você não tiver uma ACCEPTregra de firewall padrão, permita o tráfego para o destino:

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

    4) Teste a nova configuração. Se funcionar, verifique se as alterações persistem nas reinicializações:

    cat <<EOF > /etc/sysctl.d/99-forwarding.conf
    sysctl net.ipv4.conf.eth0.forwarding=1 
    sysctl net.ipv6.conf.eth0.forwarding=1 
    EOF
    
    iptables-save > /etc/network/iptables.up.rules
    
    echo '#!/bin/sh' > /etc/network/if-pre-up.d/iptables
    echo "`which iptables-restore` < /etc/network/iptables.up.rules" >> /etc/network/if-pre-up.d/iptables
    chmod +x /etc/network/if-pre-up.d/iptables
    
    • 8
  6. Denis Scherbakov
    2017-03-18T01:02:46+08:002017-03-18T01:02:46+08:00

    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 todas as solicitações para MACHINE_C.

    O truque era usar 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
      
    • 3
  7. Adam Liss
    2008-12-10T18:58:04+08:002008-12-10T18:58:04+08:00

    Tentar

    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.

    • 1
  8. Andrew
    2017-05-25T04:04:35+08:002017-05-25T04:04:35+08:00

    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 LAN e trabalho FORWARD 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 destino)
    • LAN_IP - endereço IP na interface LAN (no roteador)

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

    • 0

relate perguntas

  • Protegendo um novo servidor Ubuntu [fechado]

  • (Soft) RAID 6 no Ubuntu 7.10, devo migrar para 8.10?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso dizer ao Apache qual PHP usar?

    • 5 respostas
  • Marko Smith

    Como fechar um soquete à força em TIME_WAIT?

    • 7 respostas
  • Marko Smith

    Como você copia um disco rígido físico para um disco rígido virtual VMware?

    • 11 respostas
  • Marko Smith

    Como despejar um banco de dados do Microsoft SQL Server em um script SQL?

    • 9 respostas
  • Marko Smith

    Como posso portar para frente com o iptables?

    • 8 respostas
  • Marko Smith

    Como vincular o servidor MySQL a mais de um endereço IP?

    • 8 respostas
  • Marko Smith

    Execute o script Oracle SQL e saia do sqlplus.exe via prompt de comando

    • 11 respostas
  • Martin Hope
    Sam McAfee Como posso dizer ao Apache qual PHP usar? 2008-12-23 18:15:17 +0800 CST
  • Martin Hope
    Rehan Como fechar um soquete à força em TIME_WAIT? 2008-09-04 04:57:26 +0800 CST
  • Martin Hope
    Nick Berardi Como você copia um disco rígido físico para um disco rígido virtual VMware? 2008-10-23 14:38:49 +0800 CST
  • Martin Hope
    Matt Sheppard Como despejar um banco de dados do Microsoft SQL Server em um script SQL? 2008-08-25 17:47:52 +0800 CST
  • Martin Hope
    Stu Como posso portar para frente com o iptables? 2008-12-06 13:06:59 +0800 CST
  • Martin Hope
    BlaM Como vincular o servidor MySQL a mais de um endereço IP? 2008-09-03 08:04:18 +0800 CST
  • Martin Hope
    JoshL Execute o script Oracle SQL e saia do sqlplus.exe via prompt de comando 2008-09-23 15:33:09 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve