Como rotear a porta TCP externa 80 para a porta 8080 de loopback (127.0.0.1)?

1

Eu tenho uma caixa de teste VDS com IP real. Se eu iniciar o servidor da Web na porta de interface física 80, ele poderá ser aberto de outro computador por meio do endereço IP (e porta padrão 80):

python -m SimpleHTTPServer 80

Mas se eu tentar redefinir a porta 80 da interface física eth0 para o loopback 127.0.0.1 porta 8080 eu posso conectá-lo de outro computador na porta 8080, mas não consigo conectar na porta 80, é apenas interminável 'conectar' . Parece que nenhum redirecionamento ocorre:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080
python -m SimpleHTTPServer 8080

O que estou fazendo de errado? : (

P.S. O servidor de ligação em '127.0.0.1:8080' produz o mesmo resultado, mas não importa, já que o servidor em execução em '0.0.0.0:8080' aceitará a conexão redirecionada para '127.0.0.1:8080'. ATÉ ONDE SEI. : (

iptables -L result:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

iptables -t nat -L result:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:127.0.0.1:8080

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

netstat -nlp result:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      676/sshd        
tcp6       0      0 :::22                   :::*                    LISTEN      676/sshd        
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     7964     600/acpid           /var/run/acpid.socket
unix  2      [ ACC ]     STREAM     LISTENING     6590     1/init              @/com/ubuntu/upstart
unix  2      [ ACC ]     SEQPACKET  LISTENING     6760     231/udevd           /run/udev/control
unix  2      [ ACC ]     STREAM     LISTENING     7030     345/dbus-daemon     /var/run/dbus/system_bus_socket

ifconfig -a result:

eth0      Link encap:Ethernet  HWaddr 00:16:3e:da:1a:98  
          inet addr:5.14.223.181  Bcast:5.14.223.255  Mask:255.255.255.0
          inet6 addr: fe80::140:3eff:febe:201a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:371264 errors:0 dropped:59 overruns:0 frame:0
          TX packets:2093 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:17377545 (17.3 MB)  TX bytes:214428 (214.4 KB)
          Interrupt:25 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:552 (552.0 B)  TX bytes:552 (552.0 B)
    
por grigoryvp 28.12.2012 / 19:04

4 respostas

2

Eu tenho tentado resolver esse problema por um tempo agora, e enquanto eu finalmente decidi não ligar meu processo de servidor ao localhost (eu usei 0.0.0.0:PORT), por um tempo eu não tinha certeza de onde meus pacotes de entrada foram realmente indo dado eu pensei que tinha a regra direita NAT.

A resposta foi que o kernel estava interceptando-os como pacotes marcianos e descartando-os para o lado.

Este site é bastante fácil conjunto de instruções para configurar o log de pacotes marcianos, se você quiser ver se isso estava acontecendo com você.

Outra solução é usar o nginx como um proxy reverso. Nesse caso, você permitiria pacotes com uma porta de destino de 80 através do firewall iptables (verifique se você não está perdendo durante os estágios FILTER e NAT - você pode verificar executando sudo iptables -t nat -L -v ou sudo iptables -t filter -L -v ). A partir daí, o nginx escuta em todas as interfaces para o tráfego destinado à porta 80. Encontrando algumas relacionadas à solicitação HTTP de entrada, você pode fazer com que o nginx encaminhe essa solicitação para você localhost: 8080 (127.0.0.1:8080) usando a diretiva proxy_pass.

@ A postagem de aqui do MonomiDev fornece a configuração real do nginx que permitiria fazer isso - e, em seguida, se você não tem o nginx instalado, há toneladas de tutoriais aqui no Stack e on-line para você começar.

    
por 16.06.2015 / 15:44
4

Basta substituir sua regra por essa.

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

Deve funcionar. Isto irá redirecionar todo o seu tráfego de 80 portas em eth0 para 8080 porta de localhost onde você está executando o tomcat.

Uma outra maneira de fazer isso sem o iptables (como eu nem tenho certeza se é possível com o iptables) é usar os serviços do xinetd. Para usá-lo, instale o xinetd em sua máquina (normalmente ele é instalado por padrão). Crie um arquivo como este:

 # vim /etc/xinted.d/tomcat

Coloque este conteúdo no arquivo:

service tomcat
{
    socket_type             = stream
        wait                    = no
        user                    = root
        redirect                = 127.0.0.1 8080
        bind                    = 10.31.33.101 80
}

Basta reiniciar o serviço xinted.

 # service xinetd restart

E vai funcionar como charme.

    
por 29.12.2012 / 19:59
1

E se você fizer isso:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j REDIRECT --to-port 80  --match comment --comment "Explain."
    
por 28.12.2012 / 19:20
0

A última vez que uso uma regra DNAT como essa, também tive que colocar uma regra SNAT em POSTROUTING para que ela funcionasse corretamente.

    
por 28.12.2012 / 19:07