Firewall FreeBSD PF

Introdução



Existem muitos artigos sobre como configurar o FreeBSD e o PF no Runet, mas todos eles estão dispersos e não sistemáticos. E para qualquer coisa mais ou menos interessante, como roteamento por meio de um firewall (Policy Based Routing), você deve ler a documentação original, por exemplo, o OpenBSD PF FAQ . No entanto, existem diferenças na sintaxe de comando do FreeBSD e do OpenBSD. Nesta série de artigos, tentamos sistematizar e analisar as capacidades do PF do simples ao complexo. Com certeza, este artigo introdutório será semelhante a todos os outros artigos sobre Filtro de pacotes. Portanto, aqueles que já estão familiarizados com os recursos básicos não se interessarão. No entanto, não se pode prescindir de uma introdução, e a carne estará nos próximos artigos.





PF - Packet Filter é um firewall originalmente criado pelo projeto OpenBSD. Transferido para o FreeBSD em 2003. Em 2004 foi integrado ao sistema principal. Características principais:



  • Filtragem baseada em endereços, portas, protocolos, interfaces
  • NAT - Source NAT, substituição do endereço do remetente. Destino nat, falsificação do endereço do destinatário, encaminhamento de porta
  • Scrub - normalização do tráfego de rede. Ajuda com alguns tipos de ataques dos com base na formação de pacotes especialmente preparados
  • SYN-proxy - Proteção contra ataques de inundação de SYN
  • Balanceamento de conexões
  • — pfcync , , CARP, ,
  • ( IP-, 2 )
  • — IP
  • — ,
  • (anchors) — , IPTables Linux
  • pfstat


A principal diferença do mesmo IPTables é o esquema incomum de trabalho. O processamento em lote não termina após a primeira correspondência de regra. Ou seja, se você definir a primeira regra para "negar tudo" , o pacote não será descartado, mas será marcado como proibido, irá mais longe de acordo com as regras e, se nenhuma regra permitir, será descartado . É importante entender e usar isso. No entanto, se desejado, esse comportamento pode ser substituído pelo parâmetro rápido na regra.



Gestão e comandos úteis



Para habilitar o PF, basta especificar as opções no arquivo "/etc/rc.conf":



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

      
      





Comandos de firewall básicos:



pfctl - # Habilitar firewall

pfctl -d # Desabilitar firewall

pfctl -nf # Verifique a sintaxe do arquivo

pfctl -f # Releia regras do arquivo

pfctl -Rf # Releia regras de filtro do arquivo

pfctl -Nf # Releia regras NAT do arquivo

pfctl -sa # Ver todos os estados

pfctl -s # Ver regras de filtragem

pfctl -sn # Ver regras NAT

pfctl -s Âncoras -v # Ver árvore de âncoras

pfctl -ss # Ver conexões atuais



Estrutura do arquivo de configuração e configurações básicas



O arquivo de configuração consiste em seções:



  1. Macros
  2. Mesas
  3. Opções
  4. Regras de normalização de tráfego (scrub)
  5. Filas, priorização e controle de velocidade
  6. Tradução de endereço NAT
  7. Filtragem de pacotes


As regras geralmente têm a seguinte sintaxe:



action [direction] [log] [quick] [on interface] [af] [proto protocol]
          [from src_addr [port src_port]] [to dst_addr [port dst_port]]
          [flags tcp_flags] [state]

      
      





action - o que deve ser feito com a

direção do pacote - in out,

log direction - se o pacote entrará em pflog

rapidamente - se o pacote cair sob esta regra, então não haverá processamento adicional. Esta regra será a última para o pacote de

interface - o nome da interface de rede

af - família de endereços, inet ou inet6, IPv4 ou IPv6, respectivamente

protocolo - protocolo da camada 4, por exemplo: tcp, udp, icmp

scr_addr, dst_addr - source e

endereços de destino src_port, dst_port - portas

tcp_flags - sinalizadores tcp

estado - opções para salvar o estado. Por exemplo, manter o estado significaria que a conexão é mantida na tabela de estados e os pacotes de resposta podem passar. Comportamento padrão.



Pegue o servidor da web mais simples em um vácuo. É necessário abrir conexões de entrada nas portas tcp 22, 80, 443 (ssh, http, https). Você também precisa abrir conexões de saída nas portas tcp 22, 80, 443 (ssh, http, https) e udp 53, 123 (dns e ntp). Proibir tudo o mais.



# ee pf.conf

#macros section
permit_tcp_ports="22,80,443"
permit_udp_ports="53,123"

#table section
#    

#options section
set block-policy return #    ,     
set skip on lo0 #     ,    

#scrub section
scrub in all #    

#Queueing section
#    

#nat section
# ,    


#filtering section
block all #    , ,       .
pass in proto tcp to port { $permit_tcp_ports } #   
pass out proto tcp to port { $permit_tcp_ports } #    tcp
pass out proto udp to port { $permit_udp_ports } #    udp
pass out inet proto icmp #   icmp

      
      





Em seguida,

inserimos o comando de verificação de sintaxe: pfctl -nf pf.conf



Se não houver mensagens de erro, insira o comando para aplicar as regras:

pfctl -f pf.conf



Para verificar, vamos ver as regras de filtragem:



# pfctl -sr 
scrub in all fragment reassemble 
block return all 
pass out proto tcp from any to any port = ssh flags S/SA keep state 
pass out proto tcp from any to any port = http flags S/SA keep state 
pass out proto tcp from any to any port = https flags S/SA keep state 
pass out proto udp from any to any port = domain keep state 
pass out proto udp from any to any port = ntp keep state 
pass out inet proto icmp all keep state 
pass in proto tcp from any to any port = ssh flags S/SA keep state 
pass in proto tcp from any to any port = http flags S/SA keep state 
pass in proto tcp from any to any port = https flags S/SA keep state 
      
      





Como você pode ver, as macros são expandidas em regras separadas para cada porta, a ordem é alterada automaticamente. Caso contrário, tudo está como deveria ser.



Resultado



Descobrimos o que é o Filtro de Pacotes, aprendemos seus principais recursos. Descobri a estrutura da configuração do PF e suas principais seções. Criamos a configuração mais simples, que, no entanto, é bastante funcional, incluindo macros, normalização de pacotes e filtragem de pacotes de entrada e saída. No próximo artigo, daremos uma olhada mais de perto nas regras de filtragem, gerenciamento de estado e sinalizadores.



Nossa solução, Internet Control Server, é um gateway de segurança construído sobre o FreeBSD. Este sistema foi escolhido por causa de sua estabilidade, velocidade da pilha de rede, suporte ZFS integrado no kernel e falta de problemas de licença. Além disso, trabalhar com o FreeBSD é agradável, embora não seja simples. Mas teremos o maior prazer em compartilhar essa experiência com você!



All Articles