Índice - Tutoriais

Configurando um servidor Linux doméstico, fácil

Por Carlos E. Morimoto em 3 de março de 2008 às 15h58

15

Compartilhando a conexão

Depois de configuradas as duas interfaces de rede, ativar o compartilhamento da conexão é bastante simples. No Linux o trabalho é feito pelo iptables, o firewall padrão do sistema, que incorpora a função de compartilhamento através do módulo "iptable_nat". Para ativar o compartilhamento, precisamos apenas carregar o módulo, ativar o roteamento de pacotes e em seguida executar o comando que ativa o compartilhamento propriamente dito. Explicando assim pode parecer difícil, mas na prática isso é feito usando apenas 3 comandos:

# modprobe iptable_nat
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


O "eth0" no terceiro comando indica a placa onde está a conexão com a Internet. Não se esqueça de indicar a interface apropriada ao executar o comando (na dúvida você pode checar a configuração da rede usando o ifconfig). Se você acessa via ADSL, usando o pppoeconf ou o adsl-setup (com o modem configurado como bridge) será criada a interface "ppp0".

A partir daí, todas as requisições recebidas na interface de rede local serão mascaradas e roteadas usando a interface especificada e as respostas serão devolvidas aos PCs da rede local.

É possível compartilhar qualquer tipo de conexão, incluindo conexões discadas, wireless, conexões via celular e assim por diante. O servidor simplesmente passa a rotear os pacotes dos demais micros da rede, transmitindo todas as requisições através da conexão que possui. Você precisa apenas configurar os demais PCs da rede para o utilizarem como gateway.

Nem todas as distribuições instalam o executável do iptables por padrão. No Mandriva, por exemplo, ele é instalado ao marcar a categoria "firewall" durante a instalação. Para instalá-lo posteriormente, use o comando "urpmi iptables".

Os três comandos devem ser colocados em algum dos arquivos de inicialização do sistema para que passem a ser executados automaticamente durante o boot. No caso do Ubuntu e outras distribuições derivadas do Debian, você pode utilizar o arquivo "/etc/rc.local". No Fedora, Mandriva e outras distribuições derivadas do Red Hat, use o arquivo "/etc/rc.d/rc.local".

Você pode aproveitar para proteger o servidor usando um firewall simples, que bloqueie as portas de entrada, deixando passar apenas pacotes de respostas e conexões em portas indicadas manualmente. Com isso, o firewall garante um bom nível de proteção, com um mínimo de efeitos colaterais.

Para isso, utilizaremos o próprio iptables, complementando os três comandos anteriores. Estes comandos podem ser incluídos no arquivo /etc/rc.local ou /etc/rc.d/rc.local, logo abaixo dos comandos para compartilhar a conexão:

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP


O primeiro comando faz com que o seu servidor deixe de responder a pings. Muitos ataques casuais começam com uma varredura de diversas faixas de endereços de conexões domésticas, enviando um ping para todas as máquinas. Responder ao ping indica não apenas que a máquina está online, mas também que provavelmente ela está com o firewall desativado, o que estimula o atacante a continuar o ataque, lançando um portscan e iniciando o ataque propriamente dito. Deixando de responder aos pings, o volume de ataques ao servidor cai bastante.

Os dois comandos seguintes protegem contra IP spoofing (uma técnica usada em diversos tipos de ataques, onde o atacante envia pacotes usando um endereço IP falseado como remetente, tentando assim obter acesso a PCs da rede interna) e contra pacotes inválidos, que são comumente utilizados em ataques DoS e ataques de buffer overflow.

As três últimas linhas autorizam pacotes provenientes da interface de loopback (lo), juntamente com pacotes provenientes da rede local e descartam novas conexões na interface de Internet, deixando passar apenas pacotes de resposta. Não se esqueça de substituir o "eth1" pela interface de rede local correta, caso contrário você vai acabar fazendo o oposto, ou seja, bloqueando as conexões dos PCs da rede local e deixando passar as provenientes da Internet :).

Se você quiser abrir portas específicas adicione a regra "iptables -A INPUT -p tcp --dport 22 -j ACCEPT" (onde o "22" é a porta e o "tcp" é o protocolo) antes da regra que bloqueia as conexões. Você pode repetir a regra caso necessário, abrindo assim todas as portas desejadas.

No final, incluindo os comandos para compartilhar a conexão e regras para abrir as portas 22 (SSH) e 6881 (bittorrent), os comandos a adicionar no script de inicialização seriam:

#!/bin/sh
# Compartilha a conexão
modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Bloqueia pings e protege contra IP spoofing e pacotes inválidos
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
iptables -A INPUT -m state --state INVALID -j DROP
# Abre para a interface de loopback e para a interface de rede local
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT
# Abre para as portas especificadas
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 6881 -j ACCEPT
# Bloqueia as demais conexões, deixando passar apenas pacotes de resposta
iptables -A INPUT -p tcp --syn -j DROP


Você pode também criar um filtro simples de conteúdo indicando manualmente endereços que devem ser bloqueados, usando o comando "iptables -A FORWARD -d dominio.com -j DROP". Isso faz com que o servidor se recurse a encaminhar pacotes destinados aos endereços citados, impedindo que eles sejam acessados a partir dos micros da rede local. Você só precisa adicionar uma regra para cada domínio a ser bloqueado no seu script de firewall, como em:

