Linux

firewall linux

firewall linux

O firewall é fundamental para a segurança de uma rede, no caso do linux (kernel que veremos neste assunto) Iptebles é uma ferramenta que trabalha integrada ao kernel através do Netfilter, aplicação criada por Rusty e Marc que por volta do ano 2000 desde então essa equipe cresceu muito, Iptables constitui uma ferramenta de alto desempenho que atende o usuário de diversos níveis que desejem segurança básica em seu sistema, até administradores de grandes organizações que precisam de um controle sobre o trafego de dados em sua rede.

A filtragem de pacotes que o netfilter realiza através da leitura do cabeçalho do pacote nos possibilita o controle sobre esse tráfego, cada pacote é comparado com regras predefinidas podendo assim realizar controle do entra (INPUT), sai (OUTPUT) ou do que passa pelo firewall (FORWARD) ou ate mesmo um redirecionamento do tipo NAT (Network Address Translation), O item de configuração do kernel para a filtragem de pacotes é o Network Packet Filtering.

O iptables contém 3 tabelas, para cada tipo de operação existe uma tabela específica contém chains (correntes) que são definidas targets (ações) para pacotes que correspondem a determinada corrente.

 

FILTER – é a tabela padrão e suas chains são INPUT (entrada de pacotes no localhost), FORWARD (pacotes que passam pelo localhost) e OUTPUT (para pacotes gerados pelo localhost) esta tabela é a mais usada para se construir um firewall.

 

NAT – essa tabela é responsavél pelo controle de pacotes que criam novas conexões e contém chains PREROUTING (pacote que chegam ao OS e antes de passarem seram roteados), OUTPUT e POSTROUTING (para os pacotes que ao sairem da rede interna inclusive o localhost teram seu cabeçalho modificado).

 

MANGLE – usada para alterações específicas nos pacotes.

-P Define uma regra padrão
-A Acrescenta uma nova regra as existentes.
-D Apaga-se uma regra
-L Lista as regras existentes
-F Apaga todas as regras
-I Insere uma regra nova acima da lista existente
-h Muito útil, pois mostra a ajuda
-R Substitui uma regra
-C Faz uma checagem das regras existentes
-Z Zera uma regra específica
-N Cria uma nova regra com um nome
-X Exclui uma regra específica pelo seu nome

A cadeia FORWARD tem um tratamento especial na kernel do Linux, que por padrão bloqueia tráfego por ela. Para permitir seu funcionamento, é necessário configurar o seguinte parâmetro da kernel do Linux dentro do arquivo /etc/sysctl.conf

net.ipv4.ip_forward=1

FLUXOGRAMA

As opções

tendo uma cadeia seram necessárias regras para o controle de fluxo do netfilter, uma regra dada não terá efeito sobre todas as cadeias já que uma regra definida na interface de saída do firewall não terá efeito na chain PREROUTING pois a decisão de rateamento ainda não foi especificada anteriormente. temos abaixo algumas opções que considero as mais usadas

 

-p PROTOCOLO: especifica um protocolo (por exemplo tcp ou udp).

-s ENDEREÇO: especifica um endereço de origem.

-d ENDEREÇO: especifica um endereço de destino.

-i INTERFACE: especifica a interface de rede na qual o pacote ingressou.

-o INTERFACE: especifica a interface de rede na qual o pacote irá sair da máquina.

-j AÇÃO: define uma ação.

 

Quando um pacote casa com regra de seleção. Esta ação pode ser uma das ações padrão abaixo descriminadas contudo muito comum vermos apenas o uso de ACCEPT ou DROP. temos abaixo algumas opções que considero as mais usadas

  • ACCEPT: aceita o pacote, e diz ao netfilter para continuar o processamento do pacote na próxima cadeia/tabela.
  • DROP:     diz ao netfilter para ignorar completamente o pacote
  • REJECT: rejeita o pacote e retorna a informação de rejeição para o host     de origem deste pacote (não muito usado por questão de segurança).
  • REDIRECT:  Ele redireciona o pacote para a própria máquina, alterando o IP de destino para o endereço principal da interface de entrada (pacotes gerados localmente são mapeados para o endereço 127.0.0.1).
  • MARK:     Marca os pacotes para roteamento no kernel.
  • RETURN: instrui o netfilter para parar de processar a cadeia em questão e     continuar na próxima regra na cadeia anterior
  • LOG: Desta maneira, é possível identificar facilmente se o seu firewall está bloqueando algum tráfego que não deveria. O uso deste alvo, dá acesso a opção –log-prefix, que permite incluir um prefixo na depuração.
  • MASQUERADE: esse     trabalha na tabela NAT juntamente com a POSTROUTING, o masquerading é equivalente a especificar um mapeamento para o endereço IP da     interface que o pacote vai fora da rede, serve para trocar o endereço IP de uma rede interna por um IP valido de conexão do firewall que faz o roteamento.
  • SNAT:     Souce NAT essa ação se da na chegada de pacotes no kernel só trabalha na tabela     NAT e nas chains POSTROUTING e OUTPUT ele especifica que o enderço de destino deve ser alterado.
  • DNAT:     Destination NAT essa     ação se da na chegada de pacotes no kernel só trabalha na tabela NAT e nas chains PREROUTING e OUTPUT ele especifica que o enderço de destino deve ser alterado. E tem como opeção –to-destination.

 

