você está aqui: Home  → Arquivo de Mensagens

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

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script