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:
- Macros
- Mesas
- Opciones
- Reglas de normalización del tráfico (scrub)
- Colas, priorización y control de velocidad
- Traducción de direcciones NAT
- 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!