Script de firewall e análise de log

Depois de um bom tempo lendo artigos e mais artigos da internet, decidi que iria montar um script de firewall que protegesse minha rede de ataques e outros danos que a internet nos traz. Depois de montado e testado o script, queria entender os logs, foi aí que conheci o Fwanalog e gostaria de dividir com todos minha aventura.

[ Hits: 52.029 ]

Por: Rafael da Silva Rosa em 23/09/2010 | Blog: http://rafaelsuporteonline.blogspot.com.br/


O iptables



Só para considerações de estudo no Linux, as funções de firewall são agregadas à própria arquitetura do kernel, isso o torna sem dúvida muito superior em relação a seus concorrentes. Enquanto a maioria dos produtos "firewall" são denominados de subsistemas, o Linux possui a capacidade de transformar o firewall no próprio.

Tudo que chega ou sai de um host é processado por seu kernel, independente de sistema operacional. O que o Linux faz de diferente é agregar, via Netfilter (software este inicialmente acoplado ao sistema), funções de controle de fluxo interno em termos de firewall.

Então sem mais conversa, segue o meu script de firewall e lembrando que pode ser modificado para melhorias em outras redes, apenas peço que lembrem sempre de quem o criou.

#!/bin/bash

echo Script de Firewall Montando por:
echo Nome: Rafael da Silva Rosa
echo Funcao: Analista de informatica PL
echo Fone: 35 8833-0343 ou 35 3552-6462
echo
echo

# Variáveis

### Interface da Internet:
ifinternet="eth1"

### Interface da rede local
iflocal="eth0"

# Início do Firewall ########

### Habilitando os módulos
echo Carregando os Modulos
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ip_queue
modprobe ip_tables
modprobe ipt_LOG
modprobe ipt_MARK
modprobe ipt_MASQUERADE
modprobe ipt_REDIRECT
modprobe ipt_REJECT
modprobe ipt_TCPMSS
modprobe ipt_TOS
modprobe ipt_limit
modprobe ipt_mac
modprobe ipt_mark
modprobe ipt_multiport
modprobe ipt_owner
modprobe ipt_state
modprobe ipt_tcpmss
modprobe ipt_tos
modprobe iptable_filter
modprobe iptable_mangle
modprobe iptable_nat
echo Modulos Carregados ..... [ok]

