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: 88.884 ]

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

Debian sem Systemd

Enviando e-mail pelo shell com smtp remoto

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

L7-filter (funcionando) no Slackware 10.2

Impedindo o compartilhamento de conexão

Leitura recomendada

Enjaulamento de usuário no sistema operacional

Uma breve abordagem sobre Criptografia

VPN com openVPN no Slackware 11

Implementando uma política de segurança eficaz

Procurando rootkits no seu sistema

  
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