Colocando regras para funcionar

 

Segundo o manual do utilitário iptables, existem diversas maneiras de se acrescentar / remover pares de regras / ação. Todas são operações discretas, o que sugere que criemos um Shell Script contendo todas as chamadas discretas das regras que irão compor o firewall completo.

Para adicionar discretamente uma regra (ao final das pré existentes), a forma geral é:

 

# iptables -t TABLE -A CADEIA REGRAS -j ALVO

EXEMPLO de FIREWALL com dois links.

 

#!/bin/sh

 

IPT=”/sbin/iptables”

EMB=”0.0.0.0″

BASE=”0.0.0.0″

 

CPD_IP=”0.0.0.0″

CPD_PT=”13000 32000 domain imap imaps pop3 3000 smtp 3388 3389 995 21 22 https”

 

MSN_IP=”0.0.0.0″

MSN_PT=”1863 53 pop3 smtp 3388 3389 995 22 imap imaps domain”

 

VPN_IP=”192.168.0.0/16″

VPN_PT=”1:65535″

 

GOV_IP=”200.238.112.0/24 200.201.174.204 200.201.173.68 200.201.166.0/24 161.148.185.130 cmt.caixa.gov.br 200.238.112.2 200.164.224.14 200.199.123.243 161.148.185.46 161.148.185.120 161.148.185.0/24 200.201.174.0/24 200.201.160.0/20 200.238.107.0/24″

GOV_PT=”21,1049,3456,http,https,ftp-data,1024,3007,4449,3456,2631,8017,25050,5017,1366″

 

case “$1” in

start)

#VPN

$IPT -t mangle -A OUTPUT -p udp -d $BASE –dport 1194 -j MARK –set-mark 0x1

$IPT -t mangle -A OUTPUT -p udp -s $EMB –sport 1194 -d $BASE -j MARK –set-mark 0x1

$IPT -t mangle -A OUTPUT -p tcp -s $EMB ! -d 192.168.4.0/24 –dport 22 -j MARK –set-mark 0x1

$IPT -t mangle -A OUTPUT -p tcp -s $EMB ! -d 192.168.4.0/24 –sport 22 -j MARK –set-mark 0x1

$IPT -t mangle -A OUTPUT -p tcp -s $EMB –sport 2222 -j MARK –set-mark 0x1

$IPT -t mangle -A OUTPUT -d $EMB -p icmp -j MARK –set-mark 0x1

$IPT -t mangle -A OUTPUT -s $EMB -p icmp -j MARK –set-mark 0x1

 

$IPT -t nat -I POSTROUTING -o eth2 -j MASQUERADE

$IPT -t nat -I POSTROUTING -o ppp0 -j MASQUERADE

 

#Marcacao da nova VPN

$IPT -t mangle -I OUTPUT -p udp –dport 1195 -j MARK –set-mark 0x2

$IPT -t mangle -I OUTPUT -p udp –sport 1195 -j MARK –set-mark 0x2

$IPT -I FORWARD -i tun1 -o eth1 -j ACCEPT

$IPT -I FORWARD -o tun1 -i eth1 -j ACCEPT

$IPT -t mangle -I PREROUTING -s 192.168.4.246 -p tcp -m multiport –dport 5611,4550,5550,6550,4551,5551 -j MARK –set-mark 0x3

$IPT -t mangle -I PREROUTING -s 192.168.4.246 -p tcp -m multiport –sport 5611,4550,5550,6550,4551,5551 -j MARK –set-mark 0x3