### Compartilhamento da Internet
echo Compartilhando a internet
iniciar(){
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $ifinternet -j MASQUERADE
echo Internet Compartilhada ..... [ok]

### Alterar política padrão
echo Alterando a Politica Padrao
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
echo politica padrao ..... [ok]

### Libera a loopback e a rede local
echo Liberando Loopback e Rede Local
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --syn -s 192.168.52.0/28 -j ACCEPT
iptables -A OUTPUT -p tcp --syn -s 192.168.52.0/28 -j ACCEPT
iptables -A FORWARD -p tcp --syn -s 192.168.52.0/28 -j ACCEPT
echo Loopback e Rede local ..... [ok]

### Liberando programa do Sicoob
echo Liberando Sicoob
iptables -t nat -I PREROUTING -s 192.168.52.0/28 -p tcp -d 200.252.146.0/24 --dport 80 -j ACCEPT
echo Sicoob .... [ok]

### Redirecionar acessos para o Squid retirando o ip do servidor
echo Redirecionando rede para Squid e log na porta 80
iptables -I INPUT -p tcp --dport 80 -j LOG --log-level info --log-prefix 'PORTA 80 >'
iptables -I INPUT -s 192.168.52.3 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -s 200.xxx.xxx.xxx -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j LOG --log-level info --log-prefix 'PORTA 80 DROP>'
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -t nat -A PREROUTING -s 192.168.52.4 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -s 192.168.52.2 -p tcp --dport 80 -j REDIRECT --to-port 3128
echo Redirecionamento .... [ok]

# Segurança

### Segurança Diversa
echo Seguranca da rede, Firewall e gerando logs de portas
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

### Impedindo ataque Ping of Death no Firewall
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

### Descarte de pacotes nao identificados ICMP
iptables -A OUTPUT -m state -p icmp --state INVALID -j DROP
iptables -A INPUT -m state -p icmp --state INVALID -j DROP
iptables -A FORWARD -m state -p icmp --state INVALID -j DROP

### Impedindo ataque Ping of Death na rede
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

### Impedindo ataque de Denial Of Service Dos na rede e servidor
iptables -I FORWARD -p tcp -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp -m limit --limit 1/s -j ACCEPT

### Impedindo ataque Port Scanners na rede e no Firewall
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -I INPUT -p udp --dport 33435:33525 -j LOG --log-level info --log-prefix 'SCANNERS DROPADO>'
iptables -A INPUT -p udp --dport 33435:33525 -j DROP
iptables -I FORWARD -p udp --dport 33435:33525 -j LOG --log-level info --log-prefix 'SCANNERS DROPADO NA REDE>'
iptables -A FORWARD -p udp --dport 33435:33525 -j DROP

### Bloquear Back Orifice na rede
iptables -I INPUT -p tcp --dport 31337 -j LOG --log-level info --log-prefix 'ORIFICE DROPADO>'
iptables -A INPUT -p tcp --dport 31337 -j DROP
iptables -I INPUT -p udp --dport 31337 -j LOG --log-level info --log-prefix 'ORIFICE UDP>'
iptables -A INPUT -p udp --dport 31337 -j DROP
iptables -I FORWARD -p tcp --dport 31337 -j LOG --log-level info --log-prefix 'ORIFICE NA REDE>'
iptables -A FORWARD -p tcp --dport 31337 -j DROP
iptables -I FORWARD -p udp --dport 31337 -j LOG --log-level info --log-prefix 'ORIFICE NA REDE UDP>'
iptables -A FORWARD -p udp --dport 31337 -j DROP

### Bloquear NetBus na rede
iptables -I INPUT -p tcp --dport 12345 -j LOG --log-level info --log-prefix 'NETBUS >'
iptables -A INPUT -p tcp --dport 12345 -j DROP
iptables -I INPUT -p udp --dport 12345 -j LOG --log-level info --log-prefix 'NETBUS UDP>'
iptables -A INPUT -p udp --dport 12345 -j DROP
iptables -I FORWARD -p tcp --dport 12345 -j LOG --log-level info --log-prefix 'NETBUS NA REDE>'
iptables -A FORWARD -p tcp --dport 12345 -j DROP
iptables -I FORWARD -p udp --dport 12345 -j LOG --log-level info --log-prefix 'NETBUS UDP>'
iptables -A FORWARD -p udp --dport 12345 -j DROP

### Desabilita resposta para pingecho 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

### Desabilita port scan
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

### Desabilita redirecionamento de ICMP
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 >$f
done

### Protecao contra synflood
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

### Ativando protecao contra responses bogus
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

### Protecao contra worms
iptables -I FORWARD -p tcp --dport 135 -j LOG --log-level info --log-prefix 'WORMS REDE>'
iptables -A FORWARD -p tcp --dport 135 -j DROP
iptables -I INPUT -p tcp --dport 135 -j LOG --log-level info --log-prefix 'WORMS >'
iptables -A INPUT -p tcp --dport 135 -j DROP

### Bloqueando tracertroute
iptables -A INPUT -p udp -s 0/0 -i $ifinternet --dport 33435:33525 -j REJECT

### Permite o redirecionamento seguro dos pacotes
echo "1" > /proc/sys/net/ipv4/conf/all/secure_redirects

### IMPEDINDO O REDIRECIONAMENTO E UMA ROTA
echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
echo Seguranca Carregada e logs gerados ..... [ok]

# Liberando acesso remoto

### Libera acesso pelo SSH
echo Liberando Ssh e fazendo Log da porta
iptables -I INPUT -p tcp --dport xxxx -j LOG --log-level info --log-prefix 'SSH'
iptables -A INPUT -p tcp --dport xxxx -j ACCEPT
echo Liberacao do Ssh ..... [ok]

# Aceita Pacotes Estabilizados

echo Estabilizando Pacotes
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
echo Pacotes Estabilizado ..... [ok]

### Libera Msn
echo Liberando Msn
iptables -A OUTPUT -p tcp --sport 1024:5999 --dport 1863:1863 -m state --state NEW -j ACCEPT
echo Msn Liberado ..... [ok]

# Libera Dns para o Server e Rede
echo Liberando Dns Interno
iptables -A INPUT -p tcp --dport 53 -d 192.168.52.0 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -d 192.168.52.0 -j ACCEPT
iptables -A FORWARD -p tcp --dport 53 -d 192.168.52.0 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -d 192.168.52.0 -j ACCEPT
echo Dns Liberado ..... [ok]
# Redireciona Terminal Service, Radmin

### Redireciona Terminal Service, Radmin
echo Redirecionamento de Servicos e Log das portas usadas
iptables -I INPUT -p tcp --dport xxxx -j LOG --log-level info --log-prefix 'MSTSC >'
iptables -A INPUT -p tcp --dport xxxx -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i $ifinternet --dport xxxx -j DNAT --to 192.168.52.3
iptables -t nat -A PREROUTING -p tcp -i $ifinternet --dport xxxx -j DNAT --to 192.168.52.3
echo Redirecionamento e Logs ..... [ok]

### Bloqueia o resto das portas
echo Bloqueio das portas restantes
iptables -I INPUT -p tcp --syn -j LOG
iptables -A INPUT -p tcp --syn -j DROP
echo Bloqueio ..... [ok]
}
parar(){
echo Limpando as tabelas e Chains
iptables -F
iptables -F -t nat
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t mangle -F
iptables -t nat -F
iptables -X
echo Limpeza das Tabelas ..... [ok]
}
case "$1" in
"start") iniciar ;; "stop") parar ;;
"restart") parar; iniciar ;;
*) echo "Use os parametros start ou stop"
Esac

