Procurando uma solução que fosse ao mesmo tempo simples de ser implementada e de grande eficiência comparados aos gateways mais sofisticados que empregam bancos de dados e etc, cheguei a esta solução ideal para ser usada em provedores wireless ou a cabo. Ela ainda está em desenvolvimento e dada a sua enorme simplicidade de seu conceito pode servir de base para projetos mais elaborados.
O firewall é o um dos corações de nosso sistema juntamente com o Apache, portanto é fundamental que suas regras sejam adicionadas com muita atenção. O iptables obedece as regras que são inseridas primeiro no chain, ou seja, se você criar primeiro uma regra com o alvo ACCEPT e depois criar uma regra com alvo DROP relativa ao mesmo objeto, a que prevalecerá será a que foi inserida primeiro, a de alvo ACCEPT.
# Definindo a Politica Default das Cadeias
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
echo "Setting default rules ..............[ OK ]"
# Bloqueando multicast
iptables -A INPUT -s 224.0.0.0/8 -d 0/0 -j DROP
iptables -A INPUT -s 0/0 -d 224.0.0.0/8 -j DROP
# Definindo o IP válido como variável do script
IPVAR0=`ip addr show ppp0 | fgrep inet | cut -f6 -d" "`
# IPVAR1=`ip addr show ppp1 | fgrep inet | cut -f6 -d" "`
### Passo 2: Desabilitar o trafego IP entre as placas de rede ###
echo "0" > /proc/sys/net/ipv4/ip_forward
# Configurando a Proteção anti-spoofing
# Caso você use balanceamento de links, esta opção não
# deve se empregada.
for spoofing in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo "1" > $spoofing
done
# Impedimos que um atacante possa maliciosamente alterar alguma rota
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# Utilizado em diversos ataques, isso possibilita que o atacante determine o "caminho" que seu
# pacote vai percorrer (roteadores) ate seu destino. Junto com spoof, isso se torna muito perigoso.
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
# Proteção contra responses bogus
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Proteção contra ataques de syn flood (inicio da conexão TCP). Tenta conter ataques de DoS.
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
### Passo 3: Carregando os módulos do iptables ###
# Dependendo da versão de seu Kernel e de seu iptables
# Estes módulos podem ser outros
# Em meu caso é um 2.6.21.3
# e a versão do iptables é a 1.37
modprobe xt_state
modprobe xt_conntrack
modprobe nf_conntrack_netlink
modprobe iptable_mangle
modprobe ip_conntrack
modprobe ipt_mac
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_mangle
modprobe iptable_nat
modprobe ipt_MASQUERADE
modprobe ipt_mark
modprobe ipt_MARK
echo "Loading iptables's modules .........[ OK ]"
### Passo 4: Agora, vamos definir o que pode passar e o que não ###
iptables -A INPUT -i eth0 -p tcp -s 192.168.0.0/16 --dport 22 -j ACCEPT
# Em meu caso deixei a porta 22 liberada pois trata-se de minha máquina
# de ensaios mas não é aconselhável deixar o serviço SSH ativo em ambientes
# de produção, e se for necessário altere a porta padrão do SSHd
# Libera para requisições ao servidor DHCP caso você tenha um em sua rede
iptables -A INPUT -i eth0 -p udp --dport 67 -j ACCEPT
# Libera todo acesso a porta 443 (https) exceto as que tiverem destino a internet.
# Esta regra é essencial pois os scripts do gateway autenticado ficarão sob um
# servidor https para evitar que algum sniffer capture logins e senha
iptables -A INPUT -i eth0 -p tcp -s 192.168.0.0/16 --dport 443 ! -d $IPVAR0 -j ACCEPT
# No iptables, temos de dizer quais sockets são válidos em uma conexão
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "Setting rules for INPUT ............[ OK ]"
################################
# Cadeia de Reenvio (FORWARD).
# Redireciona porta 80 para 3128 (squid)
iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.0.0/16 --dport 80 -j REDIRECT --to-port 3128
# NAT é recomendado usar o SNAT para redes com muitos clientes
# iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/16 -j SNAT --to-source $IPVAR0
# Marcação de pacotes
# Este passo é essencial para o nosso controle de banda
# que será feito pela ferramenta tc.
for i in `seq 10 254`
do
iptables -t mangle -A POSTROUTING -s 192.168.$i.10 -j MARK --set-mark $i
done
# No iptables, temos de dizer quais sockets são válidos em uma conexão
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#prioriza trafego de saída
iptables -t mangle -A OUTPUT -o ppp0 -p tcp --dport 443 -j TOS --set-tos 16
iptables -t mangle -A OUTPUT -o ppp0 -p tcp --dport 80 -j TOS --set-tos 16
iptables -t mangle -A OUTPUT -o ppp0 -p udp --dport 53 -j TOS --set-tos 16
# Finalmente: Habilitando o trafego IP, entre as Interfaces de rede
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "=========================================="
echo
echo "ppp0 IP: $IPVAR0"
[1] Comentário enviado por removido em 27/07/2007 - 15:57h
Olá Amigo,
Bom, para deixar seu artigo ainda mais rico eu gostaria de dar uma opinião! No caso de um hijack bem feito (roubo de seção), quando o cliente cai e em seguida entra o hijack seu arping vai consultar ele tranqüilamente! Concorda!? Espero que sim, pois eu já fiz testes com isso e infelizmente da certo! A solução é simples, ao invés de fazer o servidor consultar quem está de pé ou não, o que dependendo do número de estações tem um tempo elevado, eu sugiro mudar para o comando at. Como já uso o servidor Radius, foi fácil, no comando AT eu agendo uma verificação pra saber se o IP tal é do fulano de tal conectado no radius, aí sim, se não for a regra dele é derrubada! Pra substituir o uso do radius, pode-se pensar em cookie, por exemplo!
[2] Comentário enviado por capitainkurn em 27/07/2007 - 17:50h
Boa! nem havia me ocorrido o at.
Quando elaborei aquele while de arping, pensei em coloca-los isoladamente rodando sob um shell filho do mac_accept4.cgi que seria chamado em background, mas esbarrei em um problema... não entendí ainda o por que de não conseguir rodar um loop em um shell filho a partir de um CGI, mas é uma coisa que estou bolando e a sua idéia do at foi grande.
Obrigado pela dica, e espero que tenha gostado do artigo.
[4] Comentário enviado por capitainkurn em 23/04/2008 - 10:03h
É mais fácil ainda, a única razão para eu atrelar o ip ao mac address é o controle de banda, pois provedores em geral possuem planos de velocidade diferentes e se não houver vínculo entre o IP e o login e senha o usuário poderia configurar um IP manualmente e usar uma velocidade maior do que a contratada.
[5] Comentário enviado por cleibson em 03/05/2009 - 22:57h
Como o cliente será diretionado para autenticação, sendo que não há nenhuma regra redirecionando sua navegação para a porta 443 obrigando-o a autenticar antes de navegar
[7] Comentário enviado por douglassironi em 28/06/2011 - 18:38h
Sobre a questão de atrelar MAC, podemos fazer isso com PHP, no momento que o cliente se cadastra e cria seu usuario e senha, podemos tranquilamente pegar o MAC dele com a função, abaixo tem um link explicando como fazer.