$IPT -t mangle -I PREROUTING -s 192.168.4.247 -p tcp -m multiport –dport 5611,4550,5550,6550,4551,5551 -j MARK –set-mark 0x3

$IPT -t mangle -I PREROUTING -s 192.168.4.247 -p tcp -m multiport –sport 5611,4550,5550,6550,4551,5551 -j MARK –set-mark 0x3

 

# FORWARD

$IPT -P FORWARD DROP

$IPT -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT

 

#Proteção contra Syn-floods

iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT

 

#Proteção contra port scanners ocultos

iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/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

 

#Bloqueando ping de um ip

iptables -A INPUT -p icmp -s 192.168.1.1/24 -j DROP

 

#Bloqueando pacotes fragmentados

iptables -A INPUT -i INTEXT -m unclean -j log_unclean

iptables -A INPUT -f -i INTEXT -j log_fragment

 

 

#————————————————————-

## GOV – Servicos publicos

#————————————————————-

 

for i in $GOV_IP ; do

$IPT -A FORWARD -p tcp -d $i -m multiport –dport $GOV_PT -j ACCEPT

$IPT -A FORWARD -p udp -d $i -m multiport –dport $GOV_PT -j ACCEPT

done

 

#————————————————————-

# Grupo VPN

#————————————————————-

 

$IPT -N VPN

for h in $VPN_IP ; do

$IPT -A FORWARD -s $h -d $h -i tun0 -j VPN

$IPT -A FORWARD -s $h -d $h -o tun0 -j VPN

done

 

for i in $VPN_PT ; do

$IPT -A VPN -p tcp -m multiport –dport $i -j ACCEPT

$IPT -A VPN -p udp -m multiport –dport $i -j ACCEPT

done

 

$IPT -A VPN -p icmp -j ACCEPT

 

$IPT -A VPN -j LOG –log-prefix “VPN->NAO PERMITIDO ”

$IPT -A VPN -j DROP

 

#————————————————————-

## Grupo ACESSO MSN

#————————————————————-

 

$IPT -N MSN

for h in $MSN_IP ; do

$IPT -A FORWARD -s $h -d 0/0 -o ppp0 -j MSN

done

 

for i in $MSN_PT ; do

$IPT -A MSN -p tcp -m multiport –dport $i -j ACCEPT

$IPT -A MSN -p udp -m multiport –dport $i -j ACCEPT

done

 

$IPT -A MSN -j LOG –log-prefix “MSN->NAO PERMITIDO ”

$IPT -A MSN -j DROP

 

#————————————————————-

## Grupo CPD

#————————————————————-

$IPT -N CPD

for h in $CPD_IP ; do

$IPT -A FORWARD -s $h -d 0/0 -j CPD

done

 

for i in $CPD_PT ; do

$IPT -A CPD -p tcp -m multiport –dport $i -j ACCEPT

$IPT -A CPD -p udp -m multiport –dport $i -j ACCEPT

done

 

$IPT -A CPD -j LOG –log-prefix “CPD->NAO PERMITIDO ”

$IPT -A CPD -j DROP

 

#—————————————————————–

##Loga requisicoes de maquinas desconhecidos

#—————————————————————–

$IPT -A FORWARD -j LOG –log-prefix “SEM GRUPO->NAO PERMITIDO ”

 

/sbin/service iptables save

;;

stop)

$IPT -F

$IPT -X CPD

$IPT -X VPN

$IPT -X MSN

$IPT -t nat -F

$IPT -t mangle -F

$IPT -P FORWARD ACCEPT

;;

save)

/sbin/service iptables save

;;

restart)

/root/firewall.sh stop ; /root/firewall.sh start

;;

*)

echo “Use (start|stop|save)”

;;

esac

 

exit 0

 

Conclusão

 

A segurança de um host ou ate mesmo uma rede nos dias de hoje tem uma importância enorme ja que nos deparamos com várias novidades em relação aos ataques de crackers, uma firewall bem configurado pode lhe proporcionar essa seguraça sem duvida e a baixo custo ja que o linux é SOFTWARE LIVRE.

fontes:

http://ornellas.apanela.com/dokuwiki/pub:pt-br:linuxfwrt

www.vivaolinux.com.br

man page  iptables

Linux LPI – Linux Magazine

Certificação Linux LPI – o’reilly



Standard