Pare-feu FreeBSD PF

introduction



Il existe de nombreux articles sur la configuration de FreeBSD et PF sur Runet, mais ils sont tous dispersés et non systématiques. Et pour toute chose plus ou moins intéressante, comme le routage au moyen d'un pare-feu (Policy Based Routing), il faut lire la documentation originale, par exemple la FAQ OpenBSD PF . Cependant, il existe des différences dans la syntaxe des commandes pour FreeBSD et OpenBSD. Dans cette série d'articles, nous essayons de systématiser et d'analyser les capacités de PF du simple au complexe. Bien sûr, cet article d'introduction sera similaire à tous les autres articles sur le filtre de paquets. Par conséquent, ceux qui connaissent déjà les fonctionnalités de base ne seront pas intéressés. Cependant, on ne peut pas se passer d'une introduction, et la viande sera dans les articles suivants.





PF - Packet Filter est un pare-feu créé à l'origine par le projet OpenBSD. Porté sur FreeBSD en 2003. En 2004, il a été intégré au système principal. Principales caractéristiques:



  • Filtrage basé sur les adresses, les ports, les protocoles, les interfaces
  • NAT - NAT source, substitution de l'adresse de l'expéditeur. Destination nat, usurpation de l'adresse du destinataire, redirection de port
  • Scrub - normalisation du trafic réseau. Aide avec certains types d'attaques dos basées sur la formation de paquets spécialement préparés
  • SYN-proxy - Protection contre les attaques SYN-flood
  • Équilibrer les connexions
  • — pfcync , , CARP, ,
  • ( IP-, 2 )
  • — IP
  • — ,
  • (anchors) — , IPTables Linux
  • pfstat


La principale différence avec les mêmes IPTables est le schéma de travail inhabituel. Le traitement par lots ne s'arrête pas après la première correspondance de règle. Autrement dit, si vous définissez la première règle sur "tout refuser" , alors le paquet ne sera pas rejeté, mais sera marqué comme interdit, il ira plus loin selon les règles, et si aucune règle ne le permet, il sera rejeté . Ceci est important à comprendre et à utiliser. Cependant, si vous le souhaitez, ce comportement peut être remplacé par le paramètre quick dans la règle.



Gestion et commandes utiles



Pour activer PF, il suffit de spécifier les options dans le fichier "/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" #  

      
      





Commandes de base du pare-feu:



pfctl - # Activer le pare-feu

pfctl -d # Désactiver le pare-feu

pfctl -nf # Vérifier la syntaxe du fichier

pfctl -f # Relire les règles du fichier

pfctl -Rf # Relire les règles de filtrage du fichier

pfctl -Nf # Relire les règles NAT du fichier

pfctl -sa # Afficher tous les états

pfctl -s # Afficher les règles de filtrage

pfctl -sn # Afficher les règles NAT

pfctl -s Ancres -v # Afficher l'arborescence des ancres

pfctl -ss # Afficher les connexions actuelles



Structure du fichier de configuration et paramètres de base



Le fichier de configuration se compose de sections:



  1. Macros
  2. les tables
  3. Options
  4. Règles de normalisation du trafic (scrub)
  5. Files d'attente, priorisation et contrôle de la vitesse
  6. Traduction d'adresse NAT
  7. Filtrage de paquets


Les règles ont généralement la syntaxe suivante:



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 - ce qui doit être fait avec la

direction du paquet - entrée, direction du

journal - si le paquet entrera dans pflog

rapidement - si le paquet tombe sous cette règle, alors il n'y aura pas de traitement supplémentaire. Cette règle sera la dernière pour le paquet d'

interface - le nom de l'interface réseau

af - famille d'adresses, inet ou inet6, IPv4 ou IPv6, respectivement

protocole - protocole de couche 4, par exemple: tcp, udp, icmp

scr_addr, dst_addr - source et

adresses de destination src_port, dst_port -

tcp_flags ports - tcp flags

état - options pour enregistrer l'état. Par exemple, garder l'état signifierait que la connexion est conservée dans la table d'état et que les paquets de réponse peuvent passer. Comportement par défaut.



Prenez le serveur Web le plus simple dans le vide. Il est nécessaire d'ouvrir les connexions entrantes sur les ports TCP 22, 80, 443 (ssh, http, https). Vous devez également ouvrir les connexions sortantes sur les ports TCP 22, 80, 443 (ssh, http, https) et udp 53, 123 (dns et ntp). Interdisez tout le reste.



# 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

      
      





Ensuite, nous entrons la commande de vérification de syntaxe:

pfctl -nf pf.conf



S'il n'y a pas de message d'erreur, entrez la commande pour appliquer les règles:

pfctl -f pf.conf



Pour vérifier, voyons les règles de filtrage:



# 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 
      
      





Comme vous pouvez le voir, les macros sont développées en règles distinctes pour chaque port, l'ordre est changé automatiquement. Sinon, tout est comme il se doit.



Résultat



Nous avons découvert ce qu'est le filtre de paquets, appris ses principales fonctionnalités. Comprendre la structure de la configuration PF et ses sections principales. Nous avons créé la configuration la plus simple, qui, cependant, est assez fonctionnelle, y compris les macros, la normalisation des paquets et le filtrage des paquets entrants et sortants. Dans le prochain article, nous examinerons de plus près les règles de filtrage, la gestion des états et les indicateurs.



Notre solution, Internet Control Server, est une passerelle de sécurité construite sur FreeBSD. Ce système a été choisi en raison de sa stabilité, de la vitesse de la pile réseau, de la prise en charge intégrée de ZFS dans le noyau et de l'absence de problèmes de licence. De plus, travailler avec FreeBSD est agréable, mais pas simple. Mais nous serons heureux de partager cette expérience avec vous!



All Articles