iptables -A FORWARD -d orkut.com -j DROP
iptables -A FORWARD -d msn.com -j DROP
iptables -A FORWARD -d myspace.com -j DROP


Usada dessa forma, a regra bloqueia o acesso aos domínios especificados usando qualquer protocolo. Ou seja, se você adicionar uma regra bloqueando um tracker bittorrent, por exemplo, os clientes bittorrent rodando nas máquinas da rede não conseguirão se conectar a ele para fazerem download dos arquivos. Praticamente qualquer programa que precise se conectar a um servidor central, com um endereço fixo, pode ser bloqueado usando esta regra, desde que você saiba indicar o endereço correto.

A limitação é que esta regra se aplica apenas ao servidor relacionado ao domínio, por isso ela não bloqueia subdomínios hospedados em servidores diferentes. Por exemplo, você pode bloquear o domínio "uol.com.br", mas isso não bloqueará o "tvuol.uol.com.br", que é hospedado em um servidor separado. Em casos como este, a única solução é bloquear ambos.

Outra dica é que, ao compartilhar uma conexão discada ou uma conexão via celular (que também é uma forma de conexão discada, já que você precisa usar o kppp ou o gnome-ppp), você pode fazer com que o sistema execute o script de compartilhamento ao efetuar a conexão usando a aba "Executar" nas propriedades da conexão.

Adapte o script de compartilhamento para compartilhar a interface ppp0 e coloque o comando que executa o script no campo "Ao conectar":


index_html_m99498e7

Com isso o compartilhamento é automaticamente ativado ao conectar. A principal observação é que para usar o script de compartilhamento dessa forma você deve abrir o kppp como root, ou modificar o script de forma que ele use o sudo em todos o comandos que precisarem ser executados como root, de forma que ele possa ser executado usando seu login de usuário.

15 comentáriosPor Carlos E. Morimoto. Revisado 3 de março de 2008 às 15h58

Comentários

Em uma máquina virtual
por Nil Sastre em 20 de janeiro de 2012 às 00h07
Eu fico realmente fascinado com os tutoriais postados neste site pois são bem escritos e com uma linguagem bem acessível, no entanto gostaria de saber se tem como montar esse servidor em uma máquina virtual e instalar em um PC com Windows XP e 2 placas de rede, ao invés de usar uma PC exclusivo pra essa função. Minha intenção é usar esse arranjo em um cyber café com 15 maquinas e 1 "servidor", usando uma rede com um modem ADSL roteado e espetado em um switch e me beneficiar do squid rodando como proxy transparente para melhorar a navegação para os clientes que usam o cyber. Desde já agradeço.
...
por ...... (anônimo) em 11 de novembro de 2011 às 03h52
Aprendi muito com esse cara \0/ \0/ \0/ \0/ \0/ \0/ \0/ \0/ \0/
servidor-linux-domestico
por Jose (anônimo) em 1 de novembro de 2011 às 19h18
OpenMediaVault is the next generation network attached storage (NAS) solution based on Debian Linux. It contains services like SSH, (S)FTP, SMB/CIFS, DAAP media server, RSync, BitTorrent client and many more. Thanks to the modular design of the framework it can be enhanced via plugins.

www.openmediavault.org
Bloqueando varios sites
por Ridson (anônimo) em 26 de outubro de 2011 às 20h23
Boa noite.

Otimo texto, funcionou ate certo ponto, varios sites tais como gmail, hotmail estao sendo bloqueados e nao coloquei regra para isto.

Estou usando Ubuntu 11.04 32bits
Link relacionado
por Guilherme Cunha (anônimo) em 22 de outubro de 2011 às 01h37
Eu em meu site postei um código bem simples para compartilhamento de internet com linux...

Aqui vai o link:

http://www.guilhermecunha.com.br/doku.php?id=compartilhainternet
Errado amigo por Thomas Thurbando (anônimo)
Não recomendo PC antigo.
por aislanluiz em 24 de outubro de 2011 às 16h43
No longo prazo seu gasto com energia sairia mais caro, além da perda de tempo com as travadas devido sujeira e vida útil de componentes, além do barulho.

O melhor seria comprar um desses computadores tipo thin client, com mais uma placa de rede, pois iria gastar bem menos energia, além de espaço.
Parabéns por mais um artigo de qualidade
por Cássio Luiz (anônimo) em 24 de outubro de 2011 às 09h48
Morimoto, parabéns por mais um conteúdo de excelente qualidade, sempre escrito de forma simples. Acredito que muitas pessoas resolveram problemas utilizando seus tutorias.
Interface web para administração do servidor
por rogerio (anônimo) em 22 de outubro de 2011 às 20h52
Uso o BrazilFW que para leigos como eu vem com alguns addons que permitem gerenciar um servidor web com facilidade. Por outro lado ele é limitado quando se quer algo além de um fireweall. Como gerenciar um servidor ubunto por exemplo? Existem ferramentas como o Sqstat, TinyMysar, Squidnow, Simon e etc, ou é tudo feito pelo terminal?
Como configurar o Proxy via DHCP ?
por Frank Lima (anônimo) em 21 de outubro de 2011 às 23h34
Boa noite.

Minha dúvida é como faço para enviar as configurações de proxy via dhcp ?

Grato pela atenção.
WPAD por Waldemar Junior (anônimo)
o/ por Frank Lima (anônimo)
Desse jeito
por gilvane.neo (anônimo) em 22 de outubro de 2011 às 09h26
Do jeito que foi explicado até eu consigo montar um servidor.