Neste artigo mostrarei um script de firewall utilizando iptables com regras que julgo necessárias para a segurança da sua rede, além de opções de NATs, proxy transparente, logs, etc.
Neste artigo mostrarei um script de firewall utilizando iptables com regras que julgo necessárias para a segurança da sua rede, além de opções de NATs, proxy transparente, logs, etc.
Neste exemplo todo o tráfego da minha rede sai para a internet através do gateway (roteador) 192.168.200.254, passando antes pelo meu firewall.
Abaixo segue o script detalhado e comentado. Provavelmente você só precisará alterar o conteúdo das variáveis IF_EXTERNA e IF_INTERNA, correspondente às interfaces do seu firewall e mais no final do script as regras que tratam de possíveis NATs, proxy transparente, etc. Estas regras estão comentadas:
# Determina a política padrão
# -------------------------------------------------------
$iptables -P INPUT DROP
$iptables -P OUTPUT DROP
$iptables -P FORWARD DROP
# Dropa pacotes TCP indesejáveis
# -------------------------------------------------------
$iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG --log-level 6 --log-prefix "FIREWALL: NEW sem syn: "
$iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
# Dropa pacotes mal formados
# -------------------------------------------------------
$iptables -A INPUT -i $IF_EXTERNA -m unclean -j LOG --log-level 6 --log-prefix "FIREWALL: pacote mal formado: "
$iptables -A INPUT -i $IF_EXTERNA -m unclean -j DROP
# Aceita os pacotes que realmente devem entrar
# -------------------------------------------------------
$iptables -A INPUT -i ! $IF_EXTERNA -j ACCEPT
$iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$iptables -A OUTPUT -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
$iptables -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# Proteção contra trinoo
# -------------------------------------------------------
$iptables -N TRINOO
$iptables -A TRINOO -m limit --limit 15/m -j LOG --log-level 6 --log-prefix "FIREWALL: trinoo: "
$iptables -A TRINOO -j DROP
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 27444 -j TRINOO
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 27665 -j TRINOO
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 31335 -j TRINOO
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 34555 -j TRINOO
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 35555 -j TRINOO
# Proteção contra tronjans
# -------------------------------------------------------
$iptables -N TROJAN
$iptables -A TROJAN -m limit --limit 15/m -j LOG --log-level 6 --log-prefix "FIREWALL: trojan: "
$iptables -A TROJAN -j DROP
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 666 -j TROJAN
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 666 -j TROJAN
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 4000 -j TROJAN
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 6000 -j TROJAN
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 6006 -j TROJAN
$iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 16660 -j TROJAN
# Proteção contra worms
# -------------------------------------------------------
$iptables -A FORWARD -p tcp --dport 135 -i $IF_INTERNA -j REJECT
# Proteção contra syn-flood
# -------------------------------------------------------
$iptables -A FORWARD -p tcp --syn -m limit --limit 2/s -j ACCEPT
# Proteção contra ping da morte
# -------------------------------------------------------
$iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# Proteção contra port scanners
# -------------------------------------------------------
$iptables -N SCANNER
$iptables -A SCANNER -m limit --limit 15/m -j LOG --log-level 6 --log-prefix "FIREWALL: port scanner: "
$iptables -A SCANNER -j DROP
$iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -i $IF_EXTERNA -j SCANNER
$iptables -A INPUT -p tcp --tcp-flags ALL NONE -i $IF_EXTERNA -j SCANNER
$iptables -A INPUT -p tcp --tcp-flags ALL ALL -i $IF_EXTERNA -j SCANNER
$iptables -A INPUT -p tcp --tcp-flags ALL FIN,SYN -i $IF_EXTERNA -j SCANNER
$iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -i $IF_EXTERNA -j SCANNER
$iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -i $IF_EXTERNA -j SCANNER
$iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -i $IF_EXTERNA -j SCANNER
# Libera acesso externo a determinadas portas
# -------------------------------------------------------
$iptables -A INPUT -p tcp --dport 22 -i $IF_EXTERNA -j ACCEPT
# Libera acesso de smtp para fora apenas para o IP XXX.XXX.XXX.XXX
# -------------------------------------------------------
#$iptables -A FORWARD -p tcp -d ! XXX.XXX.XXX.XXX --dport 25 -j LOG --log-level 6 --log-prefix "FIREWALL: SMTP proibido: "
#$iptables -A FORWARD -p tcp -d ! XXX.XXX.XXX.XXX --dport 25 -j REJECT
[1] Comentário enviado por y2h4ck em 28/07/2004 - 10:00h
Bom ... apesar dos metodos citados acima ja serem bem batidões e tal ... achei legal a maneira que vc disponibilizou as infos dentro das tabelas ... separando cada determinado grupo em chains com os nomes separados ... oq a ajuda na hora de uma futura auditoria ...
[2] Comentário enviado por cmarcelo em 28/07/2004 - 16:25h
Achei muito bom o artigo, parabéns!
Aproveitando-o vou fazer um pargunta sobre um porblema q tenho a tempo...
Eu tenho um servidor FTP em um PC aqui em casa, sem firewall funciona perfeito, mas quando levando as regras, o tempo até apareceer a tela de login para o servidor é mt grande..
Abaixo fragmentos do meu script de firewall..
---(cut)---
...
$IPTABLES -F
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
...
$IPTABLES -A INPUT -p tcp --dport 20 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 20 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 21 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 21 -j ACCEPT
...
---(cut)---
[4] Comentário enviado por nhlj em 02/08/2004 - 08:37h
Muito bom o artigo, bem explicado e organizado. Parabéns !
Só uma pergunta, se você configurou a policy de input como drop, porque criar regras para bloquear as portas para trinoo e trojan ?
[5] Comentário enviado por rjacomel em 02/08/2004 - 11:01h
Na verdade não haveria mesmo a necessidade de "dropar" nada nas regras de proteção contra trinoo e trojan. A minha intenção principal para estas regras é apenas de "logar" as tentativas de acesso.
Como você disse, a política padrão já é de negar tudo.
[7] Comentário enviado por brekaus em 11/08/2004 - 13:23h
sou novato no mundo do linux, mais adorei suas regras de firewall, e acho que se alguem souber algum melhor que esse ao inves de criticar, monta um artigo igual o Ricardo montou, pq pra min foi mto util!!
[10] Comentário enviado por reimassupilami em 17/11/2004 - 15:57h
quando executei o script deu os seguintes erros:
WARNING: Error inserting ipfwadm (/lib/modules/2.6.9/kernel/net/ipv4/netfilter/ipfwadm.ko): Device or resource busy
WARNING: Error inserting ipfwadm (/lib/modules/2.6.9/kernel/net/ipv4/netfilter/ipfwadm.ko): Device or resource busy
WARNING: Error inserting ipfwadm (/lib/modules/2.6.9/kernel/net/ipv4/netfilter/ipfwadm.ko): Device or resource busy
iptables v1.2.9: Maximum prefix length 29 for --log-prefix
Try `iptables -h' or 'iptables --help' for more information.
iptables: No chain/target/match by that name
[11] Comentário enviado por reimassupilami em 18/11/2004 - 13:54h
rodei linha por linha do script de firewall e identifiquei que o q tava dando o primeiro erro, tres vezes, eram as seguintes linha que usava pra ativas os modulos:
depois comentei essas linhas e naum deu mais aquele erro... agora vem a questão: pq ta dando o esso nessas linhas, e será vai funcionar se naum tiver essas linhas?
mesmo assim o segundo erro ainda persiste... o q mais pode ser?
sao desnecessarias pois esses modulos ja estao carregados, por isso dava os erros...
quanto ao outro erro econtrei onde ele esta ocorrendo, é nas linhas:
$iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG --log-level 6 --log-prefix "FIREWALL: NEW sem syn: "
$iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
[13] Comentário enviado por reimassupilami em 19/11/2004 - 09:14h
bom, ja que ninguem comentou nada, deixa eu postar aki a solução:
muito bem, depois de tanta luta, um colega do underlinux deu a seguinte solução para o segundo erro:
depois do tcp coloca um -m.
$iptables -A FORWARD -p tcp -m tcp! --syn -m state --state NEW -j LOG --log-level 6 --log-prefix "FIREWALL: NEW sem syn: "
$iptables -A FORWARD -p tcp -m tcp ! --syn -m state --state NEW -j DROP
[18] Comentário enviado por 4driano em 14/03/2005 - 19:18h
Legal esse script..... eu vi um pessoal reclamando sobre ele falando que estava fraco e tudo mais, o que mais é preciso como firewall de uma rede?
A única coisa que eu faço além disso é realmente olhar os logs e analisá-los, pois não tem outro jeito..... se alguém preferir, põe o snort para ajudar....mas esse firewall tá muito legal, fecha tudo e abre o que precisa.
[22] Comentário enviado por macgyver_rp em 19/10/2005 - 14:00h
Achei o erro do script no meu Debian Sarge....
São essas duas linhas depois de comentadas parou o erro
Alguem pode dar olhada nas linhas e achar o problema eu achei que era o nome e diminui o nome como sujeriram acima...mas não deu certo.
# Dropa pacotes mal formados
# -------------------------------------------------------
$iptables -A INPUT -i $IF_EXTERNA -m unclean -j LOG --log-level 6 --log-prefix "FIREWALL: pac mal formado: "
$iptables -A INPUT -i $IF_EXTERNA -m unclean -j DROP
[24] Comentário enviado por madsonsander em 07/04/2006 - 20:54h
olá tentei usar o seu firewall, porém não consegui navegar, a minha saída para a internet não é pelo meu gateway, saio por um dns válido do meu provedor, o que preciso fazer, uso red hat 9....
[26] Comentário enviado por gusfreire em 05/03/2007 - 11:49h
Realmente muito bom o scrip mas quando eu executo ele no meu servidor da o seguinte erro: iptables v1.2.11: Maximum prefix length 29 for --log-prefix Try `iptables -h' or 'iptables --help' for more information.
A minha distribuição é o Debian 3.1 Sarge.
Se alguém souber o porque está dando este erro.
[27] Comentário enviado por gusfreire em 05/03/2007 - 11:51h
Cara me desculpe malndei a dúvida e não li direito o que o pcclinica escreveu eu vi que o meu problema era parecido com o dele mas não li a resolução foi mal mesmo.
Foi só comentar as duas linhas que o pcclinica havia comentado acima que funcionou. Valew
[28] Comentário enviado por marceloespindola em 07/07/2007 - 15:28h
Pessoal estou escrevendo um artigo aqui para o viva o linux sobre scrippt de firewall, ele está completo pois levei muito tempo para desenvolve-lo e tinha objetivo de reunir as principais soluções e dúvidas sobre firewall para este artigo, mas como quero construir um bom artigo ainda está em fase de construção para o vivaolinux, entretanto estou disponibilizando no endereço
[32] Comentário enviado por overond em 22/09/2007 - 17:49h
quando executo a linha iptables -A INPUT -i eth0 -m unclean -j DROP me retorna a mensagem No chain/target/match by that name, vcs sabem o que pode estar errado?
[38] Comentário enviado por cooperrj em 08/06/2009 - 10:23h
Muito show o script, parabéns mesmo, mas tenho uma duvida...
Eu removi desse script a parte de dropar trinoo, trojan e dos pacotes mal formados... Também removi os logs, pois pra mim não seria interessante e é bom que usa menos hardware... Agi certo em fazer isso?