você está aqui: Home  → Arquivo de Mensagens Curso Gratuito sobre Expressões Regulares, com o Prof.  Julio Neves

Firewall PF - Package Filter

Colaboração: Ali Faiez Taha

Data de Publicação: 17 de fevereiro de 2012

Nativo no Sistema Operacional OpenBSD e já portado para outros baseados em BSD, tais como FreeBSD, PCBSB, NetBSD e etc.

Permite fazer NAT, controle de banda, priorização de pacotes e etc.

A grande vantagem do PF, sobre outros tipos de sistemas de Firewall, é possibilidade de criação de macros ( que são variáveis, como em programas, definidas pelo usuário e que podem armazenar ips, interfaces, etc ), tabelas ( listagem de endereços que são filtrados por uma única regra ), scrub ( reprocessamento de pacotes para normalização e desfragmentação ), NAT e regras de filtragem que podem ser feitas de acordo com o modo em que chegam as interfaces de uma máquina.

Um bom tutorial sobre o PF: http://www.openbsd.org/faq/pf/pt/index.html

O objetivo desta dica é criar uma rede Intranet controlada através do Firewall PF. O Sistema Operacional utilizado é o FreeBSD 9.0

O servidor contém duas placas de rede, uma com IP A.B.C.D e a outra que controla a Intranet e com IP 192.168.0.X.

Nas distribuições *BSD o Kernel já está preparado para trabalhar com o PF.

Pode-se fazer alterações no Kernel do FreeBSD e efetuar configurações nos arquivos relacionados ao Firewall PF.

Configurações de Kernel

Editar o Kernel e adicionar o seguinte conteúdo

device        pf
device        pflog
device        pfsync   
options       ALTQ
options       ALTQ_CBQ        # Class Bases Queuing (CBQ)
options       ALTQ_RED        # Random Early Detection (RED)
options       ALTQ_RIO        # RED In/Out
options       ALTQ_HFSC       # Hierarchical Packet Scheduler (HFSC)
options       ALTQ_PRIQ       # Priority Queuing (PRIQ)
options       ALTQ_NOPCC      # Required for SMP build

Essa configuração permite que se tenha Firewall sincronizados (pfsync) e controle de uso de banda (ALTQ). Pode-se alterar as configurações para um firewall mais simples.

Siga o tutorial citado acima para fazer uma configuração de acordo com suas necessidades.

Depois do Kernel compilado e instalado, deve-se configurar o arquivo de inicialização (/etc/rc.conf) com os seguintes parâmetros:

pf_enable="YES"
pf_rules="/etc/pf.conf"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pf/pflog"
pflog_flags=""

Isso diz que o Firewall PF está habilitado, indica o arquivo de configuração e os logs gerados pelo Firewall serão armazenados em (/var/log/pf/pflog)

O próximo passo é configurar o arquivo de controle do Firewall PF (/etc/pf.conf)

Exemplo de configuração

# Rede INTRANET controlada 

ext_if  = "rl0"
ext_addr = "A.B.C.D/32"
int_if  = "vr0"
int_ip  = "192.168.0.1/32"
int_net = "192.168.0.0/24"
portas_tcp = "{ 25, 80, 443, 8000, 50000 }"
portas_udp = "{ 50000 }"
popimap = "{ 110, 995, 143, 993 }"

# Tabela contendo todos endereços IP atribuidos ao firewall
table < private > const { 127/8, 192.168/16, 172.16/12, 10/8 }
table < firewall > const { self }
table < intranet > const { 192.168.0.0/24 }
table < permitidos > const { A.B.C.D/32, E.F.G.H/32 } 
table < rdesktop > const {A.B.C.D/32, E.F.G.H/32 } 
table < scanners > persist file "/etc/scanners"

# Regras para limites
set limit { states 10000, frags 5000 }
set optimization normal
set block-policy drop
set require-order yes
set loginterface $ext_if
set loginterface $int_if

# Faz scrub em pacotes que chegam
scrub all