Lembrando que se deve trocar onde está com xxxx por porta ou ip da rede usados no script.

Página anterior     Próxima página

Páginas do artigo
   1. Uma breve introdução
   2. O iptables
   3. Entendendo os logs
   4. Instalação do software
Outros artigos deste autor

Plugin MSofficeKey para OCS Inventory

Conexão do Vindula com o Active Directory Server 2008 R2

OCS Inventory e seus clientes - Instalação e configuração

Servidor Openfire integrado ao Active Directory (Nível de Floresta 2008 R2)

Cacti + Plugins (Settings, Monitor, Thold e Weathermap) - Instalação e configuração

Leitura recomendada

L7-filter (funcionando) no Slackware 10.2

Iptables detalhado

Zentyal 2.0 - Solução completa de segurança open source

Metodologia de Proxy Parcial

Criando um Firewall transparente com Bridges no Debian Etch

  
Comentários
[1] Comentário enviado por elton.lima em 23/09/2010 - 07:54h

Camarada tenho grandes dúvidas em relaçao ao redirect do squid no IPTABLES. Me explica quem são esses IPs 192.168.52.4 e 192.168.52.2 e a linha 'iptables -I INPUT -s 200.xxx.xxx.xxx -p tcp --dport 80 -j ACCEPT'

Obrigado ! :)

### Redirecionar acessos para o Squid retirando o ip do servidor
echo Redirecionando rede para Squid e log na porta 80
iptables -I INPUT -p tcp --dport 80 -j LOG --log-level info --log-prefix 'PORTA 80 >'
iptables -I INPUT -s 192.168.52.3 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -s 200.xxx.xxx.xxx -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j LOG --log-level info --log-prefix 'PORTA 80 DROP>'
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -t nat -A PREROUTING -s 192.168.52.4 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -s 192.168.52.2 -p tcp --dport 80 -j REDIRECT --to-port 3128
echo Redirecionamento .... [ok]

[2] Comentário enviado por rafaelrsr em 23/09/2010 - 08:56h

Bom dia meu camarada. O que acontece ai éo seguinte:
1º esse endereços de ips são da minha rede interna.
2º na minha rede tinha apenas 3 micro para acesso a internet, 2 usuário e um servidor que queria acesso a internet pela porta 80 e os dois usuário pela porta 3128.
3º eu poderia redirecionar minha placa da rede interna exemplo eth1 para a porta 3128, mas ai eu redirecionaria meu servidor também, então o que eu fiz foi:

iptables -I INPUT -p tcp --dport 80 -j LOG --log-level info --log-prefix 'PORTA 80 >'
LOG DA PORTA 80 ACEITO

