Firewall funcional de fácil manipulação

Bom galera, este é meu primeiro artigo, estou trabalhando com Linux a alguns meses e graças ao VOL eu hoje sinto a liberdade (hehe) que o Linux pode proporcionar. Neste artigo vou descrever como construir um firewall com uma ajudinha do Webmin para editar seus arquivos de configuração. Então mãos a obra.

[ Hits: 34.511 ]

Por: André Santos em 19/05/2010


Explicação de arquivos secundários



Usei alguns arquivos secundários com a finalidade de separar algumas informações do script para facilitar na hora de acessar os mesmos via web.

O formato dos arquivos segue como uma sugestão, pois os mesmos podem ser alterados de acordo com suas necessidades. Viva a liberdade!

O arquivo "portasabertas.conf" trata as portas de entrada no firewall, note que no script em si não trato as portas que estão atravessando o firewall. Sugiro o uso da seguinte forma:

tcp@22@SSH

Obs.: Note que eu usei um separador ("@") que pode ser alterado desde que mantenha-se os parâmetros no script, e também usei um comentário que na verdade não tem caráter de configuração apenas de informação, usei como medida contra esquecimento, hehe, é somente um comentário dentro do arquivo.

O arquivo "portasfoward.conf" cuida dos redirecionamentos, ou seja, tudo que chegar até o servidor e tiver que ser redirecionado para outro computador. Sugiro o uso de seguinte forma:

0@tcp@5800:5999@10.0.0.80@vnc server

Segue-se o mesmo critério que o anterior, só que agora nos deparamos com duas situações inusitadas, existe uma condição de aplicação das regras no firewall, ou seja, um STATUS de operação, se você precisar redirecionar apenas uma porta usa-se o status "0" (zero), e a lógica acima.

Caso precise redirecionar uma porta mudando a mesma deverá ser usado o esquema abaixo mudando o STATUS, ou seja, coloca-se "1" (UM) no primeiro campo, e no 5° campo coloca-se a porta de destino ou seja a porta que deve estar aberta no estação de origem.

Ex.: 1@tcp@5000@10.0.0.80@3389@rdp muda porta

O próximo arquivo é o "portasmascaradas.conf", este por sua vez trata as portas que atravessam o firewall e devem ser mascaradas, não possui nenhum segredo de uso, mas muita atenção, no exemplo do firewall foi criado um "NAT" de portas especificas, que compõe uma camada extra de segurança, então tudo que tiver que sair para a Grande REDE deve ser mascarado.

Modo de USO:

tcp@80@web

Obs.: Para funcionar de primeira a navegação nas estações deve estar no arquivo as seguintes portas: 80@tcp@, 53@udp@

E por fim temos o "sitesdesativados.conf", nenhum segredo neste arquivo, somente iremos colocar aqui os sites que devem ser bloqueados para a rede interna.

Página anterior     Próxima página

Páginas do artigo
   1. Reunindo tudo...
   2. Explicação de arquivos secundários
   3. Configuração dos comandos no Webmin
   4. Finalizando o nosso firewall
Outros artigos deste autor

Hotspot - Atualização - CoovaChilli

Hotspot rápido com Coovachilli

Leitura recomendada

NAT com firewall - simples, rápido e funcional

Servidor Firewall-Proxy utilizando CentOS, IPtables, Squid, DHCP, DNS e outros

Iptables detalhado

Iptables 1.3.4 com Layer 7 e Kernel 2.6.14 no Debian 3.1

Implementando prioridade nos serviços com TOS no Iptables

  
Comentários
[1] Comentário enviado por cvs em 20/05/2010 - 08:06h

Interessante pra poder ter uma base pra fazer algo mais personalizado hein...
Boa iniciativa.

[2] Comentário enviado por mcnd2 em 20/05/2010 - 18:48h

Muito bom.

Simples a deixando a liberdade a todos...

