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:
- Macros
- les tables
- Options
- Règles de normalisation du trafic (scrub)
- Files d'attente, priorisation et contrôle de la vitesse
- Traduction d'adresse NAT
- 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!