iptables -I INPUT -s 192.168.52.3 -p tcp --dport 80 -j ACCEPT
LIBEREI ACESSO DO SERVIDOR QUE EU QUERIA NA PORTA 80

iptables -I INPUT -s 200.xxx.xxx.xxx -p tcp --dport 80 -j ACCEPT
LIBEREI ACESSO A PORTA 80 PARA O IP DA MATRIZ (RELATÓRIO SARG E FWANALOG)

iptables -I INPUT -p tcp --dport 80 -j LOG --log-level info --log-prefix 'PORTA 80 DROP>'
LOG DA PORTA 80 RECUSADO

iptables -A INPUT -p tcp --dport 80 -j DROP
FECHEI A PORTA 80 PARA O RESTANTE

iptables -t nat -A PREROUTING -s 192.168.52.4 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -s 192.168.52.2 -p tcp --dport 80 -j REDIRECT --to-port 3128
REDIRECIONEI MEUS 2 USUÁRIOS PARA O SQUID

foi isso que eu fiz. Qualquer posta ae.


[3] Comentário enviado por f360c4 em 23/09/2010 - 11:28h

Infelizmente uma copia do artigo http://www.vivaolinux.com.br/artigo/Analizando-os-logs-do-IPTables?pagina=3 mudando apenas com o script de firewall
e so estou dizendo isso pois faltou informação, se seguir os passos exatamente iguais não funciona.

não me leve a mal, é apenas uma critica para você poder fazer melhor.


abraços velho



[4] Comentário enviado por silent-man em 23/09/2010 - 16:39h

### Libera Msn
echo Liberando Msn
iptables -A OUTPUT -p tcp --sport 1024:5999 --dport 1863:1863 -m state --state NEW -j ACCEPT
echo Msn Liberado ..... [ok]


Quem acessa o MSN é o seu Servidor?

Não entendi esta regra!

:)

[5] Comentário enviado por rafaelrsr em 23/09/2010 - 19:20h

Boa noite camarada f360c4, obrigado pelo post e pela dica mas acho que houve um equivoco. Porque.
No próprio artigo eu descrevo que a importância maior do mesmo é divulgar o livro do Iptables, pela facilidade que encontrei para
entender o iptables após a leitura do mesmo. Depois eu ainda citei e não menos de uma vez o artigo do que está no link que você
postou, e citei também que a importância era o script de firewall.
Realmente eu utilizei o artigo postado por você como referências de estudo para criar o meu. Já a parte em que você diz que se seguir
o meu artigo não funciona por favor posta a dificuldade que te ajudaremos, mas só para lembrar que se eu colocar tudo e você só
copiar e colar ai não terá aprendizado. Não me leva a mal também, é só para efeito de resposta.

Abraços.

[6] Comentário enviado por rafaelrsr em 23/09/2010 - 19:29h

Boa noite silent-man essa regra diz o seguinte:

iptables -A OUTPUT -p tcp --sport 1024:5999 --dport 1863:1863 -m state --state NEW -j ACCEPT

Tudo que sair para fora da rede OUTPUT, que for do protocolo tcp -P TCP com as portas de origem 1024 até 5999
e com as portas de destino 1863 e que for uma conexão com estado NOVO ele aceita -j ACCEPT

Isso que dizer que qualquer pacote da minha rede com essas portas de origem e de destino
ele aceita, mas são pacotes QUE SAEM da minha rede OUTPUT.

Espero ter ajudado. Abraço

[7] Comentário enviado por silent-man em 24/09/2010 - 14:27h

Dr, acho q há um equivoco.

A chain OUTPUT é para tudo que sai da própria máquina. Ou seja, do próprio firewall.

O que passa pela máquina é a chain FORWARD.

[8] Comentário enviado por ribafs em 24/09/2010 - 17:27h

Rafael acho que deveria ter feito o script tendo como base o livro para mostrar com mais enfase que o livro e bom mesmo.

[9] Comentário enviado por rafaelrsr em 24/09/2010 - 17:47h

Boa silent-man, mas para acessar o msn não tenho que sair pelo firewall?
Então com a regra OUTPUT eu não libero a saida por essas portas para fora, ou seja, para a internet? Com isso toda requisição que for feita nas portas de origem e para as portas de destino precisam sair pelo firewall (OUTPUT). O FORWARD seria para o caso de repasse de pacotes para a minha rede. Bom acho que expliquei legal, mas caso não vamos discutir mais rsrs

Abraço a todos.

[10] Comentário enviado por silent-man em 25/09/2010 - 12:08h

Vamos lá.

~# man iptables

filter:
This is the default table (if no -t option is passed). It contains the built-in chains INPUT (for packets destined to local sockets), FORWARD (for packets being routed through the box), and OUTPUT (for locally-generated packets)

Levando em consideração que sua política padrão seja DROP.

As tabelas são as seguintes:

1 - INPUT (para pacotes destinados aos soquetes local) Ou seja, todo pacote que se destina ao FIREWALL. Para você acessar o firewall remotamente via ssh você deve liberar o INPUT na sua porta ssh(padrão 22).

~# iptables -t filter -A INPUT -p tcp -s ip_do_seu_micro -d ip_do_firewall(ip que escuta na porta ssh) --dport 22 -j ACCEPT


2 - FORWARD (para pacotes sendo roteados através da máquina) Ou seja, tudo que vá para uma rede diferente da origem(de quem faz a requisição). Digamos que você tenha duas redes uma LAN 172.16.254.0/24 e uma rede DMZ 10.3.254.0/24(rede dos servidores). Você da sua LAN que chegar no servidor telnet na DMZ, você precisa liberar o FORWARD(tráfego para redes distintas).

~# iptables -t filter -A FORWARD -p tcp -s 172.16.254.24(seu ip) -d 10.3.254.23(servidor telnet) --dport 23 -j ACCEPT


3 - OUTPUT (para pacotes gerados localmente) Ou seja, tudo que é gerado no próprio firewall para fora dele, um ping por exemplo. Se você quer pingar o google você deve liberar o OUTPUT.

~# iptables -t filter -A OUTPUT -p icmp -d www.google.com -j ACCEPT


Veja bem, entenda isso como uma crítica boa construtiva.

[]s

[11] Comentário enviado por rafaelrsr em 25/09/2010 - 14:53h

Olá ribasfs, todo o script que fiz foi desenvolvido nas regras que aprendi com o livro.
Se você puder ler o livro verá que ele não mostra regras e sim ensina como usá-las.
Então resumindo eu criei as regras em cima do que aprendi no livro.
Acho que respondi sua questão.
Abraços.

[12] Comentário enviado por rafaelrsr em 25/09/2010 - 14:58h

Olá silent-man, claro que considero sua critica como construtiva e obrigado por enviá-la e também vi que você usou
o man do iptables para me mostrar como funciona as regras do pitables. Mas eu usei essa e resolveu meu
problema com o msn, então deduzi que a regra funcione como eu expliquei.
Mas obrigado pelo crítica.
Abraço.

[13] Comentário enviado por gabolli em 14/12/2011 - 08:31h

Bom dia, amigo tenho uma duvida vc no caso liberou o Sicoob, esta mesma regra serveria para eu liberar outros progrmas utilizo o M3Client, da mobiltec e um programa que utilizo para fazer captação de pedidos assim os vendedores com os aparelhos de celular envião os pacotes de pedidos para um servidor logo depois eu utilizo esse programa para baixar esse pacote este programa utiliza porta 8090, como eu libero esta porta e tambem como faço para ela passar direto pelo squid. ?

[14] Comentário enviado por rafaelrsr em 10/01/2012 - 22:18h

cara para liberar a porta vc vai usar a regra iptables -a input -8090 -j accept para passar pelo firewall e forward se for repassar para a rede, usa a regra antes de qualquer bloqueio para que vc tenha certeza da liberação e a regra que fiz para o sicob foi para liberar o acesso na porta 80 para minha rede, lembrando que ela tem que ser colocada antes da regra de repasse para a porta 3128 pois o firewall le as regra de cima para baixo como pilha, e respondendo sua pergunta se ela serve para liberar outra aplicação serve sim desde que siga a porta 80. Qualquer estou a disposição.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts