Publicado por: Rafael Guedes | 12 agosto 2009

Port-forwarding fácil e rápido com rinetd

Esta é uma ótima dica aos que desejam fazer redirecionamentos de porta no linux, mas tem dificuldades ao usar o netfilter/iptables… O rinetd é um daemon que promete (e cumpre) fazer este trabalho! Veja como ele funciona.

  • Uma breve introdução:

Em suma, o que o rinetd faz, nada mais é do que redirecionar conexões TCP destinadas a um endeço e uma porta, para outro endereço e(ou) outra porta. O rinetd roda como um processo simples de servidor e é capaz fazer um grande número de redirecionamentos sem prejudicar o desempenho da máquina. Quando o daemon é iniciado ele lê o arquivo de configuração /etc/rinetd.conf que é de fácil compreensão e bastante intuitivo, sendo assim, após alterar ou adicionar algum redirecionamento basta então reiniciar o daemon. Ele pode se tornar um grande aliado quando utilizado num ambiente onde há firewall com MASQUERADE e vários servidores atrás deste Firewall.

OBS: o rinetd não redireciona FTP, porquê FTP requer mais de um socket…

  • A instalação:

A ferramenta de gestão de pacotes do Debian pode ser utilizada para instalar o pacote:

#apt-get install rinetd

  • Configuração:

A configuração do rinetd se resume no arquivo /etc/rinetd.conf e obedece a sintaxe abaixo descrita:

<ip global>    <porta global>    <ip local>    <porta local>

Após alterado o arquivo, o daemon deve ser reiniciado:

#/etc/init.d/rinetd restart

  • Testando:

Se houver a necessidade de por exemplo redirecionar as conexões HTTP destinadas ao host 192.168.2.12 para o host 192.168.1.1 então deve-se adicionar a seguinte linha ao arquivo de configuração:

192.168.2.12    80    192.168.1.1    80

E reiniciar o daemon:

#/etc/init.d/rinetd restart

OBS: somente o rinetd poderá escutar na <porta global>, no caso a 80.

Pode-se fazer um teste rápido com o netstat:

server:~# netstat -tanp | grep rinetd

tcp        0      0 192.168.2.12:80         0.0.0.0:*               OUÇA       16621/rinetd

Assim como no iptables pode-se usar também o nome do serviço no lugar da porta. Os serviços podem ser listados em /etc/services. Neste caso o arquivo de configuração ficaria assim:

192.168.2.12    www    192.168.1.1    www

Nomes ainda podem ser utilizados no lugar de IPs:

server.guedes    www    web.guedes    www

E se o IP GLOBAL for dinâmico? Um PPPOE DHCP por exemplo… Então deve-se especificar 0.0.0.0 no <ip global>, assim o rinetd irá escutar em todos os endereços IP configurados no sistema.

0.0.0.0    www    192.168.1.1    www

server:~# netstat -tanp | grep rinetd

tcp        0      0 0.0.0.0:80              0.0.0.0:*               OUÇA       17129/rinetd

  • Regras para permissão e proibição (allow and deny rules):

O firewall da aplicação é de longe dos melhores. As regras de negação e permissão só funcionam de forma genérica. Senhdo assim, é preferível usar a chain INPUT do iptables para controle de acesso.

Apenas como referência: pode-se saber mais sobre allow and deny rules na man page do rinetd.

  • Usando o rinetd com filtro de pacotes:

Apesar de parecer um FORWARD, o pacote na verdade é tratado como um INPUT, caso o servidor onde o rinetd foi instalado possua algum tipo de filtro de pacotes. Logo, que deve ser liberado é o INPUT na <porta global> e não o FORWARD como seria se fosse usado o iptables.

  • Logging:

Por padrão os log são gerados em /var/log/rinetd.log. O path do log pode ser alterado na diretiva logfile do arquivo de configuração do rinetd. Caso alterado, deve-se tornar o arquivo de log de propriedade do root e lhe atribuir permissão octal 644.

O log produzido é de fácil entendimento, como pode ser visto abaixo:

11/Aug/2009:22:54:57     192.168.2.2    0.0.0.0    22    192.168.3.1    2222    0    0    denied
11/Aug/2009:23:03:53     192.168.2.13    0.0.0.0    22    192.168.3.1    2222    1460    2056    done-remote-closed
11/Aug/2009:23:04:54     41.220.233.4    0.0.0.0    22    192.168.3.1    2222    0    0    not-allowed

Todas as linhas têm a seguinte sintaxe:

<data-horário>    <ip do cliente>    <ip global>    <porta global>    <ip local>    <porta local>    <bytes recebidos do cliente>    <bytes enviados ao cliente>    <resultado da conexão>

Denied: o endereço do cliente está na lista de negações.
Done-remote-closed: conexão realizada com sucesso.
Not-allowed: O endereço não está na lista de permissões.

REFERÊNCIA:

http://www.boutell.com/rinetd/
http://www.howtoforge.com/port-forwarding-with-rinetd-on-debian-etch

Man page do pacote.

server:~# netstat -tap | grep rinetdtcp        0      0 server.guedes:www       *:*                     OUÇA       16621/rinetd

Responses

  1. Olá,

    Gostei muito testei e aprovei, esta sendo fantástico
    para minha aplicação.

    Obrigado


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Categorias

%d blogueiros gostam disto: