quarta-feira, 13 de junho de 2012

Linux - Compartilhando internet

O básico do Iptables para compartilhar uma internet com a rede local.


Liberando acesso a internet que vem pela "eth0" para todas as outras interfaces de rede.

#Carrega o módulo que oferece suporte à roteamento de pacotes via NAT
modprobe iptable_nat

#Ativa o módulo (ip_forward) que encaminha os pacotes, utilizado pelo módulo "iptable_nat"
echo 1 > /proc/sys/net/ipv4/ip_forward

#Regra de roteamento que diz ao servidor para direcionar todos os pacotes vindos da faixa de IP da rede interna para a placa da internet.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Então o comando todo ficaria assim:

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

Protegendo o servidor contra ataques da internet

#Faz com que o servidor deixe de responder a pings
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

#Protege contra Spoofing (técnica de ataque) e pacotes inválidos
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
iptables -A INPUT -m state --state INVALID -j DROP

#Autoriza pacotes da interface loopback
iptables -A INPUT -i lo -j ACCEPT

#Autoriza pacotes da interface rede local. (Altere o eth0 para a interface correta.)
iptables -A INPUT -i eth0 -j ACCEPT

#Libera acesso a porta 22, comumente usada para SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#Bloqueia tentativas de conexão vindas da internet
iptables -A INPUT -p tcp --syn -j DROP

Então o comando ficaria assim:

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 eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP


Para ir dando uma dismitificada na coisa:

iptables -A INPUT -i eth0 -j ACCEPT

-A INPUT (Pacotes de Entrada)
-i eth0 (Interface Eth0)
-j ACCEPT (Aceita)

Ou seja: Aceitar os pacotes de entrada que vierem pela Eth0.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

-A INPUT (Pacotes de Entrada)
-p tcp (Protocolo tcp)
--dport 22 (Porta de destino 22)
-j ACCEPT (Aceita)

Ou seja: Aceitar os pacotes de entrada que estiverem com destino à porta TCP número 22.

Então o que temos até o momento são os comandos abaixo:

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

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 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

Agora como faremos para quando eu iniciar meu linux ele automaticamente rodar estes comandos de firewall?

Vamos criar um script para iniciar, parar ou reiniciar as nossas regras de firewall.

Em /etc/init.d crie um arquivo de nome "firewall".

Abaixo script padrão para ser usado:

#!/bin/bash

#Interface local
RedeLocal = "eth1"

#Interface Internet
RedeInternet = "eth0"

iniciar() {
modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $RedeInternet -j MASQUERADE
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 $RedeLocal -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
}

parar () {
iptables -F
iptables -F -t nat
}

case "$1" in
"start") iniciar ;;
"stop") parar ;;
"restart") parar; iniciar ;;
*) echo "Utilizar Start | Stop | Restart"
esac

Agora temos que transformar este script em um executável.

#Comando para transformar um arquivo em um executável
chmod +x /etc/init.d/firewall

#Feito isso, já é possível utilizar os comandos Start, Stop e Restart de nosso script assim:
/etc/init.d/firewall restart

#Para que o script seja iniciado automaticamente com o linux, faça o seguinte:

Edite o arquivo /etc/rc.d/rc.local

E adicione a linha:

/etc/init.d/firewall start



3 comentários:

  1. no caso de eu usar a interface eth0 ligada no modem (já roteado) e a eth1 indo para o access point seria a mesma coisa?

    ResponderExcluir
    Respostas
    1. Olá Tiago,

      A ideia é prover o acesso à rede que vem da Eth0 para a Eth1. Ou seja, se na Eth0 vier internet e na Eth1 você tiver a rede interna deverá funcionar.

      Abraço!

      Excluir