[3] Comentário enviado por gostt em 21/05/2010 - 14:41h

André,
parabéns, muito bom seu artigo, alem de uma boa didática para o conteúdo, você citou de onde vem a verdadeira sabedoria.
Tiago 1:5

Um grande abraço

Paulo Henrique

[4] Comentário enviado por andfeh em 24/05/2010 - 23:31h

Opa, muito obrigado a todos. Espero que eu possa contribuir ainda mais, Valeu Paulo, sem esta sabedoria nada eu estaria sabendo.

Abraço, até mais.

[5] Comentário enviado por crandrade em 17/06/2010 - 09:24h

Andre,

Comecei a estudar iptables agora, montei um laboratorio com maquinas virtuais simulando duas redes com um firewall (iptables) no meio, gostaria de saber como faço para bloquear o trafego entre as duas redes e ir liberando aos poucos somente o necessario. As duas redes ja estão se falando.

Abraços.

[6] Comentário enviado por andfeh em 18/06/2010 - 22:35h

Seguinte, você tem que partir do principio, que entre redes separadas, você usará inicialmente a tabela FILTER, cadeia FORWARD para trafegar entre uma rede e outra...

ai por exemplo a rede "A"=192.168.0.XXX/24 e a rede "B"=192.168.10.XXX/24, ok?

entao você cria uma regra + ou - assim:

iptables -t filter -A FORWARD -s 192.168.0.XXX/24 -d 192.168.10.XXX/24 -j DROP
iptables -t filter -A FORWARD -d 192.168.0.XXX/24 -s 192.168.10.XXX/24 -j DROP

tradução: a primeira regra diz que tudo/qualquer protocolo que vier da rede "A" para rede "B" vai seja negado e vice versa...

e assim por diante...

mas lembre-se quando você for adicionar uma regra para aceitar algum tráfego entre as redes vocÊ tem que adicionar antes que o tráfego seja "DROPADO" entre elas, ok?

até mais.

[7] Comentário enviado por ton.work em 31/08/2010 - 16:44h

André Santos,

estou usando seu firewall e estou gostando muito, tenho em rede dois servidores e cada um com uma placa gv800 e nela precisaria abilitar as seguintes portas:

81
2100
2101
6551

82
4550
2101
6551

abilitei usando a porta 81 e fiz um teste de portas no site shields up e a porta estava aberta, será que tem algum esquema pra deixar essa porta aberta mas em modo Stealth

ficou assim o firewall
#!/bin/bash

## VARIABLES ##

IFWAN=`ifconfig | sed -n "1p" | awk {'print $1'}` # Filtra Saida do comando 'ifconfig' - Automatiza a implantação do Script
IPWAN=`ifconfig | sed -n "2p" | awk {'print $3'}`
IFLAN=`ifconfig | sed -n "11p" | awk {'print $1'}`
IPLAN=`ifconfig | sed -n "12p" | awk {'print $3'}`
LAN=192.168.1.10/24

## PROGRAMS ##

IPT=`which iptables`
EC=`which echo`
MODUP=`which modprobe`

## FIREWALL START ##