# Redireciona as conexões na porta 3189 para o IP 192.168.0.2
nat on $ext_if from $int_net to any -> ($ext_if)
rdr on $ext_if inet proto tcp from < rdesktop > to $ext_addr port 3389 -> 192.168.0.2 port 3389 

# Define o política padrao - Libera tudo
pass in all
pass out all

# Libera RDESKTOP para IPs permitidos
pass in on $ext_if inet proto tcp from < rdesktop > to < permitidos > port 3389 

# Bloqueio de "OS Fingerprinting" do nmap (opção -O), que tenta
# descobrir o sistema operacional do host.
# Bloqueia os pacotes TCP que tem flags que podem levar a
# identificacao do SO.
block in log quick proto tcp flags FUP/WEUAPRSF
block in log quick proto tcp flags WEUAPRSF/WEUAPRSF
block in log quick proto tcp flags SRAFU/WEUAPRSF
block in log quick proto tcp flags /WEUAPRSF
block in log quick proto tcp flags SR/SR
block in log quick proto tcp flags SF/SF

# Aceita tráfego em qualquer direção na interface de loopback 
pass quick on lo0 all
pass out quick on lo0 all

# RFC1918
block drop in  quick on $ext_if from < private > to any
block drop out quick on $ext_if from any to < private >

# Início regras extras 
# Bloqueia todos os pacotes de entrada mas permite o SSH.
# Permite passar todos os pacotes de saída e faz os logs dos pacotes bloqueados.
# Permite uma taxa de conexão 1/10, ou seja: 10 conexões por minutoi, e máximo de 10 conexões.

block in log on $ext_if all

pass in on $ext_if inet proto tcp from < rdesktop > to any port 3389 

pass  in on $ext_if proto tcp from any to $ext_if port 22 \
        flags S/SA  (max-src-conn 10, max-src-conn-rate 1/10, \
        overload < scanners >  flush global)

# Bloqueia o acesso dos proibidos por excesso de tentativas de SSH
block drop in log on $ext_if proto tcp from < scanners > to $ext_if port 22
pass in on $ext_if proto tcp from any to $ext_if port $portas_tcp flags S/SA 
pass in on $ext_if proto udp from any to $ext_if port $portas_udp 

# traceroute
pass  in on $ext_if inet proto udp from any to any port 33433 >< 33626 
pass  in  on $ext_if inet proto icmp all icmp-type echoreq
#
#regras de saída
#
pass  out on $ext_if proto { tcp, udp, icmp } all 

# Regras para segurar E-Mail interno só para o servidor.
block out log on $int_if proto tcp from $int_net to any port 25
pass out on $int_if proto tcp from $int_net to $int_ip port 25 
block in log on $int_if proto tcp from any to any port smtp
block out log on $int_if proto { tcp, udp } from $int_net to any port $popimap  

# Fim das regras extras 

# Ativa proteção contra SPOOF na interface interna
antispoof quick for $int_if inet

# Permite conexões ssh vindas apenas da rede interna, e se for 
# de um computador confiável, 192.168.0.2. usa "block return" de 
# forma que um TCP RST é enviado para derrubar conexões bloqueadas.
# usa "quick" para que esta regra não seja invalidada por alguma 
# regra "pass" abaixo.
block return in quick on $int_if proto tcp from ! 192.168.0.2  to $int_if port ssh flags S/SA

# Permite apenas os IPs permitidos a fazer conexão SSH
pass in log on $ext_if proto tcp from < permitidos > to ! < firewall > \
   port ssh flags S/SA synproxy state

# Limita em 10 conexões SSH simultaneas, vindas dos IPs autorizados
pass in quick on $ext_if inet proto tcp from < permitidos > to $ext_addr \
   port 22 flags S/SA (max-src-states 10)
pass in quick on $ext_if inet proto { tcp, udp } from < permitidos > to $ext_if \
   port 80 flags S/SA  

# Permit incoming ICMP echo requests to this host
pass in quick log-all on $ext_if inet proto icmp all icmp-type 8 code 0 

# Libera NETBIOS apenas para a Intranet
pass in log proto { tcp, udp } from < intranet > to < intranet > port { 137, 138, 139 }

### Bloqueia acesso externo para portas 137,138 e 139
block out log proto { tcp, udp } from < intranet > to $ext_if  port { 137, 138, 139 }

Examine as regras e veja o que está sendo permitido e o que está sendo negado.

O serviço SMTP está bem controlado? Como ele está para a rede Interna?

E os controles de conexão SSH? Como estão?

Tem algum NAT rodando? Como identificar?

E a rede NetBIOS? Está controlada?

Outras configurações necessárias

Colocar no arquivo (/etc/sysctl.conf) o seguinte, para permitir redirecionamento de Pacotes IP:

net.inet.ip.forwarding=1

Isso deve ser feito pois o Firewall PF vai trabalhar como roteador também.

Criar o diretório /var/log/pf e o arquivo /var/log/pf/pflog, onde serão armazenados os logs do Firewall.

Ajustar o recurso de Rotação de Logs no arquivo /etc/newsyslog.conf. Com a configuração abaixo será armazenado logs de 365 dias.

/var/log/pf/pflog 600  365   100  @T00  JB    /var/run/pflogd.pid

Comandos para controle do Firewall PF

O comando pfctl é essencial. Sua utilização é bastante simples e apresenta poucos argumentos de controle.

Alguns comandos úteis:

Desabilitar o Firewall pfctl -d
Habilitar o Firewall pfctl -e
Ativar as regras do Firewall pfctl -f /etc/pf.conf
Limpar as regras do Firewall /sbin/pfctl -F rules
Lista as tabelas existentes pfctl -s Tables
Lista o conteúdo de uma tabela pfctl -t permitdos -T show
Adicionar um IP a uma tabela pfctl -t spammers -T add 218.70.0.0/16
Elimina uma IP de uma tabela pfctl -t spammers -T delete 218.70.0.0/16
Limpa as regras de NAT e recarrega o Firewall /sbin/pfctl -F nat && /sbin/pfctl -N /etc/pf.conf
Limpa todas as regras de filtro e recarrega o Firewall /sbin/pfctl -F rules && /sbin/pfctl -R /etc/pf.conf
Mostra informações dos filtros (estatísticas e contadores) pfctl -s info
Mostra a lista atual de filtros de MAPs e redirecionamento e sessões ativas /sbin/pfctl -s state
Estatísticas de cada regra individual /sbin/pfctl -s rules -v
Mostra o uso da memória pfctl -s memory
Mostra informações gerais pfctl -s info
Mostra todas as informações do Firewall pfctl -s all
Mais detalhes do comando pfctl man pfctl
O arquivo /var/log/pf/pflog é um arquivo binário. Deve-se usar o tcpdump para examinar o seu conteúdo tcpdump -i pflog0
Leitura dos logs de atividades do PF tcpdump -n -e -ttt -r /var/log/pf/pflog

Criar uma tabela a partir de um arquivo texto que contém uma lista de endereços IP que fazem SPAM: Acrescentar ao arquivo (/etc/pf.conf) o seguinte trecho:

    table  persist file "/etc/spammers"
    block in on rl0 from  to any

Comandos, aplicativos e Daemons para controle e análise de comportamento do Firewall PF:

  • Comando: pftop - Verifica tráfego de dados em tempo real pelo Firewall PF.
  • Aplicativo: pfstat - Coleta dados e gera gráficos estatísticos do Firewall PF.
  • Aplicativo: bandwidthd - Analisa a largura de banda usada pelos hosts da rede
  • Daemon: pflogd - Packet Filter logging daemon.
  • Aplicativo: pfflowd - Converte mensagens de Status do OpenBSD PF (envia via interface pfsync) para Datagramas Cisco NetFlow. Os datagramas podem ser enviados via UDP.
  • Comando: tcpdump - Utilizado para verificar os logs do Firewall PF e tráfego de rede.
  • Aplicativo: trafshow - Mostra o tráfego de rede.
  • Aplicativo: nload - Monitora o tráfego da rede, em tempo real.

Referências



Veja a relação completa dos artigos de Ali Faiez Taha