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.835 ]

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


O script para desfazer a autenticação



Nosso sistema não trabalha com um "lado cliente", portanto temos que criar um recurso para que a autenticação seja desfeita caso o cliente desligue seu computador, pois se isso não for feito, algum outro usuário "esperto" poderá acessar a internet apenas clonando o MAC do cliente sem qualquer autenticação.

Vamos chamá-lo de scanner.cgi. Podemos adicioná-lo ao /etc/rc.d/rc.local sucedido de & para que ele rode em background. Ficaria assim...

# /usr/sbin/scanner.cgi &

Vamos ao script...

#!/bin/bash

while true
do
   for i in `seq 10 254`
   do
      ipcheck=192.168.$i.10

      #Converte para a variável $mac os MAC address das estações
      #que estão conectadas a rede e para a variável $mac_neigh
      #os MAC das estações que estiverem desconectadas oriundos
      #da tabela ARP estática.
      mac=`arping -c1 -D -I eth0 -s 192.168.10.1 $ipcheck | fgrep [ | cut -f2 -d[ | cut -f1 -d]`
      mac_neigh=`ip neigh show dev eth0 | fgrep $ipcheck | cut -f3 -d" "`

      if test $mac;then
          :
      else
        sudo /usr/sbin/iptables -D INPUT -s $ipcheck -m mac --mac-source $mac_neigh -j ACCEPT 2> /dev/null | sudo /usr/sbin/iptables -D FORWARD -s $ipcheck -m mac --mac-source $mac_neigh -j ACCEPT 2> /dev/null
      fi
   done
   sleep 30
done

O script envia um arping para cada uma das estações da rede, caso ela não responda ele remove a regra que habilita o INPUT e o FORWARD para aquele IP/MAC.

Não se preocupem com o tráfego de rede, pois requisições ARP são muito pequenas e em nada afetarão o desempenho da rede. Uma rede com 254 estações é inteiramente varrida em menos de 5 minutos.

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

Docker: Uma abordagem didática para tempos obscuros

TrueCrypt Forever

Sistema de arquivos criptografado

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

Impedindo o compartilhamento de conexão

Leitura recomendada

Criptografar arquivos importantes no seu Linux

Gerar par de chaves com o GnuPG em 11 passos

(IN)segurança Digital

Gaim + Gaim Encryption - Bate-papo com segurança

Servidor SSH (Secure Shell Hosting)

  
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