Este script possui diversas características como: mascaramento da rede interna e a rede externa, bloquear acesso de sites, rádio UOL mesmo com proxy transparente, liberar as portas principais, bloqueio de ataques como ping da morte, SYN-FLOOD, ssh de força bruta, anti-spoofings e entre outros. Faltou dizer a importante amarração do ip ao mac.
O script está muito bem comentado para o entendimento melhor do leitor e para que compreenda a finalidade da tal regra ou comando.
Identifica qual é o interpretador que será usado na execução do script:
#!/bin/sh
Título do script, eu coloquei ele por que o que está comentado nesta linha que está mediadamente depois da declaração do shell, será usado na descrição do webmim no modulo de iniciar e encerrar:
#Configuração do Firewall através do iptables
#Autoria do Script
#"| Script de Firewall - IPTABLES"
#"| Criado por: Marcelo Magno"
#"| Contribuindo por: Josemar, Marcelo, Urubatan Neto e todos os"
#"| membros da comunidade viva o linux"
#"| Técnico em Informática"
#"| marcelo.espindola@gmail.com"
#"| Uso: firewall start|stop|restart"
Nesta parte eu declaro a variável PATH por que ela indica as pastas onde estão os diversos softwares existentes no sistema que não serão necessárias as indicações completa do caminho deles, a variável IPTABLES recebe o caminho completo do executável do firewall, a variável MACLIST recebe o caminho completo do arquivo que contém os macs e os ips que estão amarrados pelo firewall, na variável PROGRAMA recebe o caminho absoluto do próprio script. Lembrando que geralmente eu particularmente gosto de fazer minhas alterações em uma pasta separada, a fim de obter mais organização e não me perder sem saber onde estão os scripts, então eu faço assim, coloco a maioria deles no diretório "/etc/configuracao_personalizada/", só que aqueles scripts que iniciam no boot, sempre deixo na pasta "/etc/init.d/".
#Declaração de variáveis
PATH=/sbin:/bin:/usr/sbin:/usr/bin
IPTABLES="/sbin/iptables"
MACLIST="/etc/configuracao_personalizada/macsliberadosfirewall"
PROGRAMA="/etc/init.d/firewall"
PORTSLIB e PORTSBLO recebem respectivamente o caminho absoluto das portas liberadas e bloqueadas pelo firewall
#portas liberadas e bloqueadas
PORTSLIB="/etc/configuracao_personalizada/portslib"
PORTSBLO="/etc/configuracao_personalizada/portsblo"
Identificar a interface de rede onde está a LAN e a WAN através de variáveis é muito importante para dar certa flexibilidade no script, pois uma pequena modificação na rede basta mudar a variável onde está LAN e a WAN e todo o restante do script vai mudar, isto serve também para a variável REDE.
#Interfaces de Rede
LAN=eth1
WAN=eth0
REDE="192.168.253.0/24"
Neste variável receberá o caminho completo onde está localizado o arquivo que contém sites que serão negados pelo firewall.
Colocar "1" nele (LIGAR) por si só já é técnica suficiente para bloquear o Syn food. Claro que isto deve ser feito em TODOS os servidores. Tentar evitar a negação de serviço no firewall usando limit é FURADA!
[2] Comentário enviado por elgio em 18/11/2007 - 11:30h
Outra coisa é sobre, também, a proteção contra SSH brute force.
Eu usava esta de por um limit (tu colocaste 1s), mas tive que ABANDONAR pelos mesmos motivos do Syn food. Acontece que o mundo tentava tanto entrar no meu SSH que meus usuários legítimos acabavam sendo o +1 no mesmo segundo e não conseguiam. Furada denovo! Resolvi isto com o uso do RECENT do iptables (onde me lembro do IP que fez SSH e o nego se ele fizer muitos em pouco tempo. DIFERENTE do limit que apenas conta quantos sem diferenciar quem, qual IP de origem).
Ah, em tempo, como eu resolvi o problema de brute force SSH eu respondi como COMENTARIO neste artigo (o cara descreveu muito bem o modulo Recent e foi lá que eu soube da existência deste ótimo módulo do iptables): http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=5551
[3] Comentário enviado por suportemega em 19/11/2007 - 17:01h
Marcelo;
Neste artigo como você trata as coneccoes na porta 3389 (terminal service)?
tenho um servidor Linux (proxy e firewall) tenho um TS interno que já acesso de uma rede externa. Mas não consigo fazer com que minha rede interna casse um Terminal Service Externo!
[4] Comentário enviado por thaleseduardo em 19/11/2007 - 19:09h
Parabens, um excelente artigo e será de muita valia. Mas gostaria de tirar uma duvida, sobre servidor wireless. Qual regra de iptables serveria para bloquear o acesso entre os computadores, fazendo com que eles não se enxergue.
uma vez que a politica de saida é SEMPRE permitir, por que criar um regra de saida?
ótimo artigo e excelente firewall, muito bem planejado na minha opinião, parabéns.
[7] Comentário enviado por agk em 24/11/2007 - 13:24h
Gostei da organização do script em arquivos menores e também do uso do Shell para organizar melhor as coisas sem precisar ficar mudando o script de configuração principal.
Não entendi porque foi carregado o modulo ipt_log, pois não é usando em nenhum lugar, recomendo logar os serviços básicos, com a idéia do webmin acho que ficaria bem legal fazer um script Shell para tratar os logs e fazer com que apareçam em html (sei que já tem programa que faz isso, não recordo o nome).
A tabela mangle é muito útil quando se faz controle de banda com HTB, daí é possível tratar os pacotes com o classify, mas isso talvez já esteja um pouco fora do escopo do artigo.
[11] Comentário enviado por k4mus em 06/10/2008 - 23:25h
Amigo, uma duvida. Eh obrigatorio a chamad dos modulos no inicio .modproble .. etc. Estes modulos ja nao sao levantados automaticos na hora do comando nao?
[12] Comentário enviado por fenix_chikinho em 29/11/2008 - 13:08h
Muito bom seu artigo, fiz alguma modificações adaptando as minhas necessidades.
só contribuição
para que quiser obrigar que todas maquinas a passar pelo proxy squid
use
e para utilizar o sistema em conjunto com squid 2.6 ou superior com chache full
use essa regra logo após o redirecionamento
$IPTABLES -t mangle -A OUTPUT -p tcp -m connmark --mark 0 -m string --string "X-Cache: HIT" --algo kmp -j CONNMARK --set-mark 6
$IPTABLES -t mangle -A OUTPUT -p tcp -j CONNMARK --restore-mark
$IPTABLES -t mangle -A OUTPUT -p tcp -m mark --mark 6 -j CLASSIFY --set-class 1:9
echo "Pacotes o HTB Cache-Full ativado"
echo "ON .................................................[ OK ]"
depois crie a classe 1:9 (esta com velocodade superior as demais) voce pode utiliza o HTB ou CBQ, nao iporta pois o sistema funciona perfeitamente em ambos os controladores de banda
[13] Comentário enviado por andriopj em 08/03/2009 - 13:40h
referente a parte de liberar apenas para os mac+ips cadastrados.
tentei implementar esse script aqui, mas nao funcionou...
aqui eu uso fedora 10, rodando:
squid (Version 3.0.stable13) como proxy/webcache
dhcp (MACxIP)
tenho o seguinte cenario, uma rede onde nao posso barrar nada (skype, msn, hotmail, acesso a web, etc).
mas tenho que encontrar um meio de aumentar a seguranca do servidor ou/e ate mesmo dos usuarios (ataques)
e controlar quem acessa e quem nao acessa seria uma boa.
tem algum outro script parecido com esse, que apenas verifica se o mac e o ip coincidem, entao libera acessa a internet
caso nao coincida ou nao exista cadastrado, ele nega o acesso externo???
[14] Comentário enviado por wolrk em 29/04/2009 - 09:51h
Bom dia galera gostaria de uma ajuda de vcs meu Script Firewall.
Gostaria que a galera desse uma opinião sobre ele.
########################## ScriptFirewall############################
[15] Comentário enviado por removido em 01/08/2009 - 22:19h
Cara oq significa o $1 em $IPTABLES -A INPUT -p tcp --dport $i -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport $i -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport $i -j ACCEPT
[17] Comentário enviado por paulo.perina em 24/05/2010 - 19:25h
e ai galera td bem? esse script do marcelo parece ser muito bom show ms mas to com um problema aq tenho um servidor ubuntu rodando samba dhcp bind squid como proxy trasnparent e toda vez q rodo esse script de firewall minha rede e minha net para até o servidor fica sem net fiz td igual ao tutorial acima mas msm assim nun funcionou sera q alguem pode me ajudar???vlw
[18] Comentário enviado por paulo.perina em 27/05/2010 - 09:03h
e ai galera td blz? consegui fazer o script funcionar mas agora ta aparecendo uma mensagem assim not found.4.4: host/network e é sempre nos sites bloqueados será q alguem pode me ajudar??? vlw
[20] Comentário enviado por marcelinoti em 17/07/2012 - 18:01h
Fala galera!
Entao, fiz tudo tudo que explicou porem só nao estou conseguindo é acessa meu servidor de fora (SERVER 2008), coloquei a porta 3389, em, Exemplo do arquivo "/etc/configuracao_personalizada/listaderedirecionamento". Alguem pode me ajudar?