encaminha o tráfego de entrada para o ouvinte local

3

Eu tenho um serviço em execução no host local que escuta porta localhost: 10000

O que eu quero fazer é encaminhar todo o tráfego que chega ao publicip: 15000 para localhost: 10000 onde a alteração da configuração do serviço não está disponível.

O serviço apenas escuta o host local, mas o tráfego vem de fora.

O serviço é executado no linux pelo caminho.

Editar; Tentei adicionar a regra NAT como esta, mas não consegui ter sucesso.

Para configurar o NAT,

iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables --table nat --append POSTROUTING --out-interface lo -j MASQUERADE
iptables -A FORWARD -i eth0 -o lo -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i lo -o eth0 -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
service ufw restart

E para começar o roteamento, execute isto;

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 15000 -j DNAT --to 127.0.0.1:10000

O que você acha que eu sinto falta?

Obrigado antecipadamente

Baris

    
por Harun Baris Bulut 08.02.2014 / 13:58

1 resposta

1

Parece que a DNAT para tráfego de loopback não é possível.

O tráfego de loopback pula as cadeias PREROUTING e OUTPUT.

RFC 5735 (página 3) diz que a rede 127.0.0.0/8 não pôde ser encaminhada para fora do próprio host:

127.0.0.0/8 - This block is assigned for use as the Internet host loopback address. A datagram sent by a higher-level protocol to an address anywhere within this block loops back inside the host. This is ordinarily implemented using only 127.0.0.1/32 for loopback. As described in [RFC1122], Section 3.2.1.3, addresses within the entire 127.0.0.0/8 block do not legitimately appear on any network anywhere.

Além disso, o tráfego para loopback interface é considerado como Martian Packets :

these packets cannot actually originate as claimed, or be delivered

Solução alternativa:

Uma alternativa simples é usar um servidor inted no lado do servidor e seu recurso redirect .

Desta forma, você pode definir um serviço dentro de inetd e definir a porta onde este serviço irá escutar. Em seguida, defina a diretiva redirect para vincular essa porta a 127.0.0.1:port .

No meu exemplo abaixo, usarei xinetd (no Ubuntu 12.04 LTS) para ligar um servidor mysql em execução em 127.0.0.1:10000 :

Etapa 1: Instale o pacote: apt-get install xinetd

Passo 2: Edite o arquivo de configuração /etc/xinetd.conf

Adicione uma definição de serviço semelhante à abaixo:

service my_redirector
{
 type = UNLISTED
 disable = no
 socket_type = stream
 protocol = tcp
 user = root
 wait = no
 port = 15000
 redirect = 127.0.0.1 10000
 log_type = FILE /tmp/somefile.log
}

Etapa 3: Reinicie o daemon xinetd : service xinetd restart

Passo 4: vamos verificar o ouvinte na porta 15000 :

# netstat -anp | grep 15000
tcp     0      0 0.0.0.0:15000      0.0.0.0:*     LISTEN      4654/xinetd

Passo 5: Adicione as suas regras iptables :

iptables -A INPUT -i eth0 -p tcp -d 192.168.0.60 --dport 15000 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -s 192.168.0.60 --sport 15000 -j ACCEPT

Vamos testá-lo:

Para testar, eu configurei mysql para ouvir em 127.0.0.1:10000 . Tentarei acessá-lo por meio do xinetd service na porta 15000 .

Primeiro, no lado do servidor, certifico-me de que mysql server está apenas ouvindo 127.0.0.1:10000 :

# netstat -anp | grep :10000
tcp    0    0 127.0.0.1:10000    0.0.0.0:*      LISTEN      4247/mysqld

Em seguida, no lado do cliente, vamos verificar se podemos nos conectar usando a porta 15000 :

# telnet 192.168.0.60 15000
Trying 192.168.0.60...
Connected to 192.168.0.60.
Escape character is '^]'.
_
5.5.35-0ubuntu0.12.04.2-logD46S}<P'.6cr4ITIQ<wcmysql_native_password

Parece que podemos! :)

Vamos tentar nos conectar ao mysql server:

# mysql -h 192.168.0.60 --port=15000 -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 67
Server version: 5.5.35-0ubuntu0.12.04.2-log (Ubuntu)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Feito!

    
por 08.02.2014 / 21:08