Gateway autenticado com Apache, Iptables e CGI em shell

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.

[ Hits: 86.943 ]

Por: Carlos Affonso Henriques. em 27/07/2007


O firewall



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.

Vamos ao script comentado.

#!/bin/bash

### Passo 1: Limpando as regras ###
iptables -F -t nat
iptables -Z -t nat
iptables -F -t mangle
iptables -Z -t mangle
iptables -X -t mangle
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -X -t nat

# Definindo a Politica Default das Cadeias
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
echo "Setting default rules ..............[ OK ]"

# liberando loopback
iptables -I INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -I OUTPUT -s 127.0.0.1/8 -j ACCEPT

# 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).

# Primeiro, ativar o mascaramento (nat).
iptables -t nat -F POSTROUTING
iptables -t nat -F PREROUTING

# 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"

Página anterior     Próxima página

Páginas do artigo
   1. Preparando o Apache
   2. Configurando o SSL no Apache
   3. A topologia da rede
   4. O firewall
   5. A página de autenticação
   6. O arquivo de contas
   7. O script CGI de autenticação
   8. O script para desfazer a autenticação
   9. A tabela ARP estática
   10. O controle de banda
   11. Notas e agradecimentos
Outros artigos deste autor

Balanceamento de carga e alta disponibilidade com Bonding Driver e Iproute2

Filtro de conteúdo autenticado com níveis de privilégio

Enviando e-mail pelo shell com smtp remoto

Administrando usuários no GNU/Linux e Samba via web com PHP

Impedindo o compartilhamento de conexão

Leitura recomendada

Sistemas e volumes criptografados e escondidos utilizando o TrueCrypt

Burlando "MSN Sniffers" com TOR e Gaim

Alta Disponibilidade com LVS

Resetando senha de usuário root em sistemas Debian e Red Hat

Desvendando código malicioso no fórum Viva o Linux

  
Comentários
[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!

T+

[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.

[3] Comentário enviado por fabiorvs em 22/04/2008 - 19:07h

Ola tem como fazer a autenticação só por usuário, sem o MAC e ip, pois trabalho em uma faculdade e preciso cadastrar todos os alunos.

[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

[6] Comentário enviado por removido em 06/05/2010 - 09:29h

òtima dica para o combate de ataques do TIPO MITM, originados por arpspoof.

[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.

http://scriptbrasil.com.br/forum/index.php?showtopic=70543

No momento que o usuario/cliente se cadastrar, pode ser gerado o arquivo do DHCP atrelando um ip para o mac capturado.

Recomendo ultilizar um banco de dados para salvar as informações dos clientes/usuarios.
O freeradius tem as tabelas prontas em vários tipos de BD.

Qualquer duvida, estou a disposição.
contato@douglassironi.com


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts