Cortafuegos FreeBSD PF

Introducción



Hay muchos artículos sobre cómo configurar FreeBSD y PF en Runet, pero todos están dispersos y no son sistemáticos. Y para cualquier cosa más o menos interesante, como el enrutamiento mediante firewall (Policy Based Routing), hay que leer la documentación original, por ejemplo, las FAQ de OpenBSD PF . Sin embargo, existen diferencias en la sintaxis de comandos para FreeBSD y OpenBSD. En esta serie de artículos, intentamos sistematizar y analizar las capacidades de FP de simple a complejo. Sin duda, este artículo introductorio será similar a todos los demás artículos sobre Filtro de paquetes. Por lo tanto, aquellos que ya están familiarizados con las características básicas no estarán interesados. Sin embargo, no se puede prescindir de una introducción, y la carne estará en los siguientes artículos.





PF - Packet Filter es un firewall creado originalmente por el proyecto OpenBSD. Portado a FreeBSD en 2003. En 2004 se integró en el sistema principal. Caracteristicas clave:



  • Filtrado basado en direcciones, puertos, protocolos, interfaces
  • NAT - NAT de origen, sustitución de la dirección del remitente. Nat de destino, suplantación de la dirección del destinatario, reenvío de puertos
  • Scrub: normalización del tráfico de la red. Ayuda con algunos tipos de ataques DOS basados ​​en la formación de paquetes especialmente preparados
  • SYN-proxy: protección contra ataques SYN-flood
  • Equilibrio de conexiones
  • — pfcync , , CARP, ,
  • ( IP-, 2 )
  • — IP
  • — ,
  • (anchors) — , IPTables Linux
  • pfstat


La principal diferencia con las mismas IPTables es el esquema de trabajo inusual. El procesamiento por lotes no finaliza después de la coincidencia de la primera regla. Es decir, si configuras la primera regla para "negar todo" , entonces el paquete no se descartará, sino que se marcará como prohibido, irá más allá de acuerdo con las reglas, y si ninguna regla lo permite, se descartará. . Esto es importante de entender y utilizar. Sin embargo, si lo desea, este comportamiento puede ser anulado por el parámetro rápido de la regla.



Manejo y comandos útiles



Para habilitar PF, basta con especificar las opciones en el archivo "/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 básicos del cortafuegos:



pfctl - # Activar cortafuegos

pfctl -d # Desactivar cortafuegos

pfctl -nf # Revisar la sintaxis del archivo

pfctl -f # Volver a leer las reglas del archivo

pfctl -Rf # Volver a leer las reglas de filtrado del archivo

pfctl -Nf # Volver a leer las reglas de NAT del archivo

pfctl -sa # Ver todos los estados

pfctl -s # Ver reglas de filtrado

pfctl -sn # Ver reglas NAT

pfctl -s Anclajes -v # Ver árbol de anclaje

pfctl -ss # Ver conexiones actuales



Estructura del archivo de configuración y configuración básica



El archivo de configuración consta de secciones:



  1. Macros
  2. Mesas
  3. Opciones
  4. Reglas de normalización del tráfico (scrub)
  5. Colas, priorización y control de velocidad
  6. Traducción de direcciones NAT
  7. Filtrado de paquetes


Las reglas generalmente tienen la siguiente sintaxis:



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]

      
      





acción - qué se debe hacer con la

dirección del paquete - entrada, dirección de

registro - si el paquete entrará

rápidamente en pflog - si el paquete cae bajo esta regla, entonces no habrá más procesamiento. Esta regla será la última para el paquete de

interfaz - el nombre de la interfaz de red

af - familia de direcciones, inet o inet6, IPv4 o IPv6, respectivamente

protocolo - protocolo de capa 4, por ejemplo: tcp, udp,

icmp scr_addr, dst_addr - fuente y

direcciones de destino src_port, dst_port -

tcp_flags ports - tcp flags

estado : opciones para guardar el estado. Por ejemplo, mantener estado significaría que la conexión se mantiene en la tabla de estado y los paquetes de respuesta pueden pasar. Comportamiento por defecto.



Tome el servidor web más simple en el vacío. Es necesario abrir las conexiones entrantes en los puertos tcp 22, 80, 443 (ssh, http, https). También necesita abrir conexiones salientes en los puertos tcp 22, 80, 443 (ssh, http, https) y udp 53, 123 (dns y ntp). Prohibir todo lo demás.



# 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

      
      





Luego ingresamos el comando de verificación de sintaxis:

pfctl -nf pf.conf



Si no hay mensajes de error, ingrese el comando para aplicar las reglas:

pfctl -f pf.conf



Para verificar, veamos las reglas de filtrado:



# 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 puede ver, las macros se expanden en reglas separadas para cada puerto, el orden se cambia automáticamente. De lo contrario, todo es como debería ser.



Salir



Descubrimos qué es el filtro de paquetes, aprendimos sus características principales. Descubrí la estructura de la configuración PF y sus secciones principales. Creamos la configuración más simple, que, sin embargo, es bastante funcional, incluyendo macros, normalización de paquetes y filtrado de paquetes entrantes y salientes. En el próximo artículo, analizaremos más de cerca las reglas de filtrado, la administración de estados y las banderas.



Nuestra solución, Internet Control Server, es una puerta de enlace de seguridad construida sobre FreeBSD. Se eligió este sistema debido a su estabilidad, velocidad de la pila de red, compatibilidad integrada con ZFS en el kernel y falta de problemas de licencia. Además, trabajar con FreeBSD es divertido, aunque no sencillo. ¡Pero estaremos encantados de compartir esta experiencia contigo!



All Articles