START_FW(){
echo " [ Firewall Starting ... ]"

# LOAD MODULES

$MODUP ip_tables
$MODUP ip_conntrack
$MODUP iptable_filter
$MODUP iptable_mangle
$MODUP iptable_nat
$MODUP ipt_LOG
$MODUP ipt_limit
$MODUP ipt_state
$MODUP ipt_REDIRECT
$MODUP ipt_owner
$MODUP ipt_REJECT
$MODUP ipt_MASQUERADE
$MODUP ip_conntrack_ftp
$MODUP ip_nat_ftp
######
#liberando acesso interno da rede
iptables -A INPUT -p tcp --syn -s 192.168.1.10/255.255.255.0 -j ACCEPT &&
iptables -A OUTPUT -p tcp --syn -s 192.168.1.10/255.255.255.0 -j ACCEPT &&
iptables -A FORWARD -p tcp --syn -s 192.168.1.10/255.255.255.0 -j ACCEPT &&

#compartilhando a web na rede interna
iptables -t nat -A POSTROUTING -s 192.168.1.10/255.255.255.0 -o eth1 -j MASQUERADE &&
echo 1 > /proc/sys/net/ipv4/ip_forward &&
######
# POLICES THIS FIREWALL

$IPT -t filter -P INPUT DROP
$IPT -t filter -P FORWARD DROP
$IPT -t filter -P OUTPUT ACCEPT

# ENABLE LOOPBACK

$IPT -t filter -A INPUT -i lo -j ACCEPT
$IPT -t filter -A OUTPUT -o lo -j ACCEPT

# ENABLE IMPORTANT PORTS

$IPT -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT
$IPT -t filter -A INPUT -m state --state RELATED -j ACCEPT
DOOROPEN=`cat "/home/antonio/portasabertas.conf"`
for n in $DOOROPEN; do
PROTOCOL=`$EC $n | cut -d '@' -f 1`
DOOR=`$EC $n | cut -d '@' -f 2`
if [ "$PROTOCOL" = "tcp" ]; then
$IPT -t filter -A INPUT -p tcp --dport $DOOR -j ACCEPT
elif [ "$PROTOCOL" = "udp" ]; then
$IPT -t filter -A INPUT -p udp --dport $DOOR -j ACCEPT
fi
done

# BLOCK SITES FROM INTRANET

$IPT -t filter -A FORWARD -m state --state ESTABLISHED -j ACCEPT
$IPT -t filter -A FORWARD -m state --state RELATED -j ACCEPT
SITES=`cat "/server/firewall/sitesdesativados.conf"`
for n in $SITES ; do
$IPT -t filter -A FORWARD -s $LAN -d $n -j DROP
$IPT -t filter -A FORWARD -s $n -d $LAN -j DROP
done

# PING OF DEATH

echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all
$IPT -N PING
$IPT -A INPUT -p icmp --icmp-type echo-request -j PING
$IPT -A PING -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPT -A PING -j DROP

# SYN-FLOOD

echo "0" > /proc/sys/net/ipv4/tcp_syncookies
$IPT -N syn-flood
$IPT -A INPUT -i $IFWAN -p tcp --syn -j syn-flood
$IPT -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPT -A syn-flood -j DROP

# BRUTE-SSH

$IPT -N BRUTE-SSH
$IPT -A INPUT -i $IFWAN -p tcp --dport 22 -j BRUTE-SSH
$IPT -A BRUTE-SSH -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPT -A BRUTE-SSH -j DROP

# ANTI-SPOOFINGS

$IPT -A INPUT -s 10.0.0.0/8 -i $IFWAN -j DROP
$IPT -A INPUT -s 127.0.0.0/8 -i $IFWAN -j DROP
$IPT -A INPUT -s 172.16.0.0/12 -i $IFWAN -j DROP
$IPT -A INPUT -s 192.168.1.0/16 -i $IFWAN -j DROP

# SHEALT SCAN

$IPT -A FORWARD -p tcp --tcp-flags SYN,ACK, FIN, -m limit --limit 1/s -j ACCEPT

# ENABLE FORWARDING

DOORCROSS=`cat "/home/antonio/portasfoward.conf"`
for n in $DOORCROSS; do
STAT=`$EC $n | cut -d '@' -f 1`
PROTO=`$EC $n | cut -d '@' -f 2`
PORT_IN=`$EC $n | cut -d '@' -f 3`
IPTARGET=`$EC $n | cut -d '@' -f 4`
PORT_OUT=`$EC $n | cut -d '@' -f 5`
if [ "$STAT" = "0" ]; then
$IPT -t filter -A FORWARD -p $PROTO --dport $PORT_IN -j ACCEPT
$IPT -t filter -A FORWARD -p $PROTO --sport $PORT_IN -j ACCEPT
$IPT -t nat -A PREROUTING -p $PROTO --dport $PORT_IN -j DNAT --to $IPTARGET
$IPT -t nat -A POSTROUTING -d $IPTARGET -j SNAT --to $IPLAN
elif [ "$STAT" = "1" ]; then
$IPT -t filter -A FORWARD -p $PROTO --dport $PORT_IN -j ACCEPT
$IPT -t filter -A FORWARD -p $PROTO --sport $PORT_IN -j ACCEPT
$IPT -t nat -A PREROUTING -p $PROTO --dport $PORT_IN -j DNAT --to $IPTARGET:$PORT_OUT
$IPT -t nat -A POSTROUTING -d $IPTARGET -j SNAT --to $IPLAN
fi
done

# ENABLE PROXY

#$IPT -t nat -A PREROUTING -i $IFLAN -p tcp --dport 80 -j REDIRECT --to-port 3128
#$IPT -t nat -A PREROUTING -s $LAN -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -p tcp -m multiport -s 192.168.1.10/24 --dport 80,443 -j REDIRECT --to-ports 3128
#ENABLE MASQUERADE

DOORMASQ=`cat "/server/firewall/portasmascaradas.conf"`
for n in $DOORMASQ; do
PROTO=`$EC $n | cut -d '@' -f 1`
PORT=`$EC $n | cut -d '@' -f 2`
if [ "$PROTO" = 'tcp' ]; then
$IPT -t filter -A FORWARD -p tcp --dport $PORT -j ACCEPT
$IPT -t filter -A FORWARD -p tcp --sport $PORT -j ACCEPT
$IPT -t nat -A POSTROUTING -o $IFWAN -p tcp --dport $PORT -j MASQUERADE
elif [ "$PROTO" = 'udp' ]; then
$IPT -t filter -A FORWARD -p udp --dport $PORT -j ACCEPT
$IPT -t filter -A FORWARD -p udp --sport $PORT -j ACCEPT
$IPT -t nat -A POSTROUTING -o $IFWAN -p udp --dport $PORT -j MASQUERADE
fi
done

echo " [ OK ]"
}

STOP_FW(){
echo " [ Firewall Stopping ... ]"
## CLEAN RULES NETFILTER ##

$IPT -t filter -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -t filter -X
$IPT -t nat -X
$IPT -t mangle -X
$IPT -t filter -Z
$IPT -t nat -Z
$IPT -t mangle -Z

## DISABLE ROUTING ##

$EC "0" > /proc/sys/net/ipv4/ip_forward

echo " [ OK ]"
}

case "$1" in
"start") START_FW ;;
"stop") STOP_FW ;;
"restart") STOP_FW; START_FW ;;
*) echo
$EC " [ FIREWALL: start, stop ou restart. ]"
$EC " [ Uso incorreto do firewall, restart em ]"
$EC " [ 3 segundos. ]"
echo
sleep 3
/server/firewall/sh.firewall.conf restart
esac

[8] Comentário enviado por andfeh em 10/09/2010 - 10:36h

Opa, bom dia, ton.work, explica melhor a topologia de sua rede para que eu possa te ajudar...

Até Mais.

[9] Comentário enviado por sobralmaster em 09/06/2011 - 16:12h

Boa tarde..

Li os seus postssobre coovachilli e sobre firewall, já ha algum tempo eu venho me dedicando a este tipo de trabalho.

Ja passei por outros softwares para hotspot e pretendo testar este pois me parece uma ótima solução. Quanto ao seu Firewall, Show de bola. Muito bom e seguindo a sua linha de raciocínio ninguém precisa "meter" a mão nos códigos para liberar ou Bloquear alguma cosia, muito bom mesmo

Está de parabens, a galera que está começando agora agradece..

Que Deus continue nos dando a sabedoria necessária.

Um fortíssimo abraço

Sobralmaster


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts