Asegurar las redes
Configuración de redes seguras y comunicación en red
Resumen
Hacer que el código abierto sea más inclusivo Copiar enlaceEnlace copiado en el portapapeles!
Red Hat se compromete a sustituir el lenguaje problemático en nuestro código, documentación y propiedades web. Estamos empezando con estos cuatro términos: maestro, esclavo, lista negra y lista blanca. Debido a la enormidad de este esfuerzo, estos cambios se implementarán gradualmente a lo largo de varias versiones próximas. Para más detalles, consulte el mensaje de nuestro CTO Chris Wright.
Proporcionar comentarios sobre la documentación de Red Hat Copiar enlaceEnlace copiado en el portapapeles!
Agradecemos su opinión sobre nuestra documentación. Por favor, díganos cómo podemos mejorarla. Para ello:
Para comentarios sencillos sobre pasajes concretos:
- Asegúrese de que está viendo la documentación en el formato Multi-page HTML. Además, asegúrese de ver el botón Feedback en la esquina superior derecha del documento.
- Utilice el cursor del ratón para resaltar la parte del texto que desea comentar.
- Haga clic en la ventana emergente Add Feedback que aparece debajo del texto resaltado.
- Siga las instrucciones mostradas.
Para enviar comentarios más complejos, cree un ticket de Bugzilla:
- Vaya al sitio web de Bugzilla.
- Como componente, utilice Documentation.
- Rellene el campo Description con su sugerencia de mejora. Incluya un enlace a la(s) parte(s) pertinente(s) de la documentación.
- Haga clic en Submit Bug.
Capítulo 1. Uso de comunicaciones seguras entre dos sistemas con OpenSSH Copiar enlaceEnlace copiado en el portapapeles!
SSH (Secure Shell) es un protocolo que proporciona comunicaciones seguras entre dos sistemas utilizando una arquitectura cliente-servidor y permite a los usuarios iniciar la sesión en los sistemas anfitriones del servidor de forma remota. A diferencia de otros protocolos de comunicación remota, como FTP o Telnet, SSH cifra la sesión de inicio de sesión, lo que impide que los intrusos recojan las contraseñas no cifradas de la conexión.
Red Hat Enterprise Linux incluye los paquetes básicos OpenSSH: el paquete general openssh, el paquete openssh-server y el paquete openssh-clients. Tenga en cuenta que los paquetes OpenSSH requieren el paquete OpenSSL openssl-libs , que instala varias bibliotecas criptográficas importantes que permiten a OpenSSH proporcionar comunicaciones cifradas.
1.1. SSH y OpenSSH Copiar enlaceEnlace copiado en el portapapeles!
SSH (Secure Shell) es un programa para entrar en una máquina remota y ejecutar comandos en esa máquina. El protocolo SSH proporciona comunicaciones seguras y encriptadas entre dos hosts no confiables a través de una red insegura. También puede reenviar conexiones X11 y puertos TCP/IP arbitrarios a través del canal seguro.
El protocolo SSH mitiga las amenazas de seguridad, como la interceptación de la comunicación entre dos sistemas y la suplantación de un determinado host, cuando se utiliza para el inicio de sesión de shell remoto o la copia de archivos. Esto se debe a que el cliente y el servidor SSH utilizan firmas digitales para verificar sus identidades. Además, toda la comunicación entre los sistemas cliente y servidor está cifrada.
OpenSSH es una implementación del protocolo SSH soportada por varios sistemas operativos Linux, UNIX y similares. Incluye los archivos centrales necesarios para el cliente y el servidor de OpenSSH. La suite OpenSSH consiste en las siguientes herramientas de espacio de usuario:
-
sshes un programa de acceso remoto (cliente SSH) -
sshdes un demonio SSHOpenSSH -
scpes un programa de copia remota segura de archivos -
sftpes un programa de transferencia segura de archivos -
ssh-agentes un agente de autenticación para el almacenamiento de claves privadas -
ssh-addañade identidades de clave privada assh-agent -
ssh-keygengenera, gestiona y convierte las claves de autenticación parassh -
ssh-copy-ides un script que añade claves públicas locales al archivoauthorized_keysen un servidor SSH remoto -
ssh-keyscan- recoge las claves públicas de host SSH
Actualmente existen dos versiones de SSH: la versión 1 y la versión 2, más reciente. La suite OpenSSH en Red Hat Enterprise Linux 8 sólo soporta la versión 2 de SSH, que tiene un algoritmo de intercambio de claves mejorado que no es vulnerable a los exploits conocidos de la versión 1.
OpenSSH, como uno de los subsistemas criptográficos centrales de RHEL, utiliza políticas criptográficas para todo el sistema. Esto asegura que los conjuntos de cifrado y los algoritmos criptográficos débiles están desactivados en la configuración por defecto. Para ajustar la política, el administrador debe utilizar el comando update-crypto-policies para hacer la configuración más estricta o más floja o excluir manualmente las políticas criptográficas de todo el sistema.
El conjunto OpenSSH utiliza dos conjuntos diferentes de archivos de configuración: los de los programas cliente (es decir, ssh, scp, y sftp), y los del servidor (el demonio sshd ). La información de configuración de SSH para todo el sistema se almacena en el directorio /etc/ssh/. La información de configuración SSH específica del usuario se almacena en ~/.ssh/ en el directorio de inicio del usuario. Para una lista detallada de los archivos de configuración de OpenSSH, vea la sección FILES en la página man sshd(8).
Recursos adicionales
-
Páginas de manual para el tema
sshlistadas por el comandoman -k ssh. - Uso de políticas criptográficas en todo el sistema.
1.2. Configurar e iniciar un servidor OpenSSH Copiar enlaceEnlace copiado en el portapapeles!
Utilice el siguiente procedimiento para una configuración básica que puede ser necesaria para su entorno y para iniciar un servidor OpenSSH. Tenga en cuenta que después de la instalación por defecto de RHEL, el demonio sshd ya está iniciado y las claves del servidor se crean automáticamente.
Requisitos previos
-
El paquete
openssh-serverestá instalado.
Procedimiento
Inicie el demonio
sshden la sesión actual y configúrelo para que se inicie automáticamente al arrancar:systemctl start sshd systemctl enable sshd
# systemctl start sshd # systemctl enable sshdCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para especificar direcciones diferentes a las predeterminadas
0.0.0.0(IPv4) o::(IPv6) para la directivaListenAddressen el archivo de configuración/etc/ssh/sshd_configy utilizar una configuración de red dinámica más lenta, añada la dependencia de la unidad de destinonetwork-online.targetal archivo de unidadsshd.service. Para ello, cree el archivo/etc/systemd/system/sshd.service.d/local.confcon el siguiente contenido:[Unit] Wants=network-online.target After=network-online.target
[Unit] Wants=network-online.target After=network-online.targetCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
Revise si la configuración del servidor
OpenSSHen el archivo de configuración/etc/ssh/sshd_configcumple con los requisitos de su escenario. Opcionalmente, cambie el mensaje de bienvenida que su servidor
OpenSSHmuestra antes de que un cliente se autentique editando el archivo/etc/issue, por ejemplo:Welcome to ssh-server.example.com Warning: By accessing this server, you agree to the referenced terms and conditions.
Welcome to ssh-server.example.com Warning: By accessing this server, you agree to the referenced terms and conditions.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Asegúrese de que la opción
Bannerno está comentada en/etc/ssh/sshd_configy su valor contiene/etc/issue:less /etc/ssh/sshd_config | grep Banner Banner /etc/issue
# less /etc/ssh/sshd_config | grep Banner Banner /etc/issueCopy to Clipboard Copied! Toggle word wrap Toggle overflow Tenga en cuenta que para cambiar el mensaje que se muestra después de un inicio de sesión exitoso tiene que editar el archivo
/etc/motden el servidor. Consulte la página manpam_motdpara obtener más información.Vuelva a cargar la configuración de
systemdy reiniciesshdpara aplicar los cambios:systemctl daemon-reload systemctl restart sshd
# systemctl daemon-reload # systemctl restart sshdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Pasos de verificación
Compruebe que el demonio
sshdse está ejecutando:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Conéctese al servidor SSH con un cliente SSH.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
-
sshd(8)ysshd_config(5)páginas man
1.3. Uso de pares de claves en lugar de contraseñas para la autenticación SSH Copiar enlaceEnlace copiado en el portapapeles!
Para mejorar aún más la seguridad del sistema, genere pares de claves SSH y luego aplique la autenticación basada en claves deshabilitando la autenticación por contraseña.
1.3.1. Configuración de un servidor OpenSSH para la autenticación basada en claves Copiar enlaceEnlace copiado en el portapapeles!
Siga estos pasos para configurar su servidor OpenSSH para aplicar la autenticación basada en claves.
Requisitos previos
-
El paquete
openssh-serverestá instalado. -
El demonio
sshdse está ejecutando en el servidor.
Procedimiento
Abra la configuración de
/etc/ssh/sshd_configen un editor de texto, por ejemplo:vi /etc/ssh/sshd_config
# vi /etc/ssh/sshd_configCopy to Clipboard Copied! Toggle word wrap Toggle overflow Cambie la opción
PasswordAuthenticationporno:PasswordAuthentication no
PasswordAuthentication noCopy to Clipboard Copied! Toggle word wrap Toggle overflow En un sistema que no sea una instalación nueva por defecto, compruebe que no se ha configurado
PubkeyAuthentication noy que la directivaChallengeResponseAuthenticationestá establecida enno. Si está conectado de forma remota, sin utilizar la consola o el acceso fuera de banda, pruebe el proceso de inicio de sesión basado en la clave antes de desactivar la autenticación por contraseña.Para utilizar la autenticación basada en claves con los directorios personales montados en NFS, active el booleano
use_nfs_home_dirsSELinux:setsebool -P use_nfs_home_dirs 1
# setsebool -P use_nfs_home_dirs 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vuelva a cargar el demonio
sshdpara aplicar los cambios:systemctl reload sshd
# systemctl reload sshdCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
-
sshd(8),sshd_config(5), ysetsebool(8)páginas de manual
1.3.2. Generación de pares de claves SSH Copiar enlaceEnlace copiado en el portapapeles!
Utilice este procedimiento para generar un par de claves SSH en un sistema local y para copiar la clave pública generada en un servidor OpenSSH. Si el servidor está configurado como corresponde, podrá iniciar sesión en el servidor OpenSSH sin necesidad de proporcionar ninguna contraseña.
Si completa los siguientes pasos como root, sólo root podrá utilizar las llaves.
Procedimiento
Para generar un par de claves ECDSA para la versión 2 del protocolo SSH:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow También puede generar un par de claves RSA utilizando la opción
-t rsacon el comandossh-keygeno un par de claves Ed25519 introduciendo el comandossh-keygen -t ed25519.Para copiar la clave pública en una máquina remota:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si no utiliza el programa
ssh-agenten su sesión, el comando anterior copia la clave pública más recientemente modificada~/.ssh/id*.pubsi aún no está instalada. Para especificar otro archivo de clave pública o para dar prioridad a las claves en archivos sobre las claves almacenadas en la memoria porssh-agent, utilice el comandossh-copy-idcon la opción-i.
Si reinstalas tu sistema y quieres conservar los pares de claves generados anteriormente, haz una copia de seguridad del directorio ~/.ssh/. Después de reinstalar, cópialo de nuevo en tu directorio principal. Puedes hacer esto para todos los usuarios de tu sistema, incluyendo root.
Pasos de verificación
Inicie sesión en el servidor OpenSSH sin proporcionar ninguna contraseña:
ssh joesec@ssh-server-example.com Welcome message. ... Last login: Mon Nov 18 18:28:42 2019 from ::1
$ ssh joesec@ssh-server-example.com Welcome message. ... Last login: Mon Nov 18 18:28:42 2019 from ::1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
-
ssh-keygen(1)yssh-copy-id(1)páginas man
1.4. Uso de claves SSH almacenadas en una tarjeta inteligente Copiar enlaceEnlace copiado en el portapapeles!
Red Hat Enterprise Linux 8 le permite utilizar claves RSA y ECDSA almacenadas en una tarjeta inteligente en clientes OpenSSH. Utilice este procedimiento para habilitar la autenticación utilizando una tarjeta inteligente en lugar de utilizar una contraseña.
Requisitos previos
-
En el lado del cliente, el paquete
openscestá instalado y el serviciopcscdestá funcionando.
Procedimiento
Enumerar todas las claves proporcionadas por el módulo PKCS #11 de OpenSC incluyendo sus URIs PKCS #11 y guardar el resultado en el archivo keys.pub:
ssh-keygen -D pkcs11: > keys.pub ssh-keygen -D pkcs11: ssh-rsa AAAAB3NzaC1yc2E...KKZMzcQZzx pkcs11:id=%02;object=SIGN%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so ecdsa-sha2-nistp256 AAA...J0hkYnnsM= pkcs11:id=%01;object=PIV%20AUTH%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so
$ ssh-keygen -D pkcs11: > keys.pub $ ssh-keygen -D pkcs11: ssh-rsa AAAAB3NzaC1yc2E...KKZMzcQZzx pkcs11:id=%02;object=SIGN%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so ecdsa-sha2-nistp256 AAA...J0hkYnnsM= pkcs11:id=%01;object=PIV%20AUTH%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.soCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para habilitar la autenticación mediante una tarjeta inteligente en un servidor remoto (example.com), transfiera la clave pública al servidor remoto. Utilice el comando
ssh-copy-idcon keys.pub creado en el paso anterior:ssh-copy-id -f -i keys.pub username@example.com
$ ssh-copy-id -f -i keys.pub username@example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para conectarse a example.com utilizando la clave ECDSA de la salida del comando
ssh-keygen -Den el paso 1, puede utilizar sólo un subconjunto de la URI, que hace referencia a su clave de forma exclusiva, por ejemplo:ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" example.com Enter PIN for 'SSH key': [example.com] $
$ ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" example.com Enter PIN for 'SSH key': [example.com] $Copy to Clipboard Copied! Toggle word wrap Toggle overflow Puede utilizar la misma cadena URI en el archivo
~/.ssh/configpara que la configuración sea permanente:cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" $ ssh example.com Enter PIN for 'SSH key': [example.com] $
$ cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" $ ssh example.com Enter PIN for 'SSH key': [example.com] $Copy to Clipboard Copied! Toggle word wrap Toggle overflow Dado que OpenSSH utiliza el wrapper
p11-kit-proxyy el módulo PKCS #11 de OpenSC está registrado en PKCS#11 Kit, puede simplificar los comandos anteriores:ssh -i "pkcs11:id=%01" example.com Enter PIN for 'SSH key': [example.com] $
$ ssh -i "pkcs11:id=%01" example.com Enter PIN for 'SSH key': [example.com] $Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Si se omite la parte id= de un URI PKCS #11, OpenSSH carga todas las claves que están disponibles en el módulo proxy. Esto puede reducir la cantidad de escritura requerida:
ssh -i pkcs11: example.com Enter PIN for 'SSH key': [example.com] $
$ ssh -i pkcs11: example.com
Enter PIN for 'SSH key':
[example.com] $
Recursos adicionales
- Fedora 28: Mejor soporte para tarjetas inteligentes en OpenSSH
-
p11-kit(8)página de manual -
ssh(1)página de manual -
ssh-keygen(1)página de manual -
opensc.conf(5)página de manual -
pcscd(8)página de manual
1.5. Cómo hacer que OpenSSH sea más seguro Copiar enlaceEnlace copiado en el portapapeles!
Los siguientes consejos le ayudarán a aumentar la seguridad cuando utilice OpenSSH. Tenga en cuenta que los cambios en el archivo de configuración de /etc/ssh/sshd_config OpenSSH requieren la recarga del demonio sshd para que surtan efecto:
systemctl reload sshd
# systemctl reload sshd
La mayoría de los cambios en la configuración del refuerzo de la seguridad reducen la compatibilidad con los clientes que no admiten algoritmos o conjuntos de cifrado actualizados.
Desactivación de los protocolos de conexión inseguros
-
Para que SSH sea realmente eficaz, hay que evitar el uso de protocolos de conexión inseguros que sean sustituidos por el conjunto
OpenSSH. De lo contrario, la contraseña de un usuario podría estar protegida usando SSH para una sesión sólo para ser capturada más tarde cuando se conecte usando Telnet. Por esta razón, considere deshabilitar los protocolos inseguros, como telnet, rsh, rlogin y ftp.
Activación de la autenticación basada en clave y desactivación de la autenticación basada en contraseña
Desactivar las contraseñas para la autenticación y permitir sólo los pares de claves reduce la superficie de ataque y también podría ahorrar tiempo a los usuarios. En los clientes, genere pares de claves utilizando la herramienta
ssh-keygeny utilice la utilidadssh-copy-idpara copiar las claves públicas de los clientes en el servidorOpenSSH. Para desactivar la autenticación basada en contraseña en su servidor OpenSSH, edite/etc/ssh/sshd_configy cambie la opciónPasswordAuthenticationporno:PasswordAuthentication no
PasswordAuthentication noCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Tipos de claves
Aunque el comando
ssh-keygengenera un par de claves RSA por defecto, puedes indicarle que genere claves ECDSA o Ed25519 utilizando la opción-t. El ECDSA (Algoritmo de Firma Digital de Curva Elíptica) ofrece un mejor rendimiento que el RSA con una fuerza de clave simétrica equivalente. También genera claves más cortas. El algoritmo de clave pública Ed25519 es una implementación de curvas de Edwards retorcidas que es más segura y también más rápida que RSA, DSA y ECDSA.OpenSSH crea automáticamente las claves de host del servidor RSA, ECDSA y Ed25519 si no las tiene. Para configurar la creación de claves de host en RHEL 8, utilice el servicio instanciado
sshd-keygen@.service. Por ejemplo, para desactivar la creación automática del tipo de clave RSA:systemctl mask sshd-keygen@rsa.service
# systemctl mask sshd-keygen@rsa.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
Para excluir determinados tipos de claves para las conexiones SSH, comente las líneas correspondientes en
/etc/ssh/sshd_configy vuelva a cargar el serviciosshd. Por ejemplo, para permitir sólo las claves de host Ed25519:
# HostKey /etc/ssh/ssh_host_rsa_key # HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key
# HostKey /etc/ssh/ssh_host_rsa_key
# HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
Puerto no predeterminado
Por defecto, el demonio
sshdescucha en el puerto TCP 22. Cambiar el puerto reduce la exposición del sistema a ataques basados en el escaneo automático de la red y, por tanto, aumenta la seguridad a través de la oscuridad. Puede especificar el puerto utilizando la directivaPorten el archivo de configuración/etc/ssh/sshd_config.También tienes que actualizar la política por defecto de SELinux para permitir el uso de un puerto no predeterminado. Para ello, utilice la herramienta
semanagedel paquetepolicycoreutils-python-utils:semanage port -a -t ssh_port_t -p tcp port_number
# semanage port -a -t ssh_port_t -p tcp port_numberCopy to Clipboard Copied! Toggle word wrap Toggle overflow Además, actualice la configuración de
firewalld:firewall-cmd --add-port port_number/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port port_number/tcp # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow En los comandos anteriores, sustituya port_number por el nuevo número de puerto especificado mediante la directiva
Port.
No hay acceso a la raíz
Si su caso de uso particular no requiere la posibilidad de iniciar sesión como usuario root, debería considerar establecer la directiva de configuración
PermitRootLoginanoen el archivo/etc/ssh/sshd_config. Al deshabilitar la posibilidad de iniciar sesión como usuario root, el administrador puede auditar qué usuarios ejecutan qué comandos privilegiados después de iniciar sesión como usuarios normales y luego obtener derechos de root.Como alternativa, configure
PermitRootLoginenprohibit-password:PermitRootLogin prohibir-contraseña
PermitRootLogin prohibir-contraseñaCopy to Clipboard Copied! Toggle word wrap Toggle overflow Esto refuerza el uso de la autenticación basada en claves en lugar del uso de contraseñas para iniciar la sesión como root y reduce los riesgos al evitar los ataques de fuerza bruta.
Uso de la extensión X Security
El servidor X en los clientes de Red Hat Enterprise Linux no proporciona la extensión X Security. Por lo tanto, los clientes no pueden solicitar otra capa de seguridad cuando se conectan a servidores SSH no confiables con el reenvío X11. La mayoría de las aplicaciones no pueden ejecutarse con esta extensión habilitada de todos modos.
Por defecto, la opción
ForwardX11Trusteden el archivo/etc/ssh/ssh_config.d/05-redhat.confse establece enyes, y no hay diferencia entre el comandossh -X remote_machine(host no confiable) yssh -Y remote_machine(host confiable).Si su escenario no requiere la función de reenvío de X11 en absoluto, establezca la directiva
X11Forwardingen el archivo de configuración/etc/ssh/sshd_configano.
Restringir el acceso a usuarios, grupos o dominios específicos
Las directivas
AllowUsersyAllowGroupsen el archivo de configuración del servidor/etc/ssh/sshd_configle permiten permitir sólo a ciertos usuarios, dominios o grupos conectarse a su servidor OpenSSH. Puede combinarAllowUsersyAllowGroupspara restringir el acceso con mayor precisión, por ejemplo:AllowUsers *@192.168.1.*,*@10.0.0.*,!*@192.168.1.2 AllowGroups example-group
AllowUsers *@192.168.1.*,*@10.0.0.*,!*@192.168.1.2 AllowGroups example-groupCopy to Clipboard Copied! Toggle word wrap Toggle overflow Las líneas de configuración anteriores aceptan conexiones de todos los usuarios de los sistemas de las subredes 192.168.1.* y 10.0.0.*, excepto del sistema con la dirección 192.168.1.2. Todos los usuarios deben estar en el grupo
example-group. El servidor OpenSSH rechaza todas las demás conexiones.Tenga en cuenta que el uso de listas de permitidos (directivas que empiezan por Allow) es más seguro que el uso de listas de bloqueados (opciones que empiezan por Deny) porque las listas de permitidos bloquean también a nuevos usuarios o grupos no autorizados.
Cambiar las políticas criptográficas de todo el sistema
OpenSSHutiliza las políticas criptográficas de todo el sistema RHEL, y el nivel de política criptográfica por defecto de todo el sistema ofrece una configuración segura para los modelos de amenazas actuales. Para que la configuración criptográfica sea más estricta, cambie el nivel de política actual:update-crypto-policies --set FUTURE Setting system policy to FUTURE
# update-crypto-policies --set FUTURE Setting system policy to FUTURECopy to Clipboard Copied! Toggle word wrap Toggle overflow -
Para optar por las políticas de criptografía de todo el sistema para su servidor
OpenSSH, descomente la línea con la variableCRYPTO_POLICY=en el archivo/etc/sysconfig/sshd. Después de este cambio, los valores que especifique en las seccionesCiphers,MACs,KexAlgoritms, yGSSAPIKexAlgorithmsen el archivo/etc/ssh/sshd_configno serán anulados. Tenga en cuenta que esta tarea requiere una gran experiencia en la configuración de opciones criptográficas. - Consulte Uso de políticas criptográficas en todo el sistema en el título de endurecimiento de la seguridad de RHEL 8 para obtener más información.
Recursos adicionales
-
sshd_config(5),ssh-keygen(1),crypto-policies(7), yupdate-crypto-policies(8)páginas de manual
1.6. Conectarse a un servidor remoto utilizando un host de salto SSH Copiar enlaceEnlace copiado en el portapapeles!
Utilice este procedimiento para conectarse a un servidor remoto a través de un servidor intermediario, también llamado host de salto.
Requisitos previos
- Un host de salto acepta conexiones SSH desde su sistema.
- Un servidor remoto acepta conexiones SSH sólo desde el host de salto.
Procedimiento
Defina el host de salto editando el archivo
~/.ssh/config, por ejemplo:Host jump-server1 HostName jump1.example.com
Host jump-server1 HostName jump1.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añada la configuración de salto del servidor remoto con la directiva
ProxyJumpa~/.ssh/config, por ejemplo:Host remote-server HostName remote1.example.com ProxyJump jump-server1
Host remote-server HostName remote1.example.com ProxyJump jump-server1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Conectar con el servidor remoto a través del servidor de salto:
ssh remote-server
$ ssh remote-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow El comando anterior es equivalente al comando
ssh -J jump-server1 remote-serversi se omiten los pasos de configuración 1 y 2.
Puede especificar más servidores de salto y también puede omitir la adición de definiciones de host al archivo de configuraciones cuando proporciona sus nombres de host completos, por ejemplo:
ssh -J jump1.example.com,jump2.example.com,jump3.example.com remote1.example.com
$ ssh -J jump1.example.com,jump2.example.com,jump3.example.com remote1.example.com
Cambie la notación de sólo nombre de host en el comando anterior si los nombres de usuario o los puertos SSH en los servidores de salto difieren de los nombres y puertos en el servidor remoto, por ejemplo:
ssh -J johndoe@jump1.example.com:75,johndoe@jump2.example.com:75,johndoe@jump3.example.com:75 joesec@remote1.example.com:220
$ ssh -J johndoe@jump1.example.com:75,johndoe@jump2.example.com:75,johndoe@jump3.example.com:75 joesec@remote1.example.com:220
Recursos adicionales
-
ssh_config(5)yssh(1)páginas man
1.7. Conexión a máquinas remotas con claves SSH usando ssh-agent Copiar enlaceEnlace copiado en el portapapeles!
Para evitar la introducción de una frase de contraseña cada vez que inicie una conexión SSH, puede utilizar la utilidad ssh-agent para almacenar en caché la clave privada SSH. La clave privada y la frase de contraseña permanecen seguras.
Requisitos previos
- Tienes un host remoto con el demonio SSH en ejecución y accesible a través de la red.
- Conoce la dirección IP o el nombre de host y las credenciales para iniciar sesión en el host remoto.
- Ha generado un par de claves SSH con una frase de paso y ha transferido la clave pública a la máquina remota. Para más información, consulte Generación de pares de claves SSH.
Procedimiento
Opcional: Compruebe que puede utilizar la clave para autenticarse en el host remoto:
Conéctese al host remoto mediante SSH:
ssh example.user1@198.51.100.1 hostname
$ ssh example.user1@198.51.100.1 hostnameCopy to Clipboard Copied! Toggle word wrap Toggle overflow Introduzca la frase de contraseña que estableció al crear la clave para dar acceso a la clave privada.
ssh example.user1@198.51.100.1 hostname host.example.com
$ ssh example.user1@198.51.100.1 hostname host.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Inicie el
ssh-agent.eval $(ssh-agent) Agent pid 20062
$ eval $(ssh-agent) Agent pid 20062Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añade la clave a
ssh-agent.ssh-add ~/.ssh/id_rsa Enter passphrase for ~/.ssh/id_rsa: Identity added: ~/.ssh/id_rsa (example.user0@198.51.100.12)
$ ssh-add ~/.ssh/id_rsa Enter passphrase for ~/.ssh/id_rsa: Identity added: ~/.ssh/id_rsa (example.user0@198.51.100.12)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Pasos de verificación
Opcional: Inicie sesión en el equipo anfitrión mediante SSH.
ssh example.user1@198.51.100.1 Last login: Mon Sep 14 12:56:37 2020
$ ssh example.user1@198.51.100.1 Last login: Mon Sep 14 12:56:37 2020Copy to Clipboard Copied! Toggle word wrap Toggle overflow Tenga en cuenta que no ha tenido que introducir la frase de contraseña.
1.8. Recursos adicionales Copiar enlaceEnlace copiado en el portapapeles!
Para obtener más información sobre la configuración y la conexión a los servidores y clientes de OpenSSH en Red Hat Enterprise Linux, consulte los recursos enumerados a continuación.
Documentación instalada
-
sshd(8)La página de manual documenta las opciones disponibles en la línea de comandos y proporciona una lista completa de los archivos y directorios de configuración compatibles. -
la página de manual
ssh(1)proporciona una lista completa de las opciones disponibles en la línea de comandos y de los archivos y directorios de configuración admitidos. -
la página de manual
scp(1)proporciona una descripción más detallada de la utilidadscpy su uso. -
la página de manual
sftp(1)proporciona una descripción más detallada de la utilidadsftpy su uso. -
la página man
ssh-keygen(1)documenta en detalle el uso de la utilidadssh-keygenpara generar, gestionar y convertir las claves de autenticación utilizadas por ssh. -
la página de manual
ssh-copy-id(1)describe el uso del scriptssh-copy-id. -
ssh_config(5)La página de manual documenta las opciones de configuración del cliente SSH disponibles. -
la página de manual
sshd_config(5)proporciona una descripción completa de las opciones de configuración disponibles del demonio SSH. -
la página de manual
update-crypto-policies(8)proporciona orientación sobre la gestión de las políticas criptográficas de todo el sistema -
la página de manual
crypto-policies(7)proporciona una visión general de los niveles de política criptográfica de todo el sistema
Documentación en línea
- Página principal de OpenSSH: contiene más documentación, preguntas frecuentes, enlaces a las listas de correo, informes de errores y otros recursos útiles.
- Configuración de SELinux para aplicaciones y servicios con configuraciones no estándar: puede aplicar procedimientos análogos para OpenSSH en una configuración no estándar con SELinux en modo de refuerzo.
-
Controlar el tráfico de la red utilizando firewalld - proporciona orientación sobre la actualización de la configuración de
firewallddespués de cambiar un puerto SSH
Capítulo 2. Planificación y aplicación de TLS Copiar enlaceEnlace copiado en el portapapeles!
TLS (Transport Layer Security) es un protocolo criptográfico utilizado para asegurar las comunicaciones de red. A la hora de endurecer los ajustes de seguridad del sistema configurando los protocolos de intercambio de claves, los métodos de autenticación y los algoritmos de cifrado preferidos, es necesario tener en cuenta que cuanto más amplia sea la gama de clientes admitidos, menor será la seguridad resultante. A la inversa, una configuración de seguridad estricta conlleva una compatibilidad limitada con los clientes, lo que puede provocar que algunos usuarios se queden fuera del sistema. Asegúrese de apuntar a la configuración más estricta disponible y sólo relájela cuando sea necesario por razones de compatibilidad.
2.1. Protocolos SSL y TLS Copiar enlaceEnlace copiado en el portapapeles!
El protocolo Secure Sockets Layer (SSL) fue desarrollado originalmente por Netscape Corporation para proporcionar un mecanismo de comunicación segura en Internet. Posteriormente, el protocolo fue adoptado por el Grupo de Trabajo de Ingeniería de Internet (IETF) y rebautizado como Transport Layer Security (TLS).
El protocolo TLS se sitúa entre una capa de protocolo de aplicación y una capa de transporte fiable, como TCP/IP. Es independiente del protocolo de aplicación y, por lo tanto, puede colocarse por debajo de muchos protocolos diferentes, por ejemplo: HTTP, FTP, SMTP, etc.
| Versión del protocolo | Recomendación de uso |
|---|---|
| SSL v2 | No utilizar. Tiene graves vulnerabilidades de seguridad. Eliminado de las bibliotecas criptográficas del núcleo desde RHEL 7. |
| SSL v3 | No utilizar. Tiene graves vulnerabilidades de seguridad. Eliminado de las bibliotecas criptográficas del núcleo desde RHEL 8. |
| TLS 1.0 |
No se recomienda su uso. Tiene problemas conocidos que no se pueden mitigar de forma que se garantice la interoperabilidad, y no admite suites de cifrado modernas. Habilitado sólo en el perfil de política criptográfica de todo el sistema |
| TLS 1.1 |
Utilícelo con fines de interoperabilidad cuando sea necesario. No admite suites de cifrado modernas. Habilitado sólo en la política |
| TLS 1.2 | Soporta las modernas suites de cifrado AEAD. Esta versión está habilitada en todas las políticas criptográficas del sistema, pero las partes opcionales de este protocolo contienen vulnerabilidades y TLS 1.2 también permite algoritmos obsoletos. |
| TLS 1.3 | Versión recomendada. TLS 1.3 elimina las opciones problemáticas conocidas, proporciona privacidad adicional al cifrar una mayor parte del apretón de manos de la negociación y puede ser más rápido gracias al uso de algoritmos criptográficos modernos más eficientes. TLS 1.3 también está habilitado en todas las políticas criptográficas del sistema. |
Recursos adicionales
2.2. Consideraciones de seguridad para TLS en RHEL 8 Copiar enlaceEnlace copiado en el portapapeles!
En RHEL 8, las consideraciones relacionadas con la criptografía se simplifican significativamente gracias a las políticas de criptografía de todo el sistema. La política criptográfica DEFAULT sólo permite TLS 1.2 y 1.3. Para permitir que su sistema negocie conexiones utilizando las versiones anteriores de TLS, debe optar por no seguir las políticas criptográficas en una aplicación o cambiar a la política LEGACY con el comando update-crypto-policies. Consulte Uso de políticas criptográficas en todo el sistema para obtener más información.
La configuración por defecto proporcionada por las bibliotecas incluidas en RHEL 8 es lo suficientemente segura para la mayoría de las implementaciones. Las implementaciones de TLS utilizan algoritmos seguros siempre que sea posible, sin impedir las conexiones desde o hacia clientes o servidores heredados. Aplique configuraciones reforzadas en entornos con requisitos de seguridad estrictos en los que no se espera ni se permite la conexión de clientes o servidores heredados que no soportan algoritmos o protocolos seguros.
La forma más directa de endurecer la configuración de TLS es cambiar el nivel de la política criptográfica de todo el sistema a FUTURE utilizando el comando update-crypto-policies --set FUTURE.
Si decide no seguir las políticas de cifrado de todo el sistema RHEL, utilice las siguientes recomendaciones para los protocolos, conjuntos de cifrado y longitudes de clave preferidos en su configuración personalizada:
2.2.1. Protocolos Copiar enlaceEnlace copiado en el portapapeles!
La última versión de TLS proporciona el mejor mecanismo de seguridad. A menos que tenga una razón de peso para incluir el soporte de versiones anteriores de TLS, permita que sus sistemas negocien las conexiones utilizando al menos la versión 1.2 de TLS. Tenga en cuenta que, a pesar de que RHEL 8 soporta la versión 1.3 de TLS, no todas las características de este protocolo son totalmente compatibles con los componentes de RHEL 8. Por ejemplo, la función 0-RTT (Zero Round Trip Time), que reduce la latencia de la conexión, todavía no está totalmente soportada por los servidores web Apache o Nginx.
2.2.2. Suites de cifrado Copiar enlaceEnlace copiado en el portapapeles!
Las suites de cifrado modernas y más seguras deben preferirse a las antiguas e inseguras. Desactive siempre el uso de las suites de cifrado eNULL y aNULL, que no ofrecen ningún tipo de cifrado o autenticación. Si es posible, las suites de cifrado basadas en RC4 o HMAC-MD5, que tienen serias deficiencias, también deberían deshabilitarse. Lo mismo se aplica a las llamadas suites de cifrado de exportación, que se han hecho intencionadamente más débiles y, por tanto, son fáciles de romper.
Aunque no son inmediatamente inseguras, las suites de cifrado que ofrecen menos de 128 bits de seguridad no deberían considerarse por su corta vida útil. Los algoritmos que utilizan 128 bits de seguridad o más pueden esperarse que sean indescifrables durante al menos varios años, por lo que se recomiendan encarecidamente. Tenga en cuenta que aunque los cifrados 3DES anuncian el uso de 168 bits, en realidad ofrecen 112 bits de seguridad.
Siempre hay que dar preferencia a las suites de cifrado que soportan el secreto (perfecto) hacia adelante (PFS), que garantiza la confidencialidad de los datos cifrados incluso en caso de que la clave del servidor se vea comprometida. Esto descarta el rápido intercambio de claves RSA, pero permite el uso de ECDHE y DHE. De los dos, ECDHE es el más rápido y, por tanto, la opción preferida.
También debe dar preferencia a los cifrados AEAD, como AES-GCM, antes que a los cifrados en modo CBC, ya que no son vulnerables a los ataques de oráculo de relleno. Además, en muchos casos, AES-GCM es más rápido que AES en modo CBC, especialmente cuando el hardware tiene aceleradores criptográficos para AES.
Tenga en cuenta también que cuando se utiliza el intercambio de claves ECDHE con certificados ECDSA, la transacción es incluso más rápida que el intercambio de claves RSA puro. Para dar soporte a los clientes antiguos, puedes instalar dos pares de certificados y claves en un servidor: uno con claves ECDSA (para los nuevos clientes) y otro con claves RSA (para los antiguos).
2.2.3. Longitud de la clave pública Copiar enlaceEnlace copiado en el portapapeles!
Cuando utilice claves RSA, prefiera siempre longitudes de clave de al menos 3072 bits firmadas por al menos SHA-256, que es lo suficientemente grande para una seguridad real de 128 bits.
La seguridad de tu sistema es tan fuerte como el eslabón más débil de la cadena. Por ejemplo, un cifrado fuerte por sí solo no garantiza una buena seguridad. Las claves y los certificados son igual de importantes, así como las funciones hash y las claves utilizadas por la Autoridad de Certificación (CA) para firmar sus claves.
Recursos adicionales
- Políticas criptográficas para todo el sistema en RHEL 8.
-
update-crypto-policies(8)página de manual
2.3. Endurecimiento de la configuración de TLS en las aplicaciones Copiar enlaceEnlace copiado en el portapapeles!
En Red Hat Enterprise Linux 8, las políticas criptográficas de todo el sistema proporcionan una manera conveniente de asegurar que sus aplicaciones que utilizan bibliotecas criptográficas no permiten protocolos, cifrados o algoritmos inseguros conocidos.
Si desea endurecer su configuración relacionada con TLS con sus ajustes criptográficos personalizados, puede utilizar las opciones de configuración criptográfica descritas en esta sección, y anular las políticas criptográficas de todo el sistema sólo en la cantidad mínima requerida.
Independientemente de la configuración que elija utilizar, asegúrese siempre de que su aplicación de servidor aplique server-side cipher order, de modo que el conjunto de cifrado que se utilice esté determinado por la orden que configure.
2.3.1. Configuración de la Apache HTTP server Copiar enlaceEnlace copiado en el portapapeles!
El Apache HTTP Server puede utilizar las bibliotecas OpenSSL y NSS para sus necesidades de TLS. Red Hat Enterprise Linux 8 proporciona la funcionalidad de mod_ssl a través de paquetes epónimos:
yum install mod_ssl
# yum install mod_ssl
El paquete mod_ssl instala el archivo de configuración /etc/httpd/conf.d/ssl.conf, que puede utilizarse para modificar los ajustes relacionados con TLS de Apache HTTP Server.
Instale el paquete httpd-manual para obtener la documentación completa de Apache HTTP Server, incluida la configuración de TLS. Las directivas disponibles en el archivo de configuración /etc/httpd/conf.d/ssl.conf se describen en detalle en /usr/share/httpd/manual/mod/mod_ssl.html. Ejemplos de varias configuraciones están en /usr/share/httpd/manual/ssl/ssl_howto.html.
Al modificar los ajustes en el archivo de configuración /etc/httpd/conf.d/ssl.conf, asegúrese de tener en cuenta como mínimo las tres directivas siguientes:
SSLProtocol- Utilice esta directiva para especificar la versión de TLS o SSL que desea permitir.
SSLCipherSuite- Utilice esta directiva para especificar su conjunto de cifrado preferido o deshabilitar los que desee no permitir.
SSLHonorCipherOrder-
Descomente y establezca esta directiva en
onpara asegurarse de que los clientes que se conectan se adhieren al orden de cifrado que ha especificado.
Por ejemplo, para utilizar sólo el protocolo TLS 1.2 y 1.3:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
2.3.2. Configuración del servidor HTTP y proxy de Nginx Copiar enlaceEnlace copiado en el portapapeles!
Para habilitar la compatibilidad con TLS 1.3 en Nginx, añada el valor TLSv1.3 a la opción ssl_protocols en la sección server del archivo de configuración /etc/nginx/nginx.conf:
2.3.3. Configuración del servidor de correo Dovecot Copiar enlaceEnlace copiado en el portapapeles!
Para configurar su instalación del servidor de correo Dovecot para utilizar TLS, modifique el archivo de configuración /etc/dovecot/conf.d/10-ssl.conf. Puede encontrar una explicación de algunas de las directivas de configuración básicas disponibles en ese archivo en el archivo /usr/share/doc/dovecot/wiki/SSL.DovecotConfiguration.txt, que se instala junto con la instalación estándar de Dovecot.
Al modificar los ajustes en el archivo de configuración /etc/dovecot/conf.d/10-ssl.conf, asegúrese de tener en cuenta como mínimo las tres directivas siguientes:
ssl_protocols- Utilice esta directiva para especificar la versión de TLS o SSL que desea permitir o deshabilitar.
ssl_cipher_list- Utilice esta directiva para especificar sus suites de cifrado preferidas o deshabilitar las que desee no permitir.
ssl_prefer_server_ciphers-
Descomente y establezca esta directiva en
yespara asegurarse de que los clientes que se conectan se adhieren al orden de cifrado que ha especificado.
Por ejemplo, la siguiente línea en /etc/dovecot/conf.d/10-ssl.conf sólo permite TLS 1.1 y posteriores:
ssl_protocols = !SSLv2 !SSLv3 !TLSv1
ssl_protocols = !SSLv2 !SSLv3 !TLSv1
Recursos adicionales
Para obtener más información sobre la configuración de TLS y otros temas relacionados, consulte los recursos que se indican a continuación.
-
la página de manual
config(5)describe el formato del archivo de configuración/etc/ssl/openssl.conf. -
la página de manual
ciphers(1)incluye una lista de palabras clave y cadenas de cifrado disponibles enOpenSSL. - Recomendaciones para el uso seguro de la seguridad de la capa de transporte (TLS) y la seguridad de la capa de transporte de datagramas (DTLS)
-
El generador de configuración de Mozilla SSL puede ayudar a crear archivos de configuración para
ApacheoNginxcon configuraciones seguras que deshabilitan los protocolos, cifrados y algoritmos hash vulnerables conocidos. - Laprueba de servidor SSL verifica que su configuración cumple con los requisitos de seguridad modernos.
Capítulo 3. Configuración de una VPN con IPsec Copiar enlaceEnlace copiado en el portapapeles!
En Red Hat Enterprise Linux 8, se puede configurar una red privada virtual (VPN) utilizando el protocolo IPsec, que es soportado por la aplicación Libreswan.
3.1. Libreswan como implementación de VPN IPsec Copiar enlaceEnlace copiado en el portapapeles!
En Red Hat Enterprise Linux 8, se puede configurar una Red Privada Virtual (VPN) utilizando el protocolo IPsec, que es soportado por la aplicación Libreswan. Libreswan es una continuación de la aplicación Openswan, y muchos ejemplos de la documentación Openswan son intercambiables con Libreswan.
El protocolo IPsec para una VPN se configura utilizando el protocolo Internet Key Exchange (IKE). Los términos IPsec e IKE se utilizan indistintamente. Una VPN IPsec también se denomina VPN IKE, VPN IKEv2, VPN XAUTH, VPN Cisco o VPN IKE/IPsec. Una variante de una VPN IPsec que también utiliza el Protocolo de Túnel de Nivel 2 (L2TP) suele llamarse VPN L2TP/IPsec, que requiere la aplicación del canal opcional xl2tpd.
Libreswan es una implementación de código abierto y espacio de usuario de IKE. IKE v1 y v2 se implementan como un demonio a nivel de usuario. El protocolo IKE también está cifrado. El protocolo IPsec es implementado por el kernel de Linux, y Libreswan configura el kernel para añadir y eliminar configuraciones de túneles VPN.
El protocolo IKE utiliza los puertos UDP 500 y 4500. El protocolo IPsec consta de dos protocolos:
-
Encapsulated Security Payload (
ESP), que tiene el número de protocolo 50. -
Authenticated Header (
AH), que tiene el número de protocolo 51.
No se recomienda el uso del protocolo AH. Se recomienda a los usuarios de AH que migren a ESP con cifrado nulo.
El protocolo IPsec ofrece dos modos de funcionamiento:
-
Tunnel Mode(por defecto) -
Transport Mode.
Se puede configurar el kernel con IPsec sin IKE. Esto se llama Manual Keying. También puede configurar la clave manual utilizando los comandos de ip xfrm, sin embargo, esto se desaconseja fuertemente por razones de seguridad. Libreswan interactúa con el kernel de Linux utilizando netlink. El cifrado y descifrado de paquetes se realiza en el kernel de Linux.
Libreswan utiliza la biblioteca criptográfica Network Security Services (NSS). Tanto Libreswan como NSS están certificados para su uso con la Publicación 140-2 de Federal Information Processing Standard (FIPS).
IKE/IPsec VPN, implementada por Libreswan y el kernel de Linux, es la única tecnología VPN recomendada para su uso en Red Hat Enterprise Linux 8. No utilice ninguna otra tecnología VPN sin entender los riesgos de hacerlo.
En Red Hat Enterprise Linux 8, Libreswan sigue a system-wide cryptographic policies por defecto. Esto asegura que Libreswan utiliza configuraciones seguras para los modelos de amenazas actuales, incluyendo IKEv2 como protocolo por defecto. Consulte Uso de políticas criptográficas en todo el sistema para obtener más información.
Libreswan no utiliza los términos "origen" y "destino" o "servidor" y "cliente" porque IKE/IPsec son protocolos peer to peer. En su lugar, utiliza los términos "izquierda" y "derecha" para referirse a los puntos finales (los hosts). Esto también permite utilizar la misma configuración en ambos puntos finales en la mayoría de los casos. Sin embargo, los administradores suelen optar por utilizar siempre "izquierda" para el host local y "derecha" para el host remoto.
3.2. Instalación de Libreswan Copiar enlaceEnlace copiado en el portapapeles!
Este procedimiento describe los pasos para instalar e iniciar la implementación de la VPN IPsec/IKE de Libreswan.
Requisitos previos
-
El repositorio
AppStreamestá activado.
Procedimiento
Instale los paquetes de
libreswan:yum install libreswan
# yum install libreswanCopy to Clipboard Copied! Toggle word wrap Toggle overflow Si está reinstalando
Libreswan, elimine sus antiguos archivos de base de datos:systemctl stop ipsec rm /etc/ipsec.d/*db
# systemctl stop ipsec # rm /etc/ipsec.d/*dbCopy to Clipboard Copied! Toggle word wrap Toggle overflow Inicie el servicio
ipsec, y habilite el servicio para que se inicie automáticamente al arrancar:systemctl enable ipsec --now
# systemctl enable ipsec --nowCopy to Clipboard Copied! Toggle word wrap Toggle overflow Configure el cortafuegos para permitir los puertos 500 y 4500/UDP para los protocolos IKE, ESP y AH añadiendo el servicio
ipsec:firewall-cmd --add-service="ipsec" firewall-cmd --runtime-to-permanent
# firewall-cmd --add-service="ipsec" # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3. Creación de una VPN de host a host Copiar enlaceEnlace copiado en el portapapeles!
Para configurar Libreswan para crear una VPN de host a host IPsec entre dos hosts denominados left y right, introduzca los siguientes comandos en ambos hosts:
Procedimiento
Generar un par de claves RSA en cada host:
ipsec newhostkey --output /etc/ipsec.d/hostkey.secrets
# ipsec newhostkey --output /etc/ipsec.d/hostkey.secretsCopy to Clipboard Copied! Toggle word wrap Toggle overflow El paso anterior devolvió la clave generada
ckaid. Utilice eseckaidcon el siguiente comando en left, por ejemplo:ipsec showhostkey --left --ckaid 2d3ea57b61c9419dfd6cf43a1eb6cb306c0e857d
# ipsec showhostkey --left --ckaid 2d3ea57b61c9419dfd6cf43a1eb6cb306c0e857dCopy to Clipboard Copied! Toggle word wrap Toggle overflow La salida del comando anterior generó la línea
leftrsasigkey=necesaria para la configuración. Haga lo mismo en el segundo host (right):ipsec showhostkey --right --ckaid a9e1f6ce9ecd3608c24e8f701318383f41798f03
# ipsec showhostkey --right --ckaid a9e1f6ce9ecd3608c24e8f701318383f41798f03Copy to Clipboard Copied! Toggle word wrap Toggle overflow En el directorio
/etc/ipsec.d/, cree un nuevo archivomy_host-to-host.conf. Escriba en el nuevo archivo las claves de host RSA de la salida de los comandos deipsec showhostkeyen el paso anterior. Por ejemplo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Después de importar las claves, reinicie el servicio
ipsec:systemctl restart ipsec
# systemctl restart ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow Inicio
Libreswan:ipsec setup start
# ipsec setup startCopy to Clipboard Copied! Toggle word wrap Toggle overflow Cargue la conexión:
ipsec auto --add mytunnel
# ipsec auto --add mytunnelCopy to Clipboard Copied! Toggle word wrap Toggle overflow Establece el túnel:
ipsec auto --up mytunnel
# ipsec auto --up mytunnelCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para iniciar automáticamente el túnel cuando se inicie el servicio
ipsec, añada la siguiente línea a la definición de la conexión:auto=inicio
auto=inicioCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4. Configuración de una VPN de sitio a sitio Copiar enlaceEnlace copiado en el portapapeles!
Para crear una VPN de sitio a sitio IPsec, al unir dos redes, se crea un túnel IPsec entre los dos hosts. Los hosts actúan así como puntos finales, que están configurados para permitir el paso del tráfico de una o más subredes. Por lo tanto, se puede pensar en los hosts como puertas de enlace hacia la parte remota de la red.
La configuración de la VPN de sitio a sitio sólo difiere de la VPN de host a host en que hay que especificar una o más redes o subredes en el archivo de configuración.
Requisitos previos
- Una VPN de host a host ya está configurada.
Procedimiento
Copie el archivo con la configuración de su VPN de host a host en un nuevo archivo, por ejemplo:
cp /etc/ipsec.d/my_host-to-host.conf /etc/ipsec.d/my_site-to-site.conf
# cp /etc/ipsec.d/my_host-to-host.conf /etc/ipsec.d/my_site-to-site.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añada la configuración de la subred al archivo creado en el paso anterior, por ejemplo:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.5. Configurar una VPN de acceso remoto Copiar enlaceEnlace copiado en el portapapeles!
Los guerreros de la carretera son usuarios que viajan con clientes móviles con una dirección IP asignada dinámicamente, como los ordenadores portátiles. Los clientes móviles se autentican mediante certificados.
El siguiente ejemplo muestra la configuración para IKEv2, y evita el uso del protocolo IKEv1 XAUTH.
En el servidor:
En el cliente móvil, el dispositivo del guerrero de la carretera, utilice una ligera variación de la configuración anterior:
3.6. Configurar una VPN de malla Copiar enlaceEnlace copiado en el portapapeles!
Una red VPN en malla, que también se conoce como VPN any-to-any, es una red en la que todos los nodos se comunican utilizando IPsec. La configuración permite excepciones para los nodos que no pueden utilizar IPsec. La red VPN en malla puede configurarse de dos maneras:
-
Requerir
IPsec. -
Para preferir
IPsec, pero permitir una vuelta a la comunicación en texto claro.
La autenticación entre los nodos puede basarse en certificados X.509 o en extensiones de seguridad DNS (DNSSEC).
El siguiente procedimiento utiliza certificados X.509. Estos certificados pueden generarse utilizando cualquier tipo de sistema de gestión de autoridades de certificación (CA), como el sistema de certificados Dogtag. Dogtag asume que los certificados de cada nodo están disponibles en el formato PKCS #12 (archivos .p12), que contienen la clave privada, el certificado del nodo y el certificado de la CA Raíz utilizado para validar los certificados X.509 de otros nodos.
Cada nodo tiene una configuración idéntica con la excepción de su certificado X.509. Esto permite añadir nuevos nodos sin reconfigurar ninguno de los existentes en la red. Los archivos PKCS #12 requieren un "nombre amistoso", para el que utilizamos el nombre "nodo", de modo que los archivos de configuración que hacen referencia al nombre amistoso pueden ser idénticos para todos los nodos.
Requisitos previos
-
se instala
Libreswany se inicia el servicioipsecen cada nodo.
Procedimiento
En cada nodo, importe los archivos PKCS #12. Este paso requiere la contraseña utilizada para generar los archivos PKCS #12:
ipsec import nodeXXX.p12
# ipsec import nodeXXX.p12Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cree las siguientes tres definiciones de conexión para los perfiles
IPsec required(privado),IPsec optional(privado o claro) yNo IPsec(claro):Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añada la dirección IP de la red en la categoría adecuada. Por ejemplo, si todos los nodos residen en la red 10.15.0.0/16, y todos los nodos deben ordenar el cifrado
IPsec:echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
# echo "10.15.0.0/16" >> /etc/ipsec.d/policies/privateCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para permitir que ciertos nodos, por ejemplo, 10.15.34.0/24, trabajen con y sin
IPsec, añada esos nodos al grupo de privados o limpios mediante:echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
# echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clearCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para definir un host, por ejemplo, 10.15.1.2, que no es capaz de
IPsecen el grupo claro, utilice:echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear
# echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clearCopy to Clipboard Copied! Toggle word wrap Toggle overflow Los archivos del directorio
/etc/ipsec.d/policiesse pueden crear a partir de una plantilla para cada nuevo nodo, o se pueden aprovisionar utilizando Puppet o Ansible.Tenga en cuenta que cada nodo tiene la misma lista de excepciones o diferentes expectativas de flujo de tráfico. Por lo tanto, dos nodos podrían no ser capaces de comunicarse porque uno requiere
IPsecy el otro no puede utilizarIPsec.Reinicie el nodo para añadirlo a la malla configurada:
systemctl restart ipsec
# systemctl restart ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow Una vez que haya terminado con la adición de nodos, un comando
pinges suficiente para abrir un túnelIPsec. Para ver qué túneles ha abierto un nodo:ipsec trafficstatus
# ipsec trafficstatusCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.7. Métodos de autentificación utilizados en Libreswan Copiar enlaceEnlace copiado en el portapapeles!
Puede utilizar los siguientes métodos para la autenticación de los puntos finales:
- Pre-Shared Keys (PSK) es el método de autenticación más sencillo. Los PSK deben estar formados por caracteres aleatorios y tener una longitud de al menos 20 caracteres. En el modo FIPS, los PSKs deben cumplir con un requisito de fuerza mínima dependiendo del algoritmo de integridad utilizado. Se recomienda no utilizar PSKs de menos de 64 caracteres aleatorios.
-
Raw RSA keys se utiliza habitualmente para configuraciones estáticas de host a host o de subred a subred
IPsec. Los hosts se configuran manualmente con la clave RSA pública de cada uno. Este método no se adapta bien cuando docenas o más hosts necesitan configurar túnelesIPsecentre sí. -
X.509 certificates se utiliza habitualmente para despliegues a gran escala en los que hay muchos hosts que necesitan conectarse a una pasarela común
IPsec. Se utiliza una certificate authority (CA) central para firmar certificados RSA para hosts o usuarios. Esta CA central es responsable de transmitir la confianza, incluyendo las revocaciones de hosts o usuarios individuales. -
NULL authentication se utiliza para obtener un cifrado de malla sin autenticación. Protege contra los ataques pasivos pero no protege contra los ataques activos. Sin embargo, como
IKEv2permite métodos de autenticación asimétricos, la autenticación NULL también puede utilizarse para IPsec oportunista a escala de Internet, donde los clientes autentican al servidor, pero los servidores no autentican al cliente. Este modelo es similar al de los sitios web seguros que utilizanTLS.
Protección contra los ordenadores cuánticos
Además de estos métodos de autenticación, puede utilizar el método Postquantum Preshared Keys (PPK) para protegerse de posibles ataques de ordenadores cuánticos. Los clientes individuales o los grupos de clientes pueden utilizar su propia PPK especificando un (PPKID) que corresponde a una clave precompartida configurada fuera de banda.
El uso de IKEv1 con claves precompartidas ofrecía protección contra los atacantes cuánticos. El rediseño de IKEv2 no ofrece esta protección de forma nativa. Libreswan ofrece el uso de Postquantum Preshared Keys (PPK) para proteger las conexiones de IKEv2 contra los ataques cuánticos.
Para activar el soporte opcional de PPK, añada ppk=yes a la definición de la conexión. Para exigir la PPK, añada ppk=insist. Entonces, a cada cliente se le puede dar un ID de PPK con un valor secreto que se comunica fuera de banda (y preferiblemente seguro desde el punto de vista cuántico). Las PPK deben ser muy fuertes en aleatoriedad y no estar basadas en palabras de diccionario. El ID PPK y los datos PPK en sí se almacenan en ipsec.secrets, por ejemplo:
@west @east : PPKS \ "user1" \N - "la cuerda es para llevarla a cabo"
@west @east : PPKS \ "user1" \N - "la cuerda es para llevarla a cabo"
La opción PPKS se refiere a los PPK estáticos. Una función experimental utiliza PPKs dinámicos basados en una almohadilla de un solo uso. En cada conexión, se utiliza una nueva parte de una almohadilla de un solo uso como PPK. Cuando se utiliza, esa parte del PPK dinámico dentro del archivo se sobrescribe con ceros para evitar su reutilización. Si no queda más material de la almohadilla de un solo uso, la conexión falla. Consulte la página de manual ipsec.secrets(5) para obtener más información.
La implementación de los PPK dinámicos se proporciona como una Muestra de Tecnología, y esta funcionalidad debe utilizarse con precaución.
3.8. Implementación de una VPN IPsec compatible con FIPS Copiar enlaceEnlace copiado en el portapapeles!
Utilice este procedimiento para implementar una solución VPN IPsec compatible con FIPS basada en Libreswan. Los siguientes pasos también le permiten identificar qué algoritmos criptográficos están disponibles y cuáles están desactivados para Libreswan en modo FIPS.
Requisitos previos
-
El repositorio
AppStreamestá activado.
Procedimiento
Instale los paquetes de
libreswan:yum install libreswan
# yum install libreswanCopy to Clipboard Copied! Toggle word wrap Toggle overflow Si está reinstalando
Libreswan, elimine su antigua base de datos NSS:systemctl stop ipsec rm /etc/ipsec.d/*db
# systemctl stop ipsec # rm /etc/ipsec.d/*dbCopy to Clipboard Copied! Toggle word wrap Toggle overflow Inicie el servicio
ipsec, y habilite el servicio para que se inicie automáticamente al arrancar:systemctl enable ipsec --now
# systemctl enable ipsec --nowCopy to Clipboard Copied! Toggle word wrap Toggle overflow Configure el cortafuegos para permitir los puertos 500 y 4500/UDP para los protocolos IKE, ESP y AH añadiendo el servicio
ipsec:firewall-cmd --add-service="ipsec" firewall-cmd --runtime-to-permanent
# firewall-cmd --add-service="ipsec" # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow Cambie el sistema al modo FIPS en RHEL 8:
fips-mode-setup --enable
# fips-mode-setup --enableCopy to Clipboard Copied! Toggle word wrap Toggle overflow Reinicie su sistema para permitir que el kernel cambie al modo FIPS:
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Pasos de verificación
Para confirmar que Libreswan funciona en modo FIPS:
ipsec whack --fipsstatus 000 FIPS mode enabled
# ipsec whack --fipsstatus 000 FIPS mode enabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow También puede comprobar las entradas de la unidad
ipsecen el diariosystemd:journalctl -u ipsec ... Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Product: YES Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Kernel: YES Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Mode: YES
$ journalctl -u ipsec ... Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Product: YES Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Kernel: YES Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Mode: YESCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para ver los algoritmos disponibles en el modo FIPS:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para consultar los algoritmos desactivados en el modo FIPS:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para listar todos los algoritmos y cifrados permitidos en el modo FIPS:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
3.9. Proteger la base de datos IPsec NSS con una contraseña Copiar enlaceEnlace copiado en el portapapeles!
Por defecto, el servicio IPsec crea su base de datos de Servicios de Seguridad de Red (NSS) con una contraseña vacía durante el primer inicio. Añada la protección con contraseña siguiendo los siguientes pasos.
En las versiones anteriores de RHEL hasta la versión 6.6, había que proteger la base de datos de IPsec NSS con una contraseña para cumplir los requisitos de FIPS 140-2 porque las bibliotecas criptográficas de NSS estaban certificadas para el estándar FIPS 140-2 Nivel 2. En RHEL 8, el NIST certificó NSS para el nivel 1 de esta norma, y este estado no requiere la protección con contraseña de la base de datos.
Requisito previo
-
El directorio
/etc/ipsec.dcontiene los archivos de la base de datos NSS.
Procedimiento
Activar la protección por contraseña de la base de datos
NSSparaLibreswan:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cree el archivo
/etc/ipsec.d/nsspasswordcon la contraseña que ha establecido en el paso anterior, por ejemplo:cat /etc/ipsec.d/nsspassword NSS Certificate DB:MyStrongPasswordHere
# cat /etc/ipsec.d/nsspassword NSS Certificate DB:MyStrongPasswordHereCopy to Clipboard Copied! Toggle word wrap Toggle overflow Tenga en cuenta que el archivo
nsspasswordutiliza la siguiente sintaxis:token_1_name:the_password token_2_name:the_password
token_1_name:the_password token_2_name:the_passwordCopy to Clipboard Copied! Toggle word wrap Toggle overflow El token de software NSS por defecto es
NSS Certificate DB. Si su sistema funciona en modo FIPS, el nombre del token esNSS FIPS 140-2 Certificate DB.Dependiendo de su escenario, inicie o reinicie el servicio
ipsecdespués de terminar el archivonsspassword:systemctl restart ipsec
# systemctl restart ipsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Pasos de verificación
Compruebe que el servicio
ipsecestá funcionando después de haber añadido una contraseña no vacía a su base de datos NSS:systemctl status ipsec ● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disable> Active: active (running)...
# systemctl status ipsec ● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disable> Active: active (running)...Copy to Clipboard Copied! Toggle word wrap Toggle overflow Opcionalmente, compruebe que el registro
Journalcontiene entradas que confirman una inicialización exitosa:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
-
La página de manual
certutil(1). - Para obtener más información sobre las certificaciones relacionadas con FIPS 140-2, consulte el artículo de la base de conocimientos sobre normas gubernamentales.
3.10. Configurar las conexiones IPsec que optan por las políticas criptográficas de todo el sistema Copiar enlaceEnlace copiado en el portapapeles!
Anulación de las políticas criptográficas de todo el sistema para una conexión
Las políticas criptográficas de todo el sistema RHEL crean una conexión especial llamada fault. Esta conexión contiene los valores por defecto para las opciones ikev2, esp, y ike. Sin embargo, puede anular los valores por defecto especificando la opción mencionada en el archivo de configuración de la conexión.
Por ejemplo, la siguiente configuración permite conexiones que utilizan IKEv1 con AES y SHA-1 o SHA-2, e IPsec (ESP) con AES-GCM o AES-CBC:
Tenga en cuenta que AES-GCM está disponible para IPsec (ESP) y para IKEv2, pero no para IKEv1.
Desactivación de las políticas criptográficas de todo el sistema para todas las conexiones
Para desactivar las políticas criptográficas de todo el sistema para todas las conexiones IPsec, comente la siguiente línea en el archivo /etc/ipsec.conf:
incluir /etc/crypto-policies/back-ends/libreswan.config
incluir /etc/crypto-policies/back-ends/libreswan.config
A continuación, añada la opción ikev2=never a su archivo de configuración de la conexión.
Recursos adicionales
- Para más información, consulte Uso de políticas criptográficas en todo el sistema.
3.11. Resolución de problemas de configuración de VPN IPsec Copiar enlaceEnlace copiado en el portapapeles!
Los problemas relacionados con las configuraciones de VPN IPsec suelen producirse por varias razones principales. Si se encuentra con este tipo de problemas, puede comprobar si la causa del problema se corresponde con alguno de los siguientes escenarios, y aplicar la solución correspondiente.
Solución de problemas básicos de conexión
La mayoría de los problemas con las conexiones VPN se producen en las nuevas implantaciones, en las que los administradores configuran los puntos finales con opciones de configuración que no coinciden. Además, una configuración que funciona puede dejar de hacerlo repentinamente, a menudo debido a valores incompatibles introducidos recientemente. Esto puede ser el resultado de que un administrador cambie la configuración. Alternativamente, un administrador puede haber instalado una actualización de firmware o una actualización de paquete con diferentes valores por defecto para ciertas opciones, como los algoritmos de cifrado.
Para confirmar que se ha establecido una conexión VPN IPsec:
ipsec trafficstatus 006 #8: "vpn.example.com"[1] 192.0.2.1, type=ESP, add_time=1595296930, inBytes=5999, outBytes=3231, id='@vpn.example.com', lease=100.64.13.5/32
# ipsec trafficstatus
006 #8: "vpn.example.com"[1] 192.0.2.1, type=ESP, add_time=1595296930, inBytes=5999, outBytes=3231, id='@vpn.example.com', lease=100.64.13.5/32
Si la salida está vacía o no muestra una entrada con el nombre de la conexión, el túnel está roto.
Para comprobar que el problema está en la conexión:
Vuelva a cargar la conexión vpn.example.com:
ipsec auto --add vpn.example.com 002 added connection description "vpn.example.com"
# ipsec auto --add vpn.example.com 002 added connection description "vpn.example.com"Copy to Clipboard Copied! Toggle word wrap Toggle overflow A continuación, inicie la conexión VPN:
ipsec auto --up vpn.example.com
# ipsec auto --up vpn.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Problemas relacionados con los cortafuegos
El problema más común es que un firewall en uno de los puntos finales de IPsec o en un router entre los puntos finales está dejando caer todos los paquetes de intercambio de claves de Internet (IKE).
Para IKEv2, una salida similar al siguiente ejemplo indica un problema con un firewall:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para IKEv1, la salida del comando de iniciación tiene el siguiente aspecto:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Debido a que el protocolo IKE, que se utiliza para configurar IPsec, está encriptado, sólo puede solucionar un subconjunto limitado de problemas utilizando la herramienta tcpdump. Si un cortafuegos está dejando caer paquetes IKE o IPsec, puedes intentar encontrar la causa utilizando la utilidad tcpdump. Sin embargo, tcpdump no puede diagnosticar otros problemas con las conexiones VPN IPsec.
Para capturar la negociación de la VPN y todos los datos cifrados en la interfaz
eth0:tcpdump -i eth0 -n -n esp or udp port 500 or udp port 4500 or tcp port 4500
# tcpdump -i eth0 -n -n esp or udp port 500 or udp port 4500 or tcp port 4500Copy to Clipboard Copied! Toggle word wrap Toggle overflow Algoritmos, protocolos y políticas no coincidentes
Las conexiones VPN requieren que los puntos finales tengan algoritmos IKE, algoritmos IPsec y rangos de direcciones IP que coincidan. Si se produce un desajuste, la conexión falla. Si identifica un desajuste mediante uno de los siguientes métodos, arréglelo alineando algoritmos, protocolos o políticas.
Si el extremo remoto no está ejecutando IKE/IPsec, puede ver un paquete ICMP indicándolo. Por ejemplo:
ipsec auto --up vpn.example.com ... 000 "vpn.example.com"[1] 192.0.2.2 #16: ERROR: asynchronous network error report on wlp2s0 (192.0.2.2:500), complainant 198.51.100.1: Connection refused [errno 111, origin ICMP type 3 code 3 (not authenticated)] ...
# ipsec auto --up vpn.example.com ... 000 "vpn.example.com"[1] 192.0.2.2 #16: ERROR: asynchronous network error report on wlp2s0 (192.0.2.2:500), complainant 198.51.100.1: Connection refused [errno 111, origin ICMP type 3 code 3 (not authenticated)] ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow Ejemplo de algoritmos IKE no coincidentes:
ipsec auto --up vpn.example.com ... 003 "vpn.example.com"[1] 193.110.157.148 #3: dropping unexpected IKE_SA_INIT message containing NO_PROPOSAL_CHOSEN notification; message payloads: N; missing payloads: SA,KE,Ni
# ipsec auto --up vpn.example.com ... 003 "vpn.example.com"[1] 193.110.157.148 #3: dropping unexpected IKE_SA_INIT message containing NO_PROPOSAL_CHOSEN notification; message payloads: N; missing payloads: SA,KE,NiCopy to Clipboard Copied! Toggle word wrap Toggle overflow Ejemplo de algoritmos IPsec no coincidentes:
ipsec auto --up vpn.example.com ... 182 "vpn.example.com"[1] 193.110.157.148 #5: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_256 group=MODP2048} 002 "vpn.example.com"[1] 193.110.157.148 #6: IKE_AUTH response contained the error notification NO_PROPOSAL_CHOSEN# ipsec auto --up vpn.example.com ... 182 "vpn.example.com"[1] 193.110.157.148 #5: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_256 group=MODP2048} 002 "vpn.example.com"[1] 193.110.157.148 #6: IKE_AUTH response contained the error notification NO_PROPOSAL_CHOSENCopy to Clipboard Copied! Toggle word wrap Toggle overflow Una versión de IKE que no coincida también puede hacer que el punto final remoto abandone la solicitud sin respuesta. Esto parece idéntico a un cortafuegos que abandona todos los paquetes IKE.
Ejemplo de rangos de direcciones IP no coincidentes para IKEv2 (llamados selectores de tráfico - TS):
ipsec auto --up vpn.example.com ... 1v2 "vpn.example.com" #1: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_512 group=MODP2048} 002 "vpn.example.com" #2: IKE_AUTH response contained the error notification TS_UNACCEPTABLE# ipsec auto --up vpn.example.com ... 1v2 "vpn.example.com" #1: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_512 group=MODP2048} 002 "vpn.example.com" #2: IKE_AUTH response contained the error notification TS_UNACCEPTABLECopy to Clipboard Copied! Toggle word wrap Toggle overflow Ejemplo de rangos de direcciones IP no coincidentes para IKEv1:
ipsec auto --up vpn.example.com ... 031 "vpn.example.com" #2: STATE_QUICK_I1: 60 second timeout exceeded after 0 retransmits. No acceptable response to our first Quick Mode message: perhaps peer likes no proposal
# ipsec auto --up vpn.example.com ... 031 "vpn.example.com" #2: STATE_QUICK_I1: 60 second timeout exceeded after 0 retransmits. No acceptable response to our first Quick Mode message: perhaps peer likes no proposalCopy to Clipboard Copied! Toggle word wrap Toggle overflow Cuando se utilizan PreSharedKeys (PSK) en IKEv1, si ambas partes no ponen la misma PSK, todo el mensaje IKE se vuelve ilegible:
ipsec auto --up vpn.example.com ... 003 "vpn.example.com" #1: received Hash Payload does not match computed value 223 "vpn.example.com" #1: sending notification INVALID_HASH_INFORMATION to 192.0.2.23:500
# ipsec auto --up vpn.example.com ... 003 "vpn.example.com" #1: received Hash Payload does not match computed value 223 "vpn.example.com" #1: sending notification INVALID_HASH_INFORMATION to 192.0.2.23:500Copy to Clipboard Copied! Toggle word wrap Toggle overflow En IKEv2, el error de PSK no coincidente resulta en un mensaje AUTHENTICATION_FAILED:
ipsec auto --up vpn.example.com ... 002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
# ipsec auto --up vpn.example.com ... 002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILEDCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Unidad máxima de transmisión
Aparte de los cortafuegos que bloquean los paquetes IKE o IPsec, la causa más común de los problemas de red está relacionada con el aumento del tamaño de los paquetes cifrados. El hardware de red fragmenta los paquetes más grandes que la unidad de transmisión máxima (MTU), por ejemplo, 1500 bytes. A menudo, los fragmentos se pierden y los paquetes no se vuelven a ensamblar. Esto provoca fallos intermitentes, cuando una prueba de ping, que utiliza paquetes de pequeño tamaño, funciona pero el resto del tráfico falla. En este caso, se puede establecer una sesión SSH pero el terminal se congela en cuanto se utiliza, por ejemplo, introduciendo el comando 'ls -al /usr' en el host remoto.
Para solucionar el problema, reduzca el tamaño de la MTU añadiendo la opción mtu=1400 al archivo de configuración del túnel.
Alternativamente, para las conexiones TCP, active una regla iptables que cambie el valor de MSS:
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Si el comando anterior no resuelve el problema en su escenario, especifique directamente un tamaño menor en el parámetro set-mss:
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380
Traducción de direcciones de red (NAT)
Cuando un host IPsec también sirve como router NAT, podría reasignar accidentalmente los paquetes. El siguiente ejemplo de configuración demuestra el problema:
El sistema con dirección 172.16.0.1 tiene una regla NAT:
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
Si el sistema en la dirección 10.0.2.33 envía un paquete a 192.168.0.1, el router traduce la fuente 10.0.2.33 a 172.16.0.1 antes de aplicar el cifrado IPsec.
Entonces, el paquete con la dirección de origen 10.0.2.33 ya no coincide con la configuración de conn myvpn, e IPsec no cifra este paquete.
Para resolver este problema, inserte reglas que excluyan NAT para los rangos de subred IPsec de destino en el router, en este ejemplo:
iptables -t nat -I POSTROUTING -s 10.0.2.0/24 -d 192.168.0.0/16 -j RETURN
iptables -t nat -I POSTROUTING -s 10.0.2.0/24 -d 192.168.0.0/16 -j RETURN
Errores en el subsistema IPsec del kernel
El subsistema IPsec del kernel puede fallar, por ejemplo, cuando un error provoca una desincronización del espacio de usuario de IKE y del kernel IPsec. Para comprobar este tipo de problemas:
cat /proc/net/xfrm_stat XfrmInError 0 XfrmInBufferError 0 ...
$ cat /proc/net/xfrm_stat
XfrmInError 0
XfrmInBufferError 0
...
Cualquier valor distinto de cero en la salida del comando anterior indica un problema. Si encuentra este problema, abra un nuevo caso de soporte, y adjunte la salida del comando anterior junto con los registros de IKE correspondientes.
Registros de Libreswan
Libreswan registra utilizando el protocolo syslog por defecto. Puedes utilizar el comando journalctl para encontrar entradas de registro relacionadas con IPsec. Como las entradas correspondientes al registro son enviadas por el demonio IKE de pluto, busque la palabra clave "pluto", por ejemplo:
journalctl -b | grep pluto
$ journalctl -b | grep pluto
Para mostrar un registro en vivo para el servicio ipsec:
journalctl -f -u ipsec
$ journalctl -f -u ipsec
Si el nivel de registro por defecto no revela su problema de configuración, active los registros de depuración añadiendo la opción plutodebug=all a la sección config setup del archivo /etc/ipsec.conf.
Tenga en cuenta que el registro de depuración produce muchas entradas, y es posible que el servicio journald o syslogd limite la velocidad de los mensajes syslog. Para asegurarse de que tiene registros completos, redirija el registro a un archivo. Edita el /etc/ipsec.conf, y añade el logfile=/var/log/pluto.log en la sección config setup.
Recursos adicionales
- Solución de problemas mediante archivos de registro
- Uso y configuración de firewalld
-
tcpdump(8)yipsec.conf(5)páginas man
Capítulo 4. Configuración de MACsec Copiar enlaceEnlace copiado en el portapapeles!
La siguiente sección proporciona información sobre cómo configurar Media Control Access Security (MACsec), que es una tecnología de seguridad estándar 802.1AE IEEE para la comunicación segura en todo el tráfico de los enlaces Ethernet.
4.1. Introducción a MACsec Copiar enlaceEnlace copiado en el portapapeles!
Media Access Control Security (MACsec, IEEE 802.1AE) cifra y autentifica todo el tráfico en las redes LAN con el algoritmo GCM-AES-128. MACsec puede proteger no sólo IP sino también el Protocolo de Resolución de Direcciones (ARP), el Descubrimiento de Vecinos (ND) o DHCP. Mientras que IPsec opera en la capa de red (capa 3) y SSL o TLS en la capa de aplicación (capa 7), MACsec opera en la capa de enlace de datos (capa 2). Combina MACsec con protocolos de seguridad para otras capas de red para aprovechar las diferentes características de seguridad que ofrecen estos estándares.
4.2. Uso de MACsec con la herramienta nmcli Copiar enlaceEnlace copiado en el portapapeles!
Este procedimiento muestra cómo configurar MACsec con la herramienta nmcli.
Requisitos previos
- El NetworkManager debe estar en funcionamiento.
-
Ya tiene un CAK hexadecimal de 16 bytes (
$MKA_CAK) y un CKN hexadecimal de 32 bytes ($MKA_CKN).
Procedimiento
Para añadir una nueva conexión utilizando
nmcli, introduzca:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Sustituya macsec0 por el nombre del dispositivo que desea configurar.
Para activar la conexión, introduzca:
nmcli connection up test-macsec
~]# nmcli connection up test-macsecCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Después de este paso, el dispositivo macsec0 está configurado y puede utilizarse para la conexión en red.
4.3. Uso de MACsec con wpa_supplicant Copiar enlaceEnlace copiado en el portapapeles!
Este procedimiento muestra cómo habilitar MACsec con un conmutador que realiza la autenticación utilizando un par precompartido de clave de asociación de conectividad/nombre CAK (CAK/CKN).
Procedimiento
Crea un par CAK/CKN. Por ejemplo, el siguiente comando genera una clave de 16 bytes en notación hexadecimal:
dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%02x"'
~]$ dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%02x"'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cree el archivo de configuración
wpa_supplicant.confy añada las siguientes líneas:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Utilice los valores del paso anterior para completar las líneas
mka_cakymka_cknen el archivo de configuraciónwpa_supplicant.conf.Para más información, consulte la página de manual
wpa_supplicant.conf(5).Asumiendo que está usando wlp61s0 para conectarse a su red, inicie wpa_supplicant utilizando el siguiente comando:
wpa_supplicant -i wlp61s0 -Dmacsec_linux -c wpa_supplicant.conf
~]# wpa_supplicant -i wlp61s0 -Dmacsec_linux -c wpa_supplicant.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Capítulo 5. Uso y configuración de firewalld Copiar enlaceEnlace copiado en el portapapeles!
Un firewall es una forma de proteger las máquinas de cualquier tráfico no deseado procedente del exterior. Permite a los usuarios controlar el tráfico de red entrante en las máquinas anfitrionas definiendo un conjunto de firewall rules. Estas reglas se utilizan para clasificar el tráfico entrante y bloquearlo o permitirlo.
Tenga en cuenta que firewalld con el backend nftables no admite el paso de reglas personalizadas nftables a firewalld, utilizando la opción --direct.
5.1. Cuándo utilizar firewalld, nftables o iptables Copiar enlaceEnlace copiado en el portapapeles!
A continuación se presenta un breve resumen en el que se debe utilizar una de las siguientes utilidades:
-
firewalld: Utilice la utilidadfirewalldpara casos de uso de cortafuegos sencillos. La utilidad es fácil de usar y cubre los casos de uso típicos para estos escenarios. -
nftables: Utilice la utilidadnftablespara configurar cortafuegos complejos y de rendimiento crítico, como por ejemplo para toda una red. -
iptables: La utilidadiptablesen Red Hat Enterprise Linux 8 utiliza la API del kernelnf_tablesen lugar del back endlegacy. La APInf_tablesproporciona compatibilidad con versiones anteriores para que los scripts que utilizan comandosiptablessigan funcionando en Red Hat Enterprise Linux 8. Para los nuevos scripts de cortafuegos, Red Hat recomienda utilizarnftables.
Para evitar que los diferentes servicios de firewall se influyan mutuamente, ejecute sólo uno de ellos en un host RHEL y desactive los demás servicios.
5.2. Cómo empezar con firewalld Copiar enlaceEnlace copiado en el portapapeles!
5.2.1. firewalld Copiar enlaceEnlace copiado en el portapapeles!
firewalld es un demonio de servicio de cortafuegos que proporciona un cortafuegos dinámico personalizable basado en el host con una interfaz D-Bus. Al ser dinámico, permite crear, cambiar y eliminar las reglas sin necesidad de reiniciar el demonio del cortafuegos cada vez que se cambian las reglas.
firewalld utiliza los conceptos de zones y services, que simplifican la gestión del tráfico. Las zonas son conjuntos predefinidos de reglas. Se pueden asignar interfaces de red y fuentes a una zona. El tráfico permitido depende de la red a la que esté conectado el ordenador y del nivel de seguridad que tenga asignado esta red. Los servicios del cortafuegos son reglas predefinidas que cubren todos los ajustes necesarios para permitir el tráfico entrante para un servicio específico y se aplican dentro de una zona.
Los servicios utilizan uno o más ports o addresses para la comunicación en red. Los cortafuegos filtran la comunicación basándose en los puertos. Para permitir el tráfico de red para un servicio, sus puertos deben ser open. firewalld bloquea todo el tráfico en los puertos que no están explícitamente establecidos como abiertos. Algunas zonas, como trusted, permiten todo el tráfico por defecto.
5.2.2. Zonas Copiar enlaceEnlace copiado en el portapapeles!
firewalld puede utilizarse para separar las redes en diferentes zonas según el nivel de confianza que el usuario haya decidido otorgar a las interfaces y al tráfico dentro de esa red. Una conexión sólo puede formar parte de una zona, pero una zona puede utilizarse para muchas conexiones de red.
NetworkManager notifica a firewalld la zona de una interfaz. Puede asignar zonas a las interfaces con:
-
NetworkManager -
firewall-configherramienta -
firewall-cmdherramienta de línea de comandos - La consola web de RHEL
Los tres últimos sólo pueden editar los archivos de configuración correspondientes de NetworkManager. Si se cambia la zona de la interfaz mediante la consola web, firewall-cmd o firewall-config, la solicitud se reenvía a NetworkManager y no es gestionada porfirewalld.
Las zonas predefinidas se almacenan en el directorio /usr/lib/firewalld/zones/ y pueden aplicarse instantáneamente a cualquier interfaz de red disponible. Estos archivos se copian en el directorio /etc/firewalld/zones/ sólo después de ser modificados. La configuración por defecto de las zonas predefinidas es la siguiente:
block-
Cualquier conexión de red entrante es rechazada con un mensaje icmp-host-prohibido para
IPv4e icmp6-adm-prohibido paraIPv6. Sólo son posibles las conexiones de red iniciadas desde dentro del sistema. dmz- Para los ordenadores de su zona desmilitarizada de acceso público con acceso limitado a su red interna. Sólo se aceptan las conexiones entrantes seleccionadas.
drop- Todos los paquetes de red entrantes se descartan sin ninguna notificación. Sólo son posibles las conexiones de red salientes.
external- Para usar en redes externas con el enmascaramiento activado, especialmente para los routers. No confía en que los otros ordenadores de la red no dañen su ordenador. Sólo se aceptan las conexiones entrantes seleccionadas.
home- Para usar en casa cuando se confía principalmente en los otros ordenadores de la red. Sólo se aceptan las conexiones entrantes seleccionadas.
internal- Para su uso en redes internas cuando se confía principalmente en los otros ordenadores de la red. Sólo se aceptan las conexiones entrantes seleccionadas.
public- Para su uso en áreas públicas donde no se confía en otros ordenadores de la red. Sólo se aceptan las conexiones entrantes seleccionadas.
trusted- Se aceptan todas las conexiones de red.
work- Para su uso en el trabajo, donde se confía principalmente en los otros ordenadores de la red. Sólo se aceptan las conexiones entrantes seleccionadas.
Una de estas zonas se establece como la zona default. Cuando se añaden conexiones de interfaz a NetworkManager, se asignan a la zona por defecto. En la instalación, la zona por defecto en firewalld se establece como la zona public. La zona por defecto se puede cambiar.
Los nombres de las zonas de red deben ser autoexplicativos y permitir a los usuarios tomar rápidamente una decisión razonable. Para evitar cualquier problema de seguridad, revise la configuración de la zona por defecto y desactive cualquier servicio innecesario según sus necesidades y evaluaciones de riesgo.
5.2.3. Servicios predefinidos Copiar enlaceEnlace copiado en el portapapeles!
Un servicio puede ser una lista de puertos locales, protocolos, puertos de origen y destinos, así como una lista de módulos de ayuda del cortafuegos que se cargan automáticamente si el servicio está activado. El uso de servicios ahorra tiempo a los usuarios porque pueden realizar varias tareas, como abrir puertos, definir protocolos, habilitar el reenvío de paquetes, etc., en un solo paso, en lugar de configurar todo uno tras otro.
Las opciones de configuración de los servicios y la información genérica de los archivos se describen en la página man firewalld.service(5). Los servicios se especifican mediante archivos de configuración XML individuales, que se denominan con el siguiente formato service-name.xml. Se prefieren los nombres de los protocolos a los de los servicios o aplicaciones en firewalld.
Los servicios pueden añadirse y eliminarse mediante la herramienta gráfica firewall-config, firewall-cmd, y firewall-offline-cmd.
También puede editar los archivos XML en el directorio /etc/firewalld/services/. Si el usuario no añade o modifica un servicio, no se encuentra el archivo XML correspondiente en /etc/firewalld/services/. Los archivos del directorio /usr/lib/firewalld/services/ pueden utilizarse como plantillas si se desea añadir o modificar un servicio.
Recursos adicionales
-
firewalld.service(5)página de manual
5.3. Instalación de la herramienta de configuración GUI firewall-config Copiar enlaceEnlace copiado en el portapapeles!
Para utilizar la herramienta de configuración GUI firewall-config, instale el paquete firewall-config.
Procedimiento
Introduzca el siguiente comando como
root:yum install firewall-config
# yum install firewall-configCopy to Clipboard Copied! Toggle word wrap Toggle overflow Alternativamente, en
GNOME, use the Super key and type `Softwarepara iniciar la aplicaciónSoftware Sources. Escribafirewallen el cuadro de búsqueda, que aparece después de seleccionar el botón de búsqueda en la esquina superior derecha. Seleccione el elementoFirewallde los resultados de la búsqueda y haga clic en el botón .-
Para ejecutar
firewall-config, utilice el comandofirewall-configo pulse la tecla Super para entrar enActivities Overview, escribafirewally pulse Enter.
5.4. Ver el estado actual y la configuración de firewalld Copiar enlaceEnlace copiado en el portapapeles!
5.4.1. Ver el estado actual de firewalld Copiar enlaceEnlace copiado en el portapapeles!
El servicio de cortafuegos, firewalld, está instalado en el sistema por defecto. Utilice la interfaz CLI de firewalld para comprobar que el servicio se está ejecutando.
Procedimiento
Para ver el estado del servicio:
firewall-cmd --state
# firewall-cmd --stateCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para obtener más información sobre el estado del servicio, utilice el subcomando
systemctl status:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
Es importante saber cómo está configurado firewalld y qué reglas están en vigor antes de intentar editar la configuración. Para mostrar la configuración del cortafuegos, consulte Sección 5.4.2, “Ver la configuración actual de firewalld”
5.4.2. Ver la configuración actual de firewalld Copiar enlaceEnlace copiado en el portapapeles!
5.4.2.1. Visualización de los servicios permitidos mediante la GUI Copiar enlaceEnlace copiado en el portapapeles!
Para ver la lista de servicios mediante la herramienta gráfica firewall-config pulse la tecla Super para acceder a la vista general de actividades, escriba firewall y pulse Intro. Aparece la herramienta firewall-config aparece la herramienta. Ahora puede ver la lista de servicios en la pestaña Services.
Como alternativa, para iniciar la herramienta gráfica de configuración del cortafuegos mediante la línea de comandos, introduzca el siguiente comando:
firewall-config
$ firewall-config
Se abre la ventana Firewall Configuration. Tenga en cuenta que este comando se puede ejecutar como un usuario normal, pero ocasionalmente se le pedirá una contraseña de administrador.
5.4.2.2. Visualización de la configuración de firewalld mediante la CLI Copiar enlaceEnlace copiado en el portapapeles!
Con el cliente CLI, es posible obtener diferentes vistas de la configuración actual del cortafuegos. La opción --list-all muestra una visión completa de la configuración de firewalld.
firewalld utiliza zonas para gestionar el tráfico. Si no se especifica una zona mediante la opción --zone, el comando es efectivo en la zona por defecto asignada a la interfaz de red y la conexión activas.
Para listar toda la información relevante para la zona por defecto:
Para especificar la zona para la que se muestran los ajustes, añada el argumento --zone=zone-name al comando firewall-cmd --list-all, por ejemplo:
Para ver la configuración de una información concreta, como los servicios o los puertos, utilice una opción específica. Consulte las páginas del manual firewalld u obtenga una lista de las opciones utilizando la ayuda del comando:
Por ejemplo, para ver qué servicios están permitidos en la zona actual:
firewall-cmd --list-services ssh dhcpv6-client
# firewall-cmd --list-services
ssh dhcpv6-client
El listado de las configuraciones para una determinada subparte utilizando la herramienta CLI puede ser a veces difícil de interpretar. Por ejemplo, usted permite el servicio SSH y firewalld abre el puerto necesario (22) para el servicio. Más tarde, si se listan los servicios permitidos, la lista muestra el servicio SSH, pero si se listan los puertos abiertos, no muestra ninguno. Por lo tanto, se recomienda utilizar la opción --list-all para asegurarse de recibir una información completa.
5.5. Iniciando firewalld Copiar enlaceEnlace copiado en el portapapeles!
Procedimiento
Para iniciar
firewalld, introduzca el siguiente comando comoroot:systemctl unmask firewalld systemctl start firewalld
# systemctl unmask firewalld # systemctl start firewalldCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para garantizar que
firewalldse inicie automáticamente al arrancar el sistema, introduzca el siguiente comando comoroot:systemctl enable firewalld
# systemctl enable firewalldCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.6. Detención de firewalld Copiar enlaceEnlace copiado en el portapapeles!
Procedimiento
Para detener
firewalld, introduzca el siguiente comando comoroot:systemctl stop firewalld
# systemctl stop firewalldCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para evitar que
firewalldse inicie automáticamente al arrancar el sistema:systemctl disable firewalld
# systemctl disable firewalldCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para asegurarse de que firewalld no se inicia accediendo a la interfaz
firewalldD-Busy también si otros servicios requierenfirewalld:systemctl mask firewalld
# systemctl mask firewalldCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.7. Tiempo de ejecución y ajustes permanentes Copiar enlaceEnlace copiado en el portapapeles!
Cualquier cambio realizado en el modo runtime sólo se aplica mientras firewalld está en funcionamiento. Cuando se reinicia firewalld, los ajustes vuelven a sus valores de permanent.
Para que los cambios persistan en los reinicios, aplíquelos de nuevo utilizando la opción --permanent. Alternativamente, para hacer que los cambios sean persistentes mientras se ejecuta firewalld, utilice la opción --runtime-to-permanent firewall-cmd .
Si establece las reglas mientras firewalld se está ejecutando utilizando sólo la opción --permanent, no se hacen efectivas antes de que se reinicie firewalld. Sin embargo, al reiniciar firewalld se cierran todos los puertos abiertos y se detiene el tráfico de red.
Modificación de ajustes en tiempo de ejecución y configuración permanente mediante CLI
Utilizando la CLI, no se modifica la configuración del cortafuegos en ambos modos al mismo tiempo. Sólo se modifica el modo de tiempo de ejecución o el modo permanente. Para modificar la configuración del cortafuegos en el modo permanente, utilice la opción --permanent con el comando firewall-cmd.
firewall-cmd --permanent <other options>
# firewall-cmd --permanent <other options>
Sin esta opción, el comando modifica el modo de ejecución.
Para cambiar la configuración en ambos modos, puedes utilizar dos métodos:
Cambie la configuración de tiempo de ejecución y luego hágala permanente de la siguiente manera:
firewall-cmd <other options> firewall-cmd --runtime-to-permanent
# firewall-cmd <other options> # firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow Establezca los ajustes permanentes y recargue los ajustes en el modo de ejecución:
firewall-cmd --permanent <other options> firewall-cmd --reload
# firewall-cmd --permanent <other options> # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
El primer método permite probar los ajustes antes de aplicarlos al modo permanente.
Es posible, especialmente en los sistemas remotos, que una configuración incorrecta haga que un usuario se bloquee en una máquina. Para evitar estas situaciones, utilice la opción --timeout. Después de un tiempo determinado, cualquier cambio vuelve a su estado anterior. El uso de esta opción excluye la opción --permanent.
Por ejemplo, para añadir el servicio SSH durante 15 minutos:
firewall-cmd --add-service=ssh --timeout 15m
# firewall-cmd --add-service=ssh --timeout 15m
5.8. Verificación de la configuración permanente de firewalld Copiar enlaceEnlace copiado en el portapapeles!
En ciertas situaciones, por ejemplo después de editar manualmente los archivos de configuración de firewalld, los administradores quieren verificar que los cambios son correctos. Esta sección describe cómo verificar la configuración permanente del servicio firewalld.
Requisitos previos
-
El servicio
firewalldestá funcionando.
Procedimiento
Verifique la configuración permanente del servicio
firewalld:firewall-cmd --check-config success
# firewall-cmd --check-config successCopy to Clipboard Copied! Toggle word wrap Toggle overflow Si la configuración permanente es válida, el comando devuelve
success. En otros casos, el comando devuelve un error con más detalles, como el siguiente:firewall-cmd --check-config Error: INVALID_PROTOCOL: 'public.xml': 'tcpx' not from {'tcp'|'udp'|'sctp'|'dccp'}# firewall-cmd --check-config Error: INVALID_PROTOCOL: 'public.xml': 'tcpx' not from {'tcp'|'udp'|'sctp'|'dccp'}Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.9. Controlar el tráfico de la red mediante firewalld Copiar enlaceEnlace copiado en el portapapeles!
5.9.1. Desactivación de todo el tráfico en caso de emergencia mediante CLI Copiar enlaceEnlace copiado en el portapapeles!
En una situación de emergencia, como un ataque al sistema, es posible desactivar todo el tráfico de la red y cortar al atacante.
Procedimiento
Para desactivar inmediatamente el tráfico de red, active el modo de pánico:
firewall-cmd --panic-on
# firewall-cmd --panic-onCopy to Clipboard Copied! Toggle word wrap Toggle overflow
La activación del modo pánico detiene todo el tráfico de red. Por esta razón, debe ser utilizado sólo cuando se tiene el acceso físico a la máquina o si se inicia la sesión utilizando una consola serie.
Al desactivar el modo de pánico, el cortafuegos vuelve a su configuración permanente. Para desactivar el modo de pánico:
firewall-cmd --panic-off
# firewall-cmd --panic-off
Para ver si el modo de pánico está activado o desactivado, utilice:
firewall-cmd --query-panic
# firewall-cmd --query-panic
5.9.2. Control del tráfico con servicios predefinidos mediante CLI Copiar enlaceEnlace copiado en el portapapeles!
El método más sencillo para controlar el tráfico es añadir un servicio predefinido a firewalld. Así se abren todos los puertos necesarios y se modifican otras configuraciones según el service definition file.
Procedimiento
Compruebe que el servicio no está ya permitido:
firewall-cmd --list-services ssh dhcpv6-client
# firewall-cmd --list-services ssh dhcpv6-clientCopy to Clipboard Copied! Toggle word wrap Toggle overflow Enumerar todos los servicios predefinidos:
firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry ... [trimmed for clarity]
# firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry ... [trimmed for clarity]Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añade el servicio a los servicios permitidos:
firewall-cmd --add-service=<nombre-servicio>
# firewall-cmd --add-service=<nombre-servicio>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.9.3. Control del tráfico con servicios predefinidos mediante la interfaz gráfica de usuario Copiar enlaceEnlace copiado en el portapapeles!
Para activar o desactivar un servicio predefinido o personalizado:
- Inicie la herramienta firewall-config herramienta y seleccione la zona de red cuyos servicios se van a configurar.
-
Seleccione la pestaña
Services. - Seleccione la casilla de cada tipo de servicio en el que desee confiar o desactive la casilla para bloquear un servicio.
Para editar un servicio:
- Inicie la firewall-config herramienta.
-
Seleccione
Permanenten el menú denominadoConfiguration. En la parte inferior de la ventana de aparecen otros iconos y botones de menú. - Seleccione el servicio que desea configurar.
Las pestañas Ports, Protocols, y Source Port permiten añadir, cambiar y eliminar puertos, protocolos y puerto de origen para el servicio seleccionado. La pestaña de módulos es para configurar Netfilter módulos de ayuda. La pestaña Destination permite limitar el tráfico a una dirección de destino y un protocolo de Internet concretos (IPv4 o IPv6).
No es posible modificar los ajustes de servicio en el modo Runtime.
5.9.4. Añadir nuevos servicios Copiar enlaceEnlace copiado en el portapapeles!
Los servicios pueden añadirse y eliminarse utilizando la herramienta gráfica firewall-config firewall-cmd y firewall-offline-cmd. También se pueden editar los archivos XML en /etc/firewalld/services/. Si el usuario no añade o modifica un servicio, no se encuentra el archivo XML correspondiente en /etc/firewalld/services/. Los archivos /usr/lib/firewalld/services/ pueden utilizarse como plantillas si se desea añadir o modificar un servicio.
Los nombres de los servicios deben ser alfanuméricos y, además, sólo pueden incluir los caracteres _ (guión bajo) y - (guión).
Procedimiento
Para añadir un nuevo servicio en un terminal, utilice firewall-cmd, o firewall-offline-cmd en caso de que no esté activo firewalld.
Introduzca el siguiente comando para añadir un servicio nuevo y vacío:
firewall-cmd --new-service=service-name --permanent
$ firewall-cmd --new-service=service-name --permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para añadir un nuevo servicio utilizando un archivo local, utilice el siguiente comando:
firewall-cmd --new-service-from-file=service-name.xml --permanent
$ firewall-cmd --new-service-from-file=service-name.xml --permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow Puede cambiar el nombre del servicio con la opción adicional
--name=service-nameadicional.En cuanto se modifican los ajustes del servicio, se coloca una copia actualizada del mismo en
/etc/firewalld/services/.Como
root, puede introducir el siguiente comando para copiar un servicio manualmente:cp /usr/lib/firewalld/services/service-name.xml /etc/firewalld/services/service-name.xml
# cp /usr/lib/firewalld/services/service-name.xml /etc/firewalld/services/service-name.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
firewalld carga los archivos de /usr/lib/firewalld/services en primer lugar. Si los archivos se colocan en /etc/firewalld/services y son válidos, entonces estos anularán los archivos coincidentes de /usr/lib/firewalld/services. Los archivos anulados en /usr/lib/firewalld/services se utilizan tan pronto como los archivos coincidentes en /etc/firewalld/services se hayan eliminado o si se ha pedido a firewalld que cargue los valores predeterminados de los servicios. Esto se aplica sólo al entorno permanente. Se necesita una recarga para obtener estos fallbacks también en el entorno de ejecución.
5.9.5. Controlar los puertos mediante la CLI Copiar enlaceEnlace copiado en el portapapeles!
Los puertos son dispositivos lógicos que permiten a un sistema operativo recibir y distinguir el tráfico de red y reenviarlo en consecuencia a los servicios del sistema. Suelen estar representados por un demonio que escucha en el puerto, es decir, que espera cualquier tráfico que llegue a este puerto.
Normalmente, los servicios del sistema escuchan en los puertos estándar que están reservados para ellos. El demonio httpd, por ejemplo, escucha en el puerto 80. Sin embargo, los administradores del sistema configuran por defecto los dæmons para que escuchen en diferentes puertos para mejorar la seguridad o por otras razones.
5.9.5.1. Abrir un puerto Copiar enlaceEnlace copiado en el portapapeles!
A través de los puertos abiertos, el sistema es accesible desde el exterior, lo que representa un riesgo de seguridad. Por lo general, mantén los puertos cerrados y sólo ábrelos si son necesarios para determinados servicios.
Procedimiento
Para obtener una lista de puertos abiertos en la zona actual:
Lista de todos los puertos permitidos:
firewall-cmd --list-ports
# firewall-cmd --list-portsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade un puerto a los puertos permitidos para abrirlo al tráfico entrante:
firewall-cmd --add-port=número de puerto/tipo de puerto
# firewall-cmd --add-port=número de puerto/tipo de puertoCopy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Los tipos de puerto son tcp, udp, sctp, o dccp. El tipo debe coincidir con el tipo de comunicación de red.
5.9.5.2. Cerrar un puerto Copiar enlaceEnlace copiado en el portapapeles!
Cuando un puerto abierto ya no es necesario, cierre ese puerto en firewalld. Se recomienda encarecidamente cerrar todos los puertos innecesarios en cuanto no se utilicen, ya que dejar un puerto abierto representa un riesgo para la seguridad.
Procedimiento
Para cerrar un puerto, elimínelo de la lista de puertos permitidos:
Lista de todos los puertos permitidos:
firewall-cmd --list-ports [WARNING] ==== This command will only give you a list of ports that have been opened as ports. You will not be able to see any open ports that have been opened as a service. Therefore, you should consider using the --list-all option instead of --list-ports. ====
# firewall-cmd --list-ports [WARNING] ==== This command will only give you a list of ports that have been opened as ports. You will not be able to see any open ports that have been opened as a service. Therefore, you should consider using the --list-all option instead of --list-ports. ====Copy to Clipboard Copied! Toggle word wrap Toggle overflow Elimina el puerto de los puertos permitidos para cerrarlo al tráfico entrante:
firewall-cmd --remove-port=número de puerto/tipo de puerto
# firewall-cmd --remove-port=número de puerto/tipo de puertoCopy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.9.6. Abrir puertos mediante la GUI Copiar enlaceEnlace copiado en el portapapeles!
Para permitir el tráfico a través del firewall a un determinado puerto:
- Inicie la firewall-config herramienta y seleccione la zona de red cuya configuración desea modificar.
-
Seleccione la pestaña
Portsy haga clic en el botón de la derecha. Se abre la ventanaPort and Protocol. - Introduzca el número de puerto o el rango de puertos a permitir.
-
Seleccione
tcpoudpde la lista.
5.9.7. Control del tráfico con protocolos mediante GUI Copiar enlaceEnlace copiado en el portapapeles!
Para permitir el tráfico a través del cortafuegos utilizando un determinado protocolo:
- Inicie la firewall-config herramienta y seleccione la zona de red cuya configuración desea modificar.
-
Seleccione la pestaña
Protocolsy haga clic en el botónAddde la derecha. Se abre la ventanaProtocol. -
Seleccione un protocolo de la lista o marque la casilla
Other Protocole introduzca el protocolo en el campo.
5.9.8. Abrir puertos de origen mediante la GUI Copiar enlaceEnlace copiado en el portapapeles!
Para permitir el tráfico a través del cortafuegos desde un determinado puerto:
- Inicie la herramienta de configuración del cortafuegos y seleccione la zona de red cuya configuración desea modificar.
-
Seleccione la pestaña
Source Porty haga clic en el botónAddde la derecha. Se abre la ventanaSource Port. -
Introduzca el número de puerto o el rango de puertos a permitir. Seleccione
tcpoudpde la lista.
5.10. Trabajar con zonas de firewalld Copiar enlaceEnlace copiado en el portapapeles!
Las zonas representan un concepto para gestionar el tráfico entrante de forma más transparente. Las zonas están conectadas a interfaces de red o se les asigna un rango de direcciones de origen. Las reglas del cortafuegos se gestionan para cada zona de forma independiente, lo que permite definir configuraciones complejas del cortafuegos y aplicarlas al tráfico.
5.10.1. Zonas de cotización Copiar enlaceEnlace copiado en el portapapeles!
Procedimiento
Para ver qué zonas están disponibles en su sistema:
firewall-cmd --get-zones
# firewall-cmd --get-zonesCopy to Clipboard Copied! Toggle word wrap Toggle overflow El comando
firewall-cmd --get-zonesmuestra todas las zonas que están disponibles en el sistema, pero no muestra ningún detalle de zonas concretas.Para ver información detallada de todas las zonas:
firewall-cmd --list-all-zones
# firewall-cmd --list-all-zonesCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para ver información detallada de una zona concreta:
firewall-cmd --zone=nombre-de-la-zona --list-all
# firewall-cmd --zone=nombre-de-la-zona --list-allCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.10.2. Modificación de la configuración de firewalld para una zona determinada Copiar enlaceEnlace copiado en el portapapeles!
En Sección 5.9.2, “Control del tráfico con servicios predefinidos mediante CLI” y Sección 5.9.5, “Controlar los puertos mediante la CLI” se explica cómo añadir servicios o modificar puertos en el ámbito de la zona de trabajo actual. A veces, es necesario establecer reglas en una zona diferente.
Procedimiento
-
Para trabajar en una zona diferente, utilice la opción
--zone=zone-nameopción. Por ejemplo, para permitir el servicioSSHen la zona public:
firewall-cmd --add-service=ssh --zone=public
# firewall-cmd --add-service=ssh --zone=public
5.10.3. Cambiar la zona por defecto Copiar enlaceEnlace copiado en el portapapeles!
Los administradores del sistema asignan una zona a una interfaz de red en sus archivos de configuración. Si una interfaz no está asignada a una zona específica, se asigna a la zona por defecto. Después de cada reinicio del servicio firewalld, firewalld carga la configuración de la zona por defecto y la activa.
Procedimiento
Para configurar la zona por defecto:
Muestra la zona actual por defecto:
firewall-cmd --get-default-zone
# firewall-cmd --get-default-zoneCopy to Clipboard Copied! Toggle word wrap Toggle overflow Establezca la nueva zona por defecto:
firewall-cmd --set-default-zone zone-name
# firewall-cmd --set-default-zone zone-nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow NotaSiguiendo este procedimiento, el ajuste es permanente, incluso sin la opción
--permanent.
5.10.4. Asignación de una interfaz de red a una zona Copiar enlaceEnlace copiado en el portapapeles!
Es posible definir diferentes conjuntos de reglas para diferentes zonas y luego cambiar la configuración rápidamente cambiando la zona para la interfaz que se está utilizando. Con múltiples interfaces, se puede establecer una zona específica para cada una de ellas para distinguir el tráfico que llega a través de ellas.
Procedimiento
Para asignar la zona a una interfaz específica:
Enumera las zonas activas y las interfaces asignadas a ellas:
firewall-cmd --get-active-zones
# firewall-cmd --get-active-zonesCopy to Clipboard Copied! Toggle word wrap Toggle overflow Asigne la interfaz a una zona diferente:
firewall-cmd --zone=zone_name --change-interface=interface_name --permanent
# firewall-cmd --zone=zone_name --change-interface=interface_name --permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.10.5. Asignación de una zona a una conexión mediante nmcli Copiar enlaceEnlace copiado en el portapapeles!
Este procedimiento describe cómo añadir una zona de firewalld a una conexión de NetworkManager utilizando la utilidad nmcli.
Procedimiento
Asigna la zona al perfil de conexión de NetworkManager:
nmcli connection modify profile connection.zone zone_name
# nmcli connection modify profile connection.zone zone_nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow Recarga la conexión:
nmcli connection up profile
# nmcli connection up profileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.10.6. Asignación manual de una zona a una conexión de red en un archivo ifcfg Copiar enlaceEnlace copiado en el portapapeles!
Cuando la conexión es gestionada por NetworkManagerdebe conocer una zona que utiliza. Para cada conexión de red, se puede especificar una zona, lo que proporciona la flexibilidad de varias configuraciones de cortafuegos según la ubicación del ordenador con dispositivos portátiles. Así, se pueden especificar zonas y configuraciones para diferentes ubicaciones, como la empresa o el hogar.
Procedimiento
Para establecer una zona para una conexión, edite el archivo
/etc/sysconfig/network-scripts/ifcfg-connection_namey añada una línea que asigne una zona a esta conexión:ZONA=zone_name
ZONA=zone_nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.10.7. Crear una nueva zona Copiar enlaceEnlace copiado en el portapapeles!
Para utilizar zonas personalizadas, cree una nueva zona y utilícela igual que una zona predefinida. Las nuevas zonas requieren la opción --permanent, de lo contrario el comando no funciona.
Procedimiento
Para crear una nueva zona:
Crear una nueva zona:
firewall-cmd --new-zone=nombre-de-zona
# firewall-cmd --new-zone=nombre-de-zonaCopy to Clipboard Copied! Toggle word wrap Toggle overflow Compruebe si la nueva zona se ha añadido a su configuración permanente:
firewall-cmd --get-zones
# firewall-cmd --get-zonesCopy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.10.8. Archivos de configuración de zona Copiar enlaceEnlace copiado en el portapapeles!
Las zonas también pueden crearse utilizando un zone configuration file. Este enfoque puede ser útil cuando se necesita crear una nueva zona, pero se quiere reutilizar la configuración de otra zona y sólo alterarla un poco.
Un archivo de configuración de zona firewalld contiene la información de una zona. Se trata de la descripción de la zona, los servicios, los puertos, los protocolos, los bloqueos icmp, la mascarada, los puertos de reenvío y las reglas de lenguaje enriquecido en formato de archivo XML. El nombre del archivo debe ser zone-name.xml donde la longitud de zone-name está limitada actualmente a 17 caracteres. Los archivos de configuración de zona se encuentran en los directorios /usr/lib/firewalld/zones/ y /etc/firewalld/zones/.
El siguiente ejemplo muestra una configuración que permite un servicio (SSH) y un rango de puertos, tanto para los protocolos TCP como UDP:
Para cambiar la configuración de esa zona, añada o elimine secciones para añadir puertos, reenviar puertos, servicios, etc.
Recursos adicionales
-
Para más información, consulte las páginas del manual
firewalld.zone.
5.10.9. Uso de objetivos de zona para establecer el comportamiento por defecto para el tráfico entrante Copiar enlaceEnlace copiado en el portapapeles!
Para cada zona, se puede establecer un comportamiento por defecto que gestione el tráfico entrante que no se especifique más. Este comportamiento se define estableciendo el objetivo de la zona. Hay cuatro opciones - default, ACCEPT, REJECT, y DROP. Si se establece el objetivo en ACCEPT, se aceptan todos los paquetes entrantes excepto los deshabilitados por una regla específica. Si establece el objetivo en REJECT o DROP, deshabilita todos los paquetes entrantes excepto los que haya permitido en reglas específicas. Cuando los paquetes son rechazados, la máquina de origen es informada del rechazo, mientras que no se envía ninguna información cuando los paquetes son descartados.
Procedimiento
Para establecer un objetivo para una zona:
Enumerar la información de la zona específica para ver el objetivo por defecto:
firewall-cmd --zone=zone-name --list-all
$ firewall-cmd --zone=zone-name --list-allCopy to Clipboard Copied! Toggle word wrap Toggle overflow Establece un nuevo objetivo en la zona:
firewall-cmd --permanent --zone=nombre-de-zona --set-target=<default|ACCEPT|REJECT|DROP>
# firewall-cmd --permanent --zone=nombre-de-zona --set-target=<default|ACCEPT|REJECT|DROP>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.11. Uso de zonas para gestionar el tráfico entrante en función de una fuente Copiar enlaceEnlace copiado en el portapapeles!
5.11.1. Uso de zonas para gestionar el tráfico entrante en función de una fuente Copiar enlaceEnlace copiado en el portapapeles!
Puede utilizar las zonas para gestionar el tráfico entrante en función de su origen. Esto le permite clasificar el tráfico entrante y enrutarlo a través de diferentes zonas para permitir o rechazar los servicios que pueden ser alcanzados por ese tráfico.
Si añade una fuente a una zona, ésta se activa y todo el tráfico entrante procedente de esa fuente será dirigido a través de ella. Puede especificar diferentes configuraciones para cada zona, que se aplican al tráfico de las fuentes dadas en consecuencia. Puede utilizar más zonas aunque sólo tenga una interfaz de red.
5.11.2. Añadir una fuente Copiar enlaceEnlace copiado en el portapapeles!
Para enrutar el tráfico entrante hacia una fuente específica, añada la fuente a esa zona. El origen puede ser una dirección IP o una máscara IP en la notación Classless Inter-domain Routing (CIDR).
En caso de que añada varias zonas con un rango de red superpuesto, se ordenan alfanuméricamente por nombre de zona y sólo se tiene en cuenta la primera.
Para fijar la fuente en la zona actual:
firewall-cmd --add-source=<source>
# firewall-cmd --add-source=<source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para establecer la dirección IP de origen para una zona específica:
firewall-cmd --zone=nombre-de-la-zona --add-source=<source>
# firewall-cmd --zone=nombre-de-la-zona --add-source=<source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
El siguiente procedimiento permite todo el tráfico entrante de 192.168.2.15 en la zona trusted:
Procedimiento
Enumera todas las zonas disponibles:
firewall-cmd --get-zones
# firewall-cmd --get-zonesCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade la IP de origen a la zona de confianza en el modo permanente:
firewall-cmd --zone=trusted --add-source=192.168.2.15
# firewall-cmd --zone=trusted --add-source=192.168.2.15Copy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.11.3. Eliminar una fuente Copiar enlaceEnlace copiado en el portapapeles!
Al eliminar una fuente de la zona se corta el tráfico procedente de ella.
Procedimiento
Lista de fuentes permitidas para la zona requerida:
firewall-cmd --zone=nombre-de-la-zona --list-sources
# firewall-cmd --zone=nombre-de-la-zona --list-sourcesCopy to Clipboard Copied! Toggle word wrap Toggle overflow Eliminar la fuente de la zona de forma permanente:
firewall-cmd --zone=nombre-de-zona --remove-source=<source>
# firewall-cmd --zone=nombre-de-zona --remove-source=<source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.11.4. Añadir un puerto de origen Copiar enlaceEnlace copiado en el portapapeles!
Para habilitar la clasificación del tráfico basada en un puerto de origen, especifique un puerto de origen utilizando la opción --add-source-port. También puede combinar esto con la opción --add-source para limitar el tráfico a una determinada dirección IP o rango de IP.
Procedimiento
Para añadir un puerto de origen:
firewall-cmd --zone=nombre-de-la-zona --add-source-port=-nombre-de-puerto>/<tcp|udp|sctp|dccp>
# firewall-cmd --zone=nombre-de-la-zona --add-source-port=-nombre-de-puerto>/<tcp|udp|sctp|dccp>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.11.5. Eliminación de un puerto de origen Copiar enlaceEnlace copiado en el portapapeles!
Al eliminar un puerto de origen se desactiva la clasificación del tráfico en función de un puerto de origen.
Procedimiento
Para eliminar un puerto de origen:
firewall-cmd --zone=nombre-de-la-zona --remove-source-port=-nombre-de-puerto>/<tcp|udp|sctp|dccp>
# firewall-cmd --zone=nombre-de-la-zona --remove-source-port=-nombre-de-puerto>/<tcp|udp|sctp|dccp>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.11.6. Uso de zonas y fuentes para permitir un servicio sólo para un dominio específico Copiar enlaceEnlace copiado en el portapapeles!
Para permitir que el tráfico de una red específica utilice un servicio en una máquina, utilice zonas y origen. El siguiente procedimiento permite que el tráfico de 192.168.1.0/24 pueda llegar al servicio HTTP mientras que cualquier otro tráfico está bloqueado.
Procedimiento
Enumera todas las zonas disponibles:
firewall-cmd --get-zones block dmz drop external home internal public trusted work
# firewall-cmd --get-zones block dmz drop external home internal public trusted workCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade el origen a la zona de confianza para enrutar el tráfico originado por el origen a través de la zona:
firewall-cmd --zone=trusted --add-source=192.168.1.0/24
# firewall-cmd --zone=trusted --add-source=192.168.1.0/24Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añade el servicio http en la zona de confianza:
firewall-cmd --zone=trusted --add-service=http
# firewall-cmd --zone=trusted --add-service=httpCopy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow Compruebe que la zona de confianza está activa y que el servicio está permitido en ella:
firewall-cmd --zone=trusted --list-all trusted (active) target: ACCEPT sources: 192.168.1.0/24 services: http
# firewall-cmd --zone=trusted --list-all trusted (active) target: ACCEPT sources: 192.168.1.0/24 services: httpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.11.7. Configurar el tráfico aceptado por una zona en función de un protocolo Copiar enlaceEnlace copiado en el portapapeles!
Puede permitir que el tráfico entrante sea aceptado por una zona basándose en un protocolo. Todo el tráfico que utiliza el protocolo especificado es aceptado por una zona, en la que puede aplicar más reglas y filtrado.
5.11.7.1. Añadir un protocolo a una zona Copiar enlaceEnlace copiado en el portapapeles!
Al añadir un protocolo a una zona determinada, se permite que todo el tráfico con este protocolo sea aceptado por esta zona.
Procedimiento
Para añadir un protocolo a una zona:
firewall-cmd --zone=nombre-de-zona --add-protocolo=nombre-de-puerto/tcp|udp|sctp|dccp|igmp
# firewall-cmd --zone=nombre-de-zona --add-protocolo=nombre-de-puerto/tcp|udp|sctp|dccp|igmpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Para recibir tráfico de multidifusión, utilice el valor igmp con la opción --add-protocol.
5.11.7.2. Eliminar un protocolo de una zona Copiar enlaceEnlace copiado en el portapapeles!
Al eliminar un protocolo de una zona determinada, se deja de aceptar todo el tráfico basado en este protocolo por la zona.
Procedimiento
Para eliminar un protocolo de una zona:
firewall-cmd --zone=nombre-de-zona --remove-protocolo=nombre-de-puerto/tcp|udp|sctp|dccp|igmp
# firewall-cmd --zone=nombre-de-zona --remove-protocolo=nombre-de-puerto/tcp|udp|sctp|dccp|igmpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.12. Configuración del enmascaramiento de direcciones IP Copiar enlaceEnlace copiado en el portapapeles!
El siguiente procedimiento describe cómo habilitar el enmascaramiento de IP en su sistema. El enmascaramiento de IP oculta las máquinas individuales detrás de una puerta de enlace cuando se accede a Internet.
Procedimiento
Para comprobar si el enmascaramiento de IP está activado (por ejemplo, para la zona
external), introduzca el siguiente comando comoroot:firewall-cmd --zone=external --query-masquerade
# firewall-cmd --zone=external --query-masqueradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow El comando imprime
yescon el estado de salida0si está activado. Imprimenocon el estado de salida1en caso contrario. Si se omitezone, se utilizará la zona por defecto.Para activar el enmascaramiento de IP, introduzca el siguiente comando como
root:firewall-cmd --zone=external --add-masquerade
# firewall-cmd --zone=external --add-masqueradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
Para que esta configuración sea persistente, repita el comando añadiendo la opción
--permanent.
Para desactivar el enmascaramiento de IP, introduzca el siguiente comando como root:
firewall-cmd --zone=external --remove-masquerade --permanent
# firewall-cmd --zone=external --remove-masquerade --permanent
5.13. Reenvío de puertos Copiar enlaceEnlace copiado en el portapapeles!
El redireccionamiento de puertos mediante este método sólo funciona para el tráfico basado en IPv4. Para la configuración de redireccionamiento de IPv6, debe utilizar reglas ricas.
Para redirigir a un sistema externo, es necesario habilitar el enmascaramiento. Para más información, consulte Configuración del enmascaramiento de direcciones IP.
5.13.1. Añadir un puerto para redirigir Copiar enlaceEnlace copiado en el portapapeles!
Utilizando firewalld, puede configurar la redirección de puertos para que cualquier tráfico entrante que llegue a un determinado puerto de su sistema sea entregado a otro puerto interno de su elección o a un puerto externo de otra máquina.
Requisitos previos
- Antes de redirigir el tráfico de un puerto a otro puerto, o a otra dirección, hay que saber tres cosas: a qué puerto llegan los paquetes, qué protocolo se utiliza y a dónde se quiere redirigir.
Procedimiento
Para redirigir un puerto a otro puerto:
firewall-cmd --add-forward-port=puerto=número de puerto:proto=tcp|udp|sctp|dccp:toport=número de puerto
# firewall-cmd --add-forward-port=puerto=número de puerto:proto=tcp|udp|sctp|dccp:toport=número de puerto
Para redirigir un puerto a otro puerto en una dirección IP diferente:
Añade el puerto a reenviar:
firewall-cmd --add-forward-port=puerto=número de puerto:proto=tcp|udp:toport=número de puerto:toaddr=IP
# firewall-cmd --add-forward-port=puerto=número de puerto:proto=tcp|udp:toport=número de puerto:toaddr=IPCopy to Clipboard Copied! Toggle word wrap Toggle overflow Habilitar la mascarada:
firewall-cmd --add-masquerade
# firewall-cmd --add-masqueradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.13.2. Redirigir el puerto TCP 80 al puerto 88 en la misma máquina Copiar enlaceEnlace copiado en el portapapeles!
Siga los pasos para redirigir el puerto TCP 80 al puerto 88.
Procedimiento
Redirige el puerto 80 al puerto 88 para el tráfico TCP:
firewall-cmd --add-forward-port=80:proto=tcp:toport=88
# firewall-cmd --add-forward-port=80:proto=tcp:toport=88Copy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow Compruebe que el puerto está redirigido:
firewall-cmd --list-all
# firewall-cmd --list-allCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.13.3. Eliminación de un puerto redirigido Copiar enlaceEnlace copiado en el portapapeles!
Para eliminar un puerto redirigido:
firewall-cmd --remove-forward-port=puerto=número de puerto:proto=<tcp|udp>:toport=número de puerto:toaddr=<IP>
# firewall-cmd --remove-forward-port=puerto=número de puerto:proto=<tcp|udp>:toport=número de puerto:toaddr=<IP>
Para eliminar un puerto redirigido a una dirección diferente, utilice el siguiente procedimiento.
Procedimiento
Elimina el puerto reenviado:
firewall-cmd --remove-forward-port=puerto=número de puerto:proto=<tcp|udp>:toport=número de puerto:toaddr=<IP>
# firewall-cmd --remove-forward-port=puerto=número de puerto:proto=<tcp|udp>:toport=número de puerto:toaddr=<IP>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Desactivar la mascarada:
firewall-cmd --remove-masquerade
# firewall-cmd --remove-masqueradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.13.4. Eliminación del puerto TCP 80 reenviado al puerto 88 en la misma máquina Copiar enlaceEnlace copiado en el portapapeles!
Para eliminar la redirección de puertos:
Procedimiento
Lista de puertos redirigidos:
firewall-cmd --list-forward-ports port=80:proto=tcp:toport=88:toaddr=
~]# firewall-cmd --list-forward-ports port=80:proto=tcp:toport=88:toaddr=Copy to Clipboard Copied! Toggle word wrap Toggle overflow Elimine el puerto redirigido del cortafuegos::
firewall-cmd --remove-forward-port=port=80:proto=tcp:toport=88:toaddr=
~]# firewall-cmd --remove-forward-port=port=80:proto=tcp:toport=88:toaddr=Copy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
~]# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.14. Gestión de peticiones ICMP Copiar enlaceEnlace copiado en el portapapeles!
El Internet Control Message Protocol (ICMP) es un protocolo de apoyo que utilizan varios dispositivos de red para enviar mensajes de error e información operativa que indican un problema de conexión, por ejemplo, que un servicio solicitado no está disponible. ICMP se diferencia de los protocolos de transporte como TCP y UDP porque no se utiliza para intercambiar datos entre sistemas.
Lamentablemente, es posible utilizar los mensajes de ICMP, especialmente echo-request y echo-reply, para revelar información sobre su red y hacer un mal uso de dicha información para diversos tipos de actividades fraudulentas. Por lo tanto, firewalld permite bloquear las solicitudes de ICMP para proteger la información de su red.
5.14.1. Listado y bloqueo de peticiones ICMP Copiar enlaceEnlace copiado en el portapapeles!
Listado ICMP solicitudes
Las solicitudes de ICMP se describen en archivos XML individuales que se encuentran en el directorio /usr/lib/firewalld/icmptypes/. Puede leer estos archivos para ver una descripción de la solicitud. El comando firewall-cmd controla la manipulación de las peticiones de ICMP.
Para listar todos los tipos disponibles de
ICMP:firewall-cmd --get-icmptypes
# firewall-cmd --get-icmptypesCopy to Clipboard Copied! Toggle word wrap Toggle overflow La petición
ICMPpuede ser utilizada por IPv4, IPv6 o por ambos protocolos. Para ver para qué protocolo se utiliza la peticiónICMP:firewall-cmd --info-icmptype=<icmptype>
# firewall-cmd --info-icmptype=<icmptype>Copy to Clipboard Copied! Toggle word wrap Toggle overflow El estado de una solicitud
ICMPmuestrayessi la solicitud está actualmente bloqueada onosi no lo está. Para ver si una solicitud deICMPestá actualmente bloqueada:firewall-cmd --query-icmp-block=<icmptype>
# firewall-cmd --query-icmp-block=<icmptype>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Bloqueo o desbloqueo de las solicitudes de ICMP
Cuando su servidor bloquea las solicitudes de ICMP, no proporciona la información que normalmente proporcionaría. Sin embargo, eso no significa que no se proporcione ninguna información. Los clientes reciben información de que la petición ICMP en particular está siendo bloqueada (rechazada). El bloqueo de las peticiones a ICMP debe considerarse cuidadosamente, porque puede causar problemas de comunicación, especialmente con el tráfico IPv6.
Para ver si una solicitud de
ICMPestá actualmente bloqueada:firewall-cmd --query-icmp-block=<icmptype>
# firewall-cmd --query-icmp-block=<icmptype>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para bloquear una solicitud de
ICMP:firewall-cmd --add-icmp-block=<icmptype>
# firewall-cmd --add-icmp-block=<icmptype>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para eliminar el bloqueo de una solicitud de
ICMP:firewall-cmd --remove-icmp-block=<icmptype>
# firewall-cmd --remove-icmp-block=<icmptype>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Bloqueo de las solicitudes de ICMP sin proporcionar ninguna información
Normalmente, si bloqueas las peticiones de ICMP, los clientes saben que lo estás bloqueando. Por lo tanto, un atacante potencial que esté husmeando en busca de direcciones IP activas todavía es capaz de ver que tu dirección IP está en línea. Para ocultar esta información por completo, tienes que eliminar todas las peticiones de ICMP.
-
Para bloquear y abandonar todas las solicitudes de
ICMP:
Establezca el objetivo de su zona en
DROP:firewall-cmd --permanent --set-target=DROP
# firewall-cmd --permanent --set-target=DROPCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Ahora, todo el tráfico, incluyendo las solicitudes de ICMP, se descarta, excepto el tráfico que usted ha permitido explícitamente.
-
Para bloquear y eliminar ciertas solicitudes de
ICMPy permitir otras:
Establezca el objetivo de su zona en
DROP:firewall-cmd --permanent --set-target=DROP
# firewall-cmd --permanent --set-target=DROPCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade la inversión de bloque ICMP para bloquear todas las peticiones de
ICMPa la vez:firewall-cmd --add-icmp-block-inversion
# firewall-cmd --add-icmp-block-inversionCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade el bloqueo ICMP para aquellas peticiones de
ICMPque quieras permitir:firewall-cmd --add-icmp-block=<icmptype>
# firewall-cmd --add-icmp-block=<icmptype>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
El block inversion invierte la configuración de los bloqueos de las peticiones de ICMP, por lo que todas las peticiones, que antes no estaban bloqueadas, se bloquean debido a que el objetivo de su zona cambia a DROP. Las peticiones que estaban bloqueadas no lo están. Esto significa que si quiere desbloquear una petición, debe utilizar el comando de bloqueo.
- Para revertir la inversión de bloques a una configuración totalmente permisiva:
Establezca el objetivo de su zona en
defaultoACCEPT:firewall-cmd --permanent --set-target=default
# firewall-cmd --permanent --set-target=defaultCopy to Clipboard Copied! Toggle word wrap Toggle overflow Eliminar todos los bloques añadidos para las solicitudes de
ICMP:firewall-cmd --remove-icmp-block=<icmptype>
# firewall-cmd --remove-icmp-block=<icmptype>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Retire la inversión del bloque
ICMP:firewall-cmd --remove-icmp-block-inversion
# firewall-cmd --remove-icmp-block-inversionCopy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que la nueva configuración sea persistente:
firewall-cmd --runtime-to-permanent
# firewall-cmd --runtime-to-permanentCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.14.2. Configuración del filtro ICMP mediante la GUI Copiar enlaceEnlace copiado en el portapapeles!
-
Para activar o desactivar un filtro
ICMP, inicie la herramienta firewall-config herramienta y seleccione la zona de red cuyos mensajes deben ser filtrados. Seleccione la pestañaICMP Filtery marque la casilla correspondiente a cada tipo de mensajeICMPque desee filtrar. Desactive la casilla para desactivar un filtro. Esta configuración es por dirección y el valor por defecto permite todo. -
Para editar un tipo de
ICMP, inicie la herramienta firewall-config herramienta y seleccione el modoPermanenten el menú denominadoConfiguration. Aparecen iconos adicionales en la parte inferior de la ventana de . Seleccione en el siguiente cuadro de diálogo para habilitar el enmascaramiento y hacer que funcione el reenvío a otra máquina. -
Para activar la inversión del
ICMP Filter, haga clic en la casillaInvert Filterde la derecha. Ahora sólo se aceptan los tipos deICMPmarcados, todos los demás se rechazan. En una zona que utilice el objetivo DROP, se descartan.
5.15. Ajuste y control de los conjuntos IP mediante firewalld Copiar enlaceEnlace copiado en el portapapeles!
Para ver la lista de tipos de conjuntos de IP soportados por firewalld, introduzca el siguiente comando como root.
firewall-cmd --get-ipset-types hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net
~]# firewall-cmd --get-ipset-types
hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net
5.15.1. Configuración de las opciones del conjunto IP mediante la CLI Copiar enlaceEnlace copiado en el portapapeles!
Los conjuntos de IP se pueden utilizar en las zonas de firewalld como fuentes y también como fuentes en reglas ricas. En Red Hat Enterprise Linux, el método preferido es utilizar los conjuntos de IP creados con firewalld en una regla directa.
Para listar los conjuntos de IP conocidos por
firewallden el entorno permanente, utilice el siguiente comando comoroot:firewall-cmd --permanent --get-ipsets
# firewall-cmd --permanent --get-ipsetsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para añadir un nuevo conjunto de IP, utilice el siguiente comando utilizando el entorno permanente como
root:firewall-cmd --permanent --new-ipset=test --type=hash:net success
# firewall-cmd --permanent --new-ipset=test --type=hash:net successCopy to Clipboard Copied! Toggle word wrap Toggle overflow El comando anterior crea un nuevo conjunto IP con el nombre test y el tipo
hash:netparaIPv4. Para crear un conjunto de IP para usar conIPv6, añada la opción--option=family=inet6. Para que la nueva configuración sea efectiva en el entorno de ejecución, vuelva a cargarfirewalld.Enumere el nuevo conjunto de IP con el siguiente comando como
root:firewall-cmd --permanent --get-ipsets test
# firewall-cmd --permanent --get-ipsets testCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para obtener más información sobre el conjunto de IP, utilice el siguiente comando como
root:firewall-cmd --permanent --info-ipset=test test type: hash:net options: entries:
# firewall-cmd --permanent --info-ipset=test test type: hash:net options: entries:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Tenga en cuenta que el conjunto de IP no tiene ninguna entrada en este momento.
Para añadir una entrada al conjunto de IP de test, utilice el siguiente comando como
root:firewall-cmd --permanent --ipset=test --add-entry=192.168.0.1 success
# firewall-cmd --permanent --ipset=test --add-entry=192.168.0.1 successCopy to Clipboard Copied! Toggle word wrap Toggle overflow El comando anterior añade la dirección IP 192.168.0.1 al conjunto de IP.
Para obtener la lista de entradas actuales en el conjunto de IP, utilice el siguiente comando como
root:firewall-cmd --permanent --ipset=test --get-entries 192.168.0.1
# firewall-cmd --permanent --ipset=test --get-entries 192.168.0.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Generar un archivo con una lista de direcciones IP, por ejemplo:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow El archivo con la lista de direcciones IP para un conjunto de IP debe contener una entrada por línea. Las líneas que comienzan con una almohadilla, un punto y coma o líneas vacías se ignoran.
Para añadir las direcciones del archivo iplist.txt, utilice el siguiente comando como
root:firewall-cmd --permanent --ipset=test --add-entries-from-file=iplist.txt success
# firewall-cmd --permanent --ipset=test --add-entries-from-file=iplist.txt successCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para ver la lista de entradas extendidas del conjunto de IP, utilice el siguiente comando como
root:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para eliminar las direcciones del conjunto de IP y comprobar la lista de entradas actualizada, utilice los siguientes comandos como
root:firewall-cmd --permanent --ipset=test --remove-entries-from-file=iplist.txt success firewall-cmd --permanent --ipset=test --get-entries 192.168.0.1
# firewall-cmd --permanent --ipset=test --remove-entries-from-file=iplist.txt success # firewall-cmd --permanent --ipset=test --get-entries 192.168.0.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Puede añadir el conjunto de IPs como origen a una zona para gestionar todo el tráfico procedente de cualquiera de las direcciones listadas en el conjunto de IPs con una zona. Por ejemplo, para añadir el conjunto de IPs test como origen a la zona drop para descartar todos los paquetes procedentes de todas las entradas listadas en el conjunto de IPs test, utilice el siguiente comando como
root:firewall-cmd --permanent --zone=drop --add-source=ipset:test success
# firewall-cmd --permanent --zone=drop --add-source=ipset:test successCopy to Clipboard Copied! Toggle word wrap Toggle overflow El prefijo
ipset:en el origen muestra afirewalldque el origen es un conjunto de IP y no una dirección IP o un rango de direcciones.
Sólo la creación y eliminación de conjuntos de IP está limitada al entorno permanente, todas las demás opciones de conjuntos de IP pueden utilizarse también en el entorno de ejecución sin la opción --permanent.
Red Hat no recomienda el uso de conjuntos de IP que no sean gestionados a través de firewalld. Para usar tales conjuntos de IP, se requiere una regla directa permanente para referenciar el conjunto, y se debe agregar un servicio personalizado para crear estos conjuntos de IP. Este servicio debe iniciarse antes de que se inicie firewalld, de lo contrario firewalld no podrá añadir las reglas directas que utilizan estos conjuntos. Puede añadir reglas directas permanentes con el archivo /etc/firewalld/direct.xml.
5.16. Priorizar las reglas ricas Copiar enlaceEnlace copiado en el portapapeles!
Por defecto, las reglas ricas se organizan en base a su acción de regla. Por ejemplo, las reglas de deny tienen prioridad sobre las de allow. El parámetro priority en las reglas ricas proporciona a los administradores un control detallado sobre las reglas ricas y su orden de ejecución.
5.16.1. Cómo el parámetro de prioridad organiza las reglas en diferentes cadenas Copiar enlaceEnlace copiado en el portapapeles!
Puede establecer el parámetro priority en una regla rica en cualquier número entre -32768 y 32767, y los valores más bajos tienen mayor precedencia.
El servicio firewalld organiza las reglas en función de su valor de prioridad en diferentes cadenas:
-
Prioridad inferior a 0: la regla se redirige a una cadena con el sufijo
_pre. -
Prioridad superior a 0: la regla se redirige a una cadena con el sufijo
_post. -
Prioridad igual a 0: en función de la acción, la regla se redirige a una cadena con el
_log,_deny, o_allowla acción.
Dentro de estas subcadenas, firewalld ordena las reglas en función de su valor de prioridad.
5.16.2. Establecer la prioridad de una regla rica Copiar enlaceEnlace copiado en el portapapeles!
El procedimiento describe un ejemplo de cómo crear una regla rica que utiliza el parámetro priority para registrar todo el tráfico no permitido o denegado por otras reglas. Puede utilizar esta regla para marcar el tráfico inesperado.
Procedimiento
Añade una regla rica con una precedencia muy baja para registrar todo el tráfico que no haya sido igualado por otras reglas:
firewall-cmd --add-rich-rule='rule priority=32767 log prefix="UNEXPECTED: " limit value="5/m"'
# firewall-cmd --add-rich-rule='rule priority=32767 log prefix="UNEXPECTED: " limit value="5/m"'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Además, el comando limita el número de entradas de registro a
5por minuto.Opcionalmente, visualice la regla
nftablesque el comando del paso anterior creó:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.17. Configuración del bloqueo del cortafuegos Copiar enlaceEnlace copiado en el portapapeles!
Las aplicaciones o servicios locales pueden cambiar la configuración del cortafuegos si se ejecutan como root (por ejemplo, libvirt). Con esta función, el administrador puede bloquear la configuración del cortafuegos para que ninguna aplicación o sólo las aplicaciones añadidas a la lista de permisos de bloqueo puedan solicitar cambios en el cortafuegos. La configuración de bloqueo está desactivada por defecto. Si está activada, el usuario puede estar seguro de que no se realizan cambios de configuración no deseados en el cortafuegos por parte de aplicaciones o servicios locales.
5.17.1. Configuración del bloqueo mediante la CLI Copiar enlaceEnlace copiado en el portapapeles!
Para consultar si el bloqueo está activado, utilice el siguiente comando como
root:firewall-cmd --query-lockdown
# firewall-cmd --query-lockdownCopy to Clipboard Copied! Toggle word wrap Toggle overflow El comando imprime
yescon el estado de salida0si el bloqueo está activado. Imprimenocon el estado de salida1en caso contrario.Para activar el bloqueo, introduzca el siguiente comando como
root:firewall-cmd --lockdown-on
# firewall-cmd --lockdown-onCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para desactivar el bloqueo, utilice el siguiente comando como
root:firewall-cmd --lockdown-off
# firewall-cmd --lockdown-offCopy to Clipboard Copied! Toggle word wrap Toggle overflow
5.17.2. Configuración de las opciones de la lista de permisos de bloqueo mediante la CLI Copiar enlaceEnlace copiado en el portapapeles!
La lista de permisos de bloqueo puede contener comandos, contextos de seguridad, usuarios e identificaciones de usuario. Si la entrada de un comando en la lista permitida termina con un asterisco "*", entonces todas las líneas de comando que comiencen con ese comando coincidirán. Si el asterisco "*" no está ahí, entonces el comando absoluto, incluyendo los argumentos, debe coincidir.
El contexto es el contexto de seguridad (SELinux) de una aplicación o servicio en ejecución. Para obtener el contexto de una aplicación en ejecución utilice el siguiente comando:
ps -e --context
$ ps -e --contextCopy to Clipboard Copied! Toggle word wrap Toggle overflow Este comando devuelve todas las aplicaciones en ejecución. Pase la salida por la herramienta grep para obtener la aplicación que le interesa. Por ejemplo:
ps -e --context | grep ejemplo_programa
$ ps -e --context | grep ejemplo_programaCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para listar todas las líneas de comandos que están en la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --list-lockdown-whitelist-commands
# firewall-cmd --list-lockdown-whitelist-commandsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para añadir un comando command a la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'
# firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para eliminar un comando command de la lista permitida, introduzca el siguiente comando como
root:firewall-cmd --remove-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'
# firewall-cmd --remove-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para consultar si el comando command está en la lista permitida, introduzca el siguiente comando como
root:firewall-cmd --query-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'
# firewall-cmd --query-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'Copy to Clipboard Copied! Toggle word wrap Toggle overflow El comando imprime
yescon el estado de salida0si es verdadero. Imprimenocon el estado de salida1en caso contrario.Para listar todos los contextos de seguridad que están en la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --list-lockdown-whitelist-contexts
# firewall-cmd --list-lockdown-whitelist-contextsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para añadir un contexto context a la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --add-lockdown-whitelist-context=contexto
# firewall-cmd --add-lockdown-whitelist-context=contextoCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para eliminar un contexto context de la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --remove-lockdown-whitelist-context=contexto
# firewall-cmd --remove-lockdown-whitelist-context=contextoCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para consultar si el contexto context está en la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --query-lockdown-whitelist-context=contexto
# firewall-cmd --query-lockdown-whitelist-context=contextoCopy to Clipboard Copied! Toggle word wrap Toggle overflow Imprime
yescon el estado de salida0, si es verdadero, imprimenocon el estado de salida1en caso contrario.Para listar todos los ID de usuario que están en la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --list-lockdown-whitelist-uids
# firewall-cmd --list-lockdown-whitelist-uidsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para añadir un ID de usuario uid a la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --add-lockdown-whitelist-uid=uid
# firewall-cmd --add-lockdown-whitelist-uid=uidCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para eliminar un ID de usuario uid de la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --remove-lockdown-whitelist-uid=uid
# firewall-cmd --remove-lockdown-whitelist-uid=uidCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para consultar si el ID de usuario uid está en la lista de permitidos, introduzca el siguiente comando:
firewall-cmd --query-lockdown-whitelist-uid=uid
$ firewall-cmd --query-lockdown-whitelist-uid=uidCopy to Clipboard Copied! Toggle word wrap Toggle overflow Imprime
yescon el estado de salida0, si es verdadero, imprimenocon el estado de salida1en caso contrario.Para listar todos los nombres de usuario que están en la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --list-lockdown-whitelist-users
# firewall-cmd --list-lockdown-whitelist-usersCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para añadir un nombre de usuario user a la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --add-lockdown-whitelist-user=user
# firewall-cmd --add-lockdown-whitelist-user=userCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para eliminar un nombre de usuario user de la lista de permitidos, introduzca el siguiente comando como
root:firewall-cmd --remove-lockdown-whitelist-user=user
# firewall-cmd --remove-lockdown-whitelist-user=userCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para consultar si el nombre de usuario user está en la lista de permitidos, introduzca el siguiente comando:
firewall-cmd --query-lockdown-whitelist-user=user
$ firewall-cmd --query-lockdown-whitelist-user=userCopy to Clipboard Copied! Toggle word wrap Toggle overflow Imprime
yescon el estado de salida0, si es verdadero, imprimenocon el estado de salida1en caso contrario.
5.17.3. Configuración de las opciones de la lista de permisos de bloqueo mediante archivos de configuración Copiar enlaceEnlace copiado en el portapapeles!
El archivo de configuración allowlist por defecto contiene el contexto NetworkManager y el contexto por defecto de libvirt. El ID de usuario 0 también está en la lista.
A continuación se muestra un ejemplo de archivo de configuración allowlist que habilita todos los comandos de la utilidad firewall-cmd, para un usuario llamado user cuyo ID de usuario es 815:
Este ejemplo muestra tanto user id como user name, pero sólo se requiere una opción. Python es el intérprete y se antepone a la línea de comandos. También puede utilizar un comando específico, por ejemplo:
/usr/bin/python3 /bin/firewall-cmd --lockdown-on
/usr/bin/python3 /bin/firewall-cmd --lockdown-on
En ese ejemplo, sólo se permite el comando --lockdown-on.
En Red Hat Enterprise Linux, todas las utilidades se colocan en el directorio /usr/bin/ y el directorio /bin/ está vinculado al directorio /usr/bin/. En otras palabras, aunque la ruta para firewall-cmd cuando se introduce como root podría resolver a /bin/firewall-cmd, ahora se puede utilizar /usr/bin/firewall-cmd. Todos los nuevos scripts deben utilizar la nueva ubicación. Pero tenga en cuenta que si los scripts que se ejecutan como root se escriben para utilizar la ruta /bin/firewall-cmd, entonces esa ruta de comandos debe añadirse en la lista de permisos además de la ruta /usr/bin/firewall-cmd que tradicionalmente sólo se utiliza para los usuarios que no son deroot.
El * al final del atributo name de un comando significa que todos los comandos que comienzan con esta cadena coinciden. Si el * no está ahí, entonces el comando absoluto, incluyendo los argumentos, debe coincidir.
5.18. Registro de paquetes rechazados Copiar enlaceEnlace copiado en el portapapeles!
Con la opción LogDenied en firewalld, es posible añadir un mecanismo de registro sencillo para los paquetes rechazados. Estos son los paquetes que son rechazados o descartados. Para cambiar la configuración del registro, edite el archivo /etc/firewalld/firewalld.conf o utilice la herramienta de configuración de la línea de comandos o de la interfaz gráfica de usuario.
Si LogDenied está habilitado, las reglas de registro se añaden justo antes de las reglas de rechazo y eliminación en las cadenas INPUT, FORWARD y OUTPUT para las reglas por defecto y también las reglas finales de rechazo y eliminación en las zonas. Los valores posibles para esta configuración son: all , unicast, broadcast, multicast, y off. El valor por defecto es off. Con la configuración unicast, broadcast, y multicast, la coincidencia pkttype se utiliza para coincidir con el tipo de paquete de la capa de enlace. Con all, se registran todos los paquetes.
Para listar la configuración real de LogDenied con firewall-cmd, utilice el siguiente comando como root:
firewall-cmd --get-log-denied off
# firewall-cmd --get-log-denied
off
Para cambiar la configuración de LogDenied, utilice el siguiente comando como root:
firewall-cmd --set-log-denied=all success
# firewall-cmd --set-log-denied=all
success
Para cambiar la configuración de LogDenied con la herramienta de configuración de la GUI firewalld, inicie firewall-config, haga clic en el menú Options y seleccione Change Log Denied. Aparece la ventana LogDenied. Seleccione la nueva configuración de LogDenied en el menú y haga clic en Aceptar.
Capítulo 6. Introducción a nftables Copiar enlaceEnlace copiado en el portapapeles!
El marco de trabajo nftables proporciona facilidades de clasificación de paquetes y es el sucesor designado de las herramientas iptables, ip6tables, arptables, y ebtables. Ofrece numerosas mejoras en cuanto a comodidad, características y rendimiento con respecto a las anteriores herramientas de filtrado de paquetes, sobre todo:
- tablas de búsqueda en lugar de procesamiento lineal
-
un único marco para los protocolos
IPv4yIPv6 - reglas aplicadas atómicamente en lugar de buscar, actualizar y almacenar un conjunto completo de reglas
-
soporte para la depuración y el rastreo en el conjunto de reglas (
nftrace) y la supervisión de los eventos de rastreo (en la herramientanft) - sintaxis más coherente y compacta, sin extensiones específicas de protocolo
- una API Netlink para aplicaciones de terceros
Al igual que iptables, nftables utiliza tablas para almacenar cadenas. Las cadenas contienen reglas individuales para realizar acciones. La herramienta nft sustituye a todas las herramientas de los anteriores marcos de filtrado de paquetes. La biblioteca libnftnl puede utilizarse para la interacción de bajo nivel con nftables Netlink API sobre la biblioteca libmnl.
El efecto de los módulos en el conjunto de reglas nftables puede observarse utilizando el comando nft list rule set. Dado que estas herramientas añaden tablas, cadenas, reglas, conjuntos y otros objetos al conjunto de reglas de nftables, tenga en cuenta que las operaciones del conjunto de reglas de nftables, como el comando nft flush ruleset, podrían afectar a los conjuntos de reglas instalados mediante los comandos heredados anteriormente separados.
6.1. Migración de iptables a nftables Copiar enlaceEnlace copiado en el portapapeles!
Si ha actualizado su servidor a RHEL 8 o su configuración de cortafuegos todavía utiliza reglas de iptables, puede migrar sus reglas de iptables a nftables.
6.1.1. Cuándo utilizar firewalld, nftables o iptables Copiar enlaceEnlace copiado en el portapapeles!
A continuación se presenta un breve resumen en el que se debe utilizar una de las siguientes utilidades:
-
firewalld: Utilice la utilidadfirewalldpara casos de uso de cortafuegos sencillos. La utilidad es fácil de usar y cubre los casos de uso típicos para estos escenarios. -
nftables: Utilice la utilidadnftablespara configurar cortafuegos complejos y de rendimiento crítico, como por ejemplo para toda una red. -
iptables: La utilidadiptablesen Red Hat Enterprise Linux 8 utiliza la API del kernelnf_tablesen lugar del back endlegacy. La APInf_tablesproporciona compatibilidad con versiones anteriores para que los scripts que utilizan comandosiptablessigan funcionando en Red Hat Enterprise Linux 8. Para los nuevos scripts de cortafuegos, Red Hat recomienda utilizarnftables.
Para evitar que los diferentes servicios de firewall se influyan mutuamente, ejecute sólo uno de ellos en un host RHEL y desactive los demás servicios.
6.1.2. Conversión de reglas iptables a reglas nftables Copiar enlaceEnlace copiado en el portapapeles!
Red Hat Enterprise Linux 8 proporciona las herramientas iptables-translate y ip6tables-translate para convertir las reglas existentes iptables o ip6tables en las equivalentes para nftables.
Tenga en cuenta que algunas extensiones no tienen soporte de traducción. Si existe una extensión de este tipo, la herramienta imprime la regla no traducida con el prefijo #. Por ejemplo:
iptables-translate -A INPUT -j CHECKSUM --checksum-fill nft # -A INPUT -j CHECKSUM --checksum-fill
# iptables-translate -A INPUT -j CHECKSUM --checksum-fill
nft # -A INPUT -j CHECKSUM --checksum-fill
Además, los usuarios pueden utilizar las herramientas iptables-restore-translate y ip6tables-restore-translate para traducir un volcado de reglas. Tenga en cuenta que antes de eso, los usuarios pueden utilizar los comandos iptables-save o ip6tables-save para imprimir un volcado de las reglas actuales. Por ejemplo:
Para obtener más información y una lista de posibles opciones y valores, introduzca el comando iptables-translate --help.
6.2. Escritura y ejecución de scripts nftables Copiar enlaceEnlace copiado en el portapapeles!
El marco de trabajo nftables proporciona un entorno de scripts nativo que aporta una gran ventaja sobre el uso de scripts de shell para mantener las reglas del cortafuegos: la ejecución de los scripts es atómica. Esto significa que el sistema aplica todo el script o impide la ejecución si se produce un error. Esto garantiza que el cortafuegos está siempre en un estado consistente.
Además, el entorno de scripts nftables permite a los administradores:
- añadir comentarios
- definir variables
- incluir otros archivos de conjuntos de reglas
En esta sección se explica cómo utilizar estas funciones, así como la creación y ejecución de los scripts de nftables.
Cuando se instala el paquete nftables, Red Hat Enterprise Linux crea automáticamente los scripts *.nft en el directorio /etc/nftables/. Estos scripts contienen comandos que crean tablas y cadenas vacías para diferentes propósitos. Usted puede extender estos archivos o escribir sus scripts.
6.2.1. La cabecera de script requerida en el script de nftables Copiar enlaceEnlace copiado en el portapapeles!
Al igual que otros scripts, los scripts de nftables requieren una secuencia shebang en la primera línea del script que establece la directiva del intérprete.
Una secuencia de comandos nftables debe comenzar siempre con la siguiente línea:
/usr/sbin/nft -f
# /usr/sbin/nft -f
Si omite el parámetro -f, la utilidad nft no lee el script y muestra Error: syntax error, unexpected newline, expecting string.
6.2.2. Formatos de script de nftables soportados Copiar enlaceEnlace copiado en el portapapeles!
El entorno de scripting nftables admite scripts en los siguientes formatos:
Puede escribir una secuencia de comandos en el mismo formato que el comando
nft list rulesetmuestra el conjunto de reglas:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Puede utilizar la misma sintaxis para los comandos que en
nft:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.2.3. Ejecución de scripts nftables Copiar enlaceEnlace copiado en el portapapeles!
Para ejecutar un script de nftables, el script debe ser ejecutable. Sólo si el script está incluido en otro script, no es necesario que sea ejecutable. El procedimiento describe cómo hacer que un script sea ejecutable y ejecutar el script.
Requisitos previos
-
El procedimiento de esta sección asume que usted almacenó un script
nftablesen el archivo/etc/nftables/example_firewall.nft.
Procedimiento
Pasos que se requieren sólo una vez:
Opcionalmente, establezca el propietario del script en
root:chown root /etc/nftables/example_firewall.nft
# chown root /etc/nftables/example_firewall.nftCopy to Clipboard Copied! Toggle word wrap Toggle overflow Haz que el script sea ejecutable para el propietario:
chmod u x /etc/nftables/example_firewall.nft
# chmod u x /etc/nftables/example_firewall.nftCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Ejecuta el script:
/etc/nftables/example_firewall.nft
# /etc/nftables/example_firewall.nftCopy to Clipboard Copied! Toggle word wrap Toggle overflow Si no se muestra ninguna salida, el sistema ha ejecutado el script con éxito.
ImportanteIncluso si
nftejecuta la secuencia de comandos con éxito, las reglas mal colocadas, los parámetros que faltan u otros problemas en la secuencia de comandos pueden hacer que el cortafuegos no se comporte como se espera.
Recursos adicionales
-
Para más detalles sobre cómo establecer el propietario de un archivo, consulte la página de manual
chown(1). -
Para más detalles sobre cómo establecer los permisos de un archivo, consulte la página de manual
chmod(1). - Sección 6.2.7, “Carga automática de las reglas de nftables al arrancar el sistema”
6.2.4. Uso de comentarios en los scripts de nftables Copiar enlaceEnlace copiado en el portapapeles!
El entorno de scripting nftables interpreta todo lo que está a la derecha de un carácter # como un comentario.
Ejemplo 6.1. Comentarios en un script de nftables
Los comentarios pueden comenzar al principio de una línea, así como junto a un comando:
6.2.5. Uso de variables en un script de nftables Copiar enlaceEnlace copiado en el portapapeles!
Para definir una variable en un script nftables, utilice la palabra clave define. Puede almacenar valores individuales y conjuntos anónimos en una variable. Para escenarios más complejos, utilice conjuntos o mapas de veredicto.
Variables con un solo valor
El siguiente ejemplo define una variable llamada INET_DEV con el valor enp1s0:
define INET_DEV = enp1s0
define INET_DEV = enp1s0
Puede utilizar la variable en el script escribiendo el signo $ seguido del nombre de la variable:
... add rule inet example_table example_chain iifname $INET_DEV tcp dport ssh accept ...
...
add rule inet example_table example_chain iifname $INET_DEV tcp dport ssh accept
...
Variables que contienen un conjunto anónimo
El siguiente ejemplo define una variable que contiene un conjunto anónimo:
define DNS_SERVERS = { 192.0.2.1, 192.0.2.2 }
define DNS_SERVERS = { 192.0.2.1, 192.0.2.2 }
Puede utilizar la variable en el script escribiendo el signo $ seguido del nombre de la variable:
add rule inet ejemplo_tabla ejemplo_cadena ip daddr $DNS_SERVERS accept
add rule inet ejemplo_tabla ejemplo_cadena ip daddr $DNS_SERVERS accept
Tenga en cuenta que las llaves tienen una semántica especial cuando las utiliza en una regla porque indican que la variable representa un conjunto.
Recursos adicionales
- Para más detalles sobre los conjuntos, véase Sección 6.5, “Uso de conjuntos en los comandos de nftables”.
- Para más detalles sobre los mapas de veredicto, consulte Sección 6.6, “Uso de mapas de veredicto en los comandos de nftables”.
6.2.6. Inclusión de archivos en un script de nftables Copiar enlaceEnlace copiado en el portapapeles!
El entorno de scripting nftables permite a los administradores incluir otros scripts utilizando la sentencia include.
Si especifica sólo un nombre de archivo sin una ruta absoluta o relativa, nftables incluye los archivos de la ruta de búsqueda por defecto, que está configurada en /etc en Red Hat Enterprise Linux.
Ejemplo 6.2. Incluir archivos del directorio de búsqueda por defecto
Para incluir un archivo del directorio de búsqueda por defecto:
include "ejemplo.nft"
include "ejemplo.nft"
Ejemplo 6.3. Incluir todos los archivos *.nft de un directorio
Para incluir todos los archivos que terminan en *.nft y que están almacenados en el directorio /etc/nftables/rulesets/:
include "/etc/nftables/rulesets/*.nft"
include "/etc/nftables/rulesets/*.nft"
Tenga en cuenta que la sentencia include no coincide con los archivos que comienzan con un punto.
Recursos adicionales
-
Para más detalles, consulte la sección
Include filesen la página de manualnft(8).
6.2.7. Carga automática de las reglas de nftables al arrancar el sistema Copiar enlaceEnlace copiado en el portapapeles!
El servicio nftables systemd carga los scripts del cortafuegos que se incluyen en el archivo /etc/sysconfig/nftables.conf. Esta sección explica cómo cargar las reglas del cortafuegos cuando el sistema se inicia.
Requisitos previos
-
Los scripts de
nftablesse almacenan en el directorio/etc/nftables/.
Procedimiento
Edite el archivo
/etc/sysconfig/nftables.conf.-
Si mejora los scripts
*.nftcreados en/etc/nftables/cuando instaló el paquetenftables, descomente la sentenciaincludepara estos scripts. Si escribe scripts desde cero, añada las declaraciones
includepara incluir estos scripts. Por ejemplo, para cargar el script/etc/nftables/example.nftcuando se inicie el servicionftables, añadainclude \ "/etc/nftables/example.nft"
include \ "/etc/nftables/example.nft"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
Si mejora los scripts
Habilite el servicio
nftables.systemctl enable nftables
# systemctl enable nftablesCopy to Clipboard Copied! Toggle word wrap Toggle overflow Opcionalmente, inicie el servicio
nftablespara cargar las reglas del cortafuegos sin reiniciar el sistema:systemctl start nftables
# systemctl start nftablesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
6.3. Creación y gestión de tablas, cadenas y reglas nftables Copiar enlaceEnlace copiado en el portapapeles!
En esta sección se explica cómo visualizar los conjuntos de reglas de nftables y cómo gestionarlos.
6.3.1. Valores estándar de prioridad de la cadena y nombres textuales Copiar enlaceEnlace copiado en el portapapeles!
Cuando se crea una cadena, en priority se puede establecer un valor entero o un nombre estándar que especifique el orden en el que atraviesan las cadenas con el mismo valor hook.
Los nombres y valores se definen en función de las prioridades que utiliza xtables al registrar sus cadenas por defecto.
El comando nft list chains muestra por defecto valores de prioridad textuales. Puede ver el valor numérico pasando la opción -y al comando.
Ejemplo 6.4. Utilizar un valor textual para establecer la prioridad
El siguiente comando crea una cadena llamada example_chain en example_table utilizando el valor de prioridad estándar 50:
# nft add chain inet example_table example_chain { type filter hook input priority 50 \; policy accept \; }
Dado que la prioridad es un valor estándar, puede utilizar alternativamente el valor textual:
# nft add chain inet example_table example_chain { type filter hook input priority security \; policy accept \; }
| Nombre | Valor | Familias | Ganchos |
|---|---|---|---|
|
| -300 |
| todo |
|
| -150 |
| todo |
|
| -100 |
| prepago |
|
| 0 |
| todo |
|
| 50 |
| todo |
|
| 100 |
| post ruta |
Todas las familias utilizan los mismos valores, pero la familia bridge utiliza los siguientes valores:
| Nombre | Valor | Ganchos |
|---|---|---|
|
| -300 | prepago |
|
| -200 | todo |
|
| 100 | salida |
|
| 300 | post ruta |
Recursos adicionales
-
Para más detalles sobre otras acciones que puede ejecutar en las cadenas, consulte la sección
Chainsen la página de manualnft(8).
6.3.2. Visualización de conjuntos de reglas nftables Copiar enlaceEnlace copiado en el portapapeles!
Los conjuntos de reglas de nftables contienen tablas, cadenas y reglas. En esta sección se explica cómo visualizar estos conjuntos de reglas.
Procedimiento
Para mostrar todos los conjuntos de reglas, introduzca:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NotaPor defecto,
nftablesno crea tablas previamente. Como consecuencia, al mostrar el conjunto de reglas en un host sin ninguna tabla, el comandonft list rulesetno muestra ninguna salida.
6.3.3. Creación de una tabla nftables Copiar enlaceEnlace copiado en el portapapeles!
Una tabla en nftables es un espacio de nombres que contiene una colección de cadenas, reglas, conjuntos y otros objetos. Esta sección explica cómo crear una tabla.
Cada tabla debe tener definida una familia de direcciones. La familia de direcciones de una tabla define qué tipos de direcciones procesa la tabla. Puede establecer una de las siguientes familias de direcciones al crear una tabla:
-
ip: Coincide sólo con los paquetes IPv4. Este es el valor por defecto si no se especifica una familia de direcciones. -
ip6: Coincide sólo con los paquetes IPv6. -
inet: Coincide con los paquetes IPv4 e IPv6. -
arp: Coincide con los paquetes del protocolo de resolución de direcciones IPv4 (ARP). -
bridge: Coincide con los paquetes que atraviesan un dispositivo de puente. -
netdev: Coincide con los paquetes de entrada.
Procedimiento
Utilice el comando
nft add tablepara crear una nueva tabla. Por ejemplo, para crear una tabla llamadaexample_tableque procese paquetes IPv4 e IPv6:nft add table inet example_table
# nft add table inet example_tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow Opcionalmente, se pueden listar todas las tablas del conjunto de reglas:
nft list tables table inet example_table
# nft list tables table inet example_tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
-
Para más detalles sobre las familias de direcciones, consulte la sección
Address familiesen la página mannft(8). -
Para más detalles sobre otras acciones que puede ejecutar en las tablas, consulte la sección
Tablesen la página de manualnft(8).
6.3.4. Creación de una cadena nftables Copiar enlaceEnlace copiado en el portapapeles!
Las cadenas son contenedores de reglas. Existen los siguientes dos tipos de reglas:
- Cadena base: Puedes utilizar las cadenas base como punto de entrada para los paquetes de la pila de red.
-
Cadena regular: Puede utilizar las cadenas regulares como objetivo de
jumpy para organizar mejor las reglas.
El procedimiento describe cómo añadir una cadena base a una tabla existente.
Requisitos previos
- La tabla a la que se quiere añadir la nueva cadena existe.
Procedimiento
Utilice el comando
nft add chainpara crear una nueva cadena. Por ejemplo, para crear una cadena llamadaexample_chainenexample_table:nft add chain inet example_table example_chain { type filter hook input priority 0 \\N; policy accept \N; }# nft add chain inet example_table example_chain { type filter hook input priority 0 \\N; policy accept \N; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow ImportantePara evitar que el shell interprete los puntos y comas como el final del comando, debe escapar los puntos y comas con una barra invertida.
Esta cadena filtra los paquetes entrantes. El parámetro
priorityespecifica el orden en quenftablesprocesa las cadenas con el mismo valor de gancho. Un valor de prioridad más bajo tiene precedencia sobre los más altos. El parámetropolicyestablece la acción por defecto para las reglas de esta cadena. Tenga en cuenta que si está conectado al servidor de forma remota y establece la política por defecto endrop, se desconectará inmediatamente si ninguna otra regla permite el acceso remoto.Opcionalmente, mostrar todas las cadenas:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
-
Para más detalles sobre las familias de direcciones, consulte la sección
Address familiesen la página mannft(8). -
Para más detalles sobre otras acciones que puede ejecutar en las cadenas, consulte la sección
Chainsen la página de manualnft(8).
6.3.5. Añadir una regla a una cadena nftables Copiar enlaceEnlace copiado en el portapapeles!
Esta sección explica cómo añadir una regla a una cadena existente de nftables. Por defecto, el comando nftables add rule añade una nueva regla al final de la cadena.
Si, en cambio, desea insertar una regla al principio de la cadena, consulte Sección 6.3.6, “Insertar una regla en una cadena nftables”.
Requisitos previos
- La cadena a la que se quiere añadir la regla existe.
Procedimiento
Para añadir una nueva regla, utilice el comando
nft add rule. Por ejemplo, para añadir una regla alexample_chainen elexample_tableque permita el tráfico TCP en el puerto 22:nft add rule inet example_table example_chain tcp dport 22 accept
# nft add rule inet example_table example_chain tcp dport 22 acceptCopy to Clipboard Copied! Toggle word wrap Toggle overflow En lugar del número de puerto, puede especificar alternativamente el nombre del servicio. En el ejemplo, podría utilizar
sshen lugar del número de puerto22. Tenga en cuenta que un nombre de servicio se resuelve a un número de puerto basado en su entrada en el archivo/etc/services.Opcionalmente, mostrar todas las cadenas y sus reglas en
example_table:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
-
Para más detalles sobre las familias de direcciones, consulte la sección
Address familiesen la página mannft(8). -
Para más detalles sobre otras acciones que puede ejecutar en las reglas, consulte la sección
Rulesen la página de manualnft(8).
6.3.6. Insertar una regla en una cadena nftables Copiar enlaceEnlace copiado en el portapapeles!
Esta sección explica cómo insertar una regla al principio de una cadena existente de nftables utilizando el comando nftables insert rule. Si, en cambio, desea añadir una regla al final de una cadena, consulte Sección 6.3.5, “Añadir una regla a una cadena nftables”.
Requisitos previos
- La cadena a la que se quiere añadir la regla existe.
Procedimiento
Para insertar una nueva regla, utilice el comando
nft insert rule. Por ejemplo, para insertar una regla a laexample_chainen elexample_tableque permite el tráfico TCP en el puerto 22:nft insert rule inet example_table example_chain tcp dport 22 accept
# nft insert rule inet example_table example_chain tcp dport 22 acceptCopy to Clipboard Copied! Toggle word wrap Toggle overflow También puede especificar el nombre del servicio en lugar del número de puerto. En el ejemplo, podría utilizar
sshen lugar del número de puerto22. Tenga en cuenta que un nombre de servicio se resuelve a un número de puerto basado en su entrada en el archivo/etc/services.Opcionalmente, mostrar todas las cadenas y sus reglas en
example_table:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
-
Para más detalles sobre las familias de direcciones, consulte la sección
Address familiesen la página mannft(8). -
Para más detalles sobre otras acciones que puede ejecutar en las reglas, consulte la sección
Rulesen la página de manualnft(8).
6.4. Configuración de NAT con nftables Copiar enlaceEnlace copiado en el portapapeles!
Con nftables, puede configurar los siguientes tipos de traducción de direcciones de red (NAT):
- Enmascaramiento
- NAT de origen (SNAT)
- NAT de destino (DNAT)
6.4.1. Los diferentes tipos de NAT: enmascaramiento, NAT de origen y NAT de destino Copiar enlaceEnlace copiado en el portapapeles!
Estos son los diferentes tipos de traducción de direcciones de red (NAT):
- Enmascaramiento y NAT de origen (SNAT)
Utilice uno de estos tipos de NAT para cambiar la dirección IP de origen de los paquetes. Por ejemplo, los proveedores de Internet no enrutan rangos de IP reservados, como
10.0.0.0/8. Si utiliza rangos de IP reservadas en su red y los usuarios deben poder llegar a los servidores de Internet, asigne la dirección IP de origen de los paquetes de estos rangos a una dirección IP pública.Tanto el enmascaramiento como el SNAT son muy similares. Las diferencias son:
- El enmascaramiento utiliza automáticamente la dirección IP de la interfaz saliente. Por lo tanto, utilice el enmascaramiento si la interfaz saliente utiliza una dirección IP dinámica.
- SNAT establece la dirección IP de origen de los paquetes a una IP especificada y no busca dinámicamente la IP de la interfaz de salida. Por lo tanto, SNAT es más rápido que el enmascaramiento. Utilice SNAT si la interfaz de salida utiliza una dirección IP fija.
- NAT de destino (DNAT)
- Utiliza este tipo de NAT para redirigir el tráfico entrante a un host diferente. Por ejemplo, si su servidor web utiliza una dirección IP de un rango IP reservado y, por tanto, no es accesible directamente desde Internet, puede establecer una regla DNAT en el router para redirigir el tráfico entrante a este servidor.
6.4.2. Configuración del enmascaramiento mediante nftables Copiar enlaceEnlace copiado en el portapapeles!
El enmascaramiento permite a un router cambiar dinámicamente la IP de origen de los paquetes enviados a través de una interfaz por la dirección IP de la misma. Esto significa que si la interfaz recibe una nueva IP asignada, nftables utiliza automáticamente la nueva IP al sustituir la IP de origen.
El siguiente procedimiento describe cómo sustituir la IP de origen de los paquetes que salen del host a través de la interfaz ens3 por la IP establecida en ens3.
Procedimiento
Crea una tabla:
nft add table nat
# nft add table natCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade las cadenas
preroutingypostroutinga la tabla:nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } nft add chain nat postrouting { type nat hook postrouting priority 100 \; }# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow ImportanteIncluso si no se añade una regla a la cadena
prerouting, el marconftablesrequiere esta cadena para que coincida con las respuestas de los paquetes entrantes.Tenga en cuenta que debe pasar la opción
--al comandonftpara evitar que el shell interprete el valor de prioridad negativo como una opción del comandonft.Añada una regla a la cadena
postroutingque coincida con los paquetes salientes en la interfazens3:nft add rule nat postrouting oifname "ens3" masquerade
# nft add rule nat postrouting oifname "ens3" masqueradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.4.3. Configuración del NAT de origen mediante nftables Copiar enlaceEnlace copiado en el portapapeles!
En un router, Source NAT (SNAT) permite cambiar la IP de los paquetes enviados a través de una interfaz a una dirección IP específica.
El siguiente procedimiento describe cómo sustituir la IP de origen de los paquetes que salen del router a través de la interfaz ens3 a 192.0.2.1.
Procedimiento
Crea una tabla:
nft add table nat
# nft add table natCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade las cadenas
preroutingypostroutinga la tabla:nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } nft add chain nat postrouting { type nat hook postrouting priority 100 \; }# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow ImportanteIncluso si no se añade una regla a la cadena
postrouting, el marconftablesrequiere esta cadena para que coincida con las respuestas de los paquetes salientes.Tenga en cuenta que debe pasar la opción
--al comandonftpara evitar que el shell interprete el valor de prioridad negativo como una opción del comandonft.Añada una regla a la cadena
postroutingque sustituya la IP de origen de los paquetes salientes a través deens3por192.0.2.1:nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1
# nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.4.4. Configuración del NAT de destino mediante nftables Copiar enlaceEnlace copiado en el portapapeles!
La NAT de destino permite redirigir el tráfico en un router a un host al que no se puede acceder directamente desde Internet.
El siguiente procedimiento describe cómo redirigir el tráfico entrante enviado al puerto 80 y 443 del router al host con la dirección IP 192.0.2.1.
Procedimiento
Crea una tabla:
nft add table nat
# nft add table natCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade las cadenas
preroutingypostroutinga la tabla:nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } nft add chain nat postrouting { type nat hook postrouting priority 100 \; }# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow ImportanteIncluso si no se añade una regla a la cadena
postrouting, el marconftablesrequiere esta cadena para que coincida con las respuestas de los paquetes salientes.Tenga en cuenta que debe pasar la opción
--al comandonftpara evitar que el shell interprete el valor de prioridad negativo como una opción del comandonft.Añada una regla a la cadena
preroutingque redirija el tráfico entrante en la interfazens3enviado al puerto80y443al host con la IP192.0.2.1:nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1# nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Dependiendo de su entorno, añada una regla SNAT o de enmascaramiento para cambiar la dirección de origen:
Si la interfaz
ens3utiliza direcciones IP dinámicas, añada una regla de enmascaramiento:nft add rule nat postrouting oifname \ "ens3" masquerade
# nft add rule nat postrouting oifname \ "ens3" masqueradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow Si la interfaz
ens3utiliza una dirección IP estática, añada una regla SNAT. Por ejemplo, si elens3utiliza la dirección IP198.51.100.1:nft add rule nat postrouting oifname \ "ens3" snat to 198.51.100.1
nft add rule nat postrouting oifname \ "ens3" snat to 198.51.100.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.5. Uso de conjuntos en los comandos de nftables Copiar enlaceEnlace copiado en el portapapeles!
El marco de trabajo nftables admite de forma nativa los conjuntos. Puedes utilizar conjuntos, por ejemplo, si una regla debe coincidir con varias direcciones IP, números de puerto, interfaces o cualquier otro criterio de coincidencia.
6.5.1. Uso de conjuntos anónimos en nftables Copiar enlaceEnlace copiado en el portapapeles!
Un conjunto anónimo contiene valores separados por comas y encerrados entre corchetes, como { 22, 80, 443 }, que se utilizan directamente en una regla. También puede utilizar conjuntos anónimos para direcciones IP o cualquier otro criterio de coincidencia.
El inconveniente de los conjuntos anónimos es que si se quiere cambiar el conjunto, hay que sustituir la regla. Para una solución dinámica, utilice conjuntos con nombre como se describe en Sección 6.5.2, “Uso de conjuntos con nombre en nftables”.
Requisitos previos
-
Existe la cadena
example_chainy la tablaexample_tableen la familiainet.
Procedimiento
Por ejemplo, para añadir una regla a
example_chainenexample_tableque permita el tráfico entrante al puerto22,80y443:nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } accept# nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } acceptCopy to Clipboard Copied! Toggle word wrap Toggle overflow Opcionalmente, mostrar todas las cadenas y sus reglas en
example_table:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.5.2. Uso de conjuntos con nombre en nftables Copiar enlaceEnlace copiado en el portapapeles!
El marco nftables admite conjuntos con nombre mutables. Un conjunto con nombre es una lista o rango de elementos que se puede utilizar en múltiples reglas dentro de una tabla. Otra ventaja con respecto a los conjuntos anónimos es que se puede actualizar un conjunto con nombre sin sustituir las reglas que lo utilizan.
Cuando se crea un conjunto con nombre, se debe especificar el tipo de elementos que contiene el conjunto. Puede establecer los siguientes tipos:
-
ipv4_addrpara un conjunto que contiene direcciones o rangos IPv4, como192.0.2.1o192.0.2.0/24. -
ipv6_addrpara un conjunto que contiene direcciones o rangos IPv6, como2001:db8:1::1o2001:db8:1::1/64. -
ether_addrpara un conjunto que contiene una lista de direcciones de control de acceso al medio (MAC), como52:54:00:6b:66:42. -
inet_protopara un conjunto que contiene una lista de tipos de protocolo de Internet, comotcp. -
inet_servicepara un conjunto que contiene una lista de servicios de Internet, comossh. -
markpara un conjunto que contiene una lista de marcas de paquetes. Las marcas de paquetes pueden ser cualquier valor entero positivo de 32 bits (0a2147483647].
Requisitos previos
-
La cadena
example_chainy la tablaexample_tableexisten.
Procedimiento
Cree un conjunto vacío. Los siguientes ejemplos crean un conjunto para direcciones IPv4:
Para crear un conjunto que pueda almacenar varias direcciones IPv4 individuales:
nft add set inet example_table example_set { type ipv4_addr \; }# nft add set inet example_table example_set { type ipv4_addr \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para crear un conjunto que pueda almacenar rangos de direcciones IPv4:
nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }# nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ImportantePara evitar que el shell interprete los puntos y comas como el final del comando, debe escapar los puntos y comas con una barra invertida.
Opcionalmente, cree reglas que utilicen el conjunto. Por ejemplo, el siguiente comando agrega una regla a la
example_chainen elexample_tableque descartará todos los paquetes de las direcciones IPv4 enexample_set.nft add rule inet example_table example_chain ip saddr @example_set drop
# nft add rule inet example_table example_chain ip saddr @example_set dropCopy to Clipboard Copied! Toggle word wrap Toggle overflow Como
example_setestá todavía vacío, la regla no tiene actualmente ningún efecto.Añadir direcciones IPv4 a
example_set:Si crea un conjunto que almacena direcciones IPv4 individuales, introduzca:
nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }# nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Si crea un conjunto que almacena rangos IPv4, introduzca:
nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }# nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cuando se especifica un rango de direcciones IP, se puede utilizar alternativamente la notación Classless Inter-Domain Routing (CIDR), como
192.0.2.0/24en el ejemplo anterior.
6.6. Uso de mapas de veredicto en los comandos de nftables Copiar enlaceEnlace copiado en el portapapeles!
Los mapas de veredicto, también conocidos como diccionarios, permiten a nft realizar una acción basada en la información del paquete mediante la asignación de criterios de coincidencia a una acción.
6.6.1. Uso de mapas literales en nftables Copiar enlaceEnlace copiado en el portapapeles!
Un mapa literal es una { match_criteria : action } que se utiliza directamente en una regla. La sentencia puede contener múltiples mapeos separados por comas.
El inconveniente de un mapa literal es que si se quiere cambiar el mapa, hay que sustituir la regla. Para una solución dinámica, utilice mapas de veredicto con nombre como se describe en Sección 6.6.2, “Uso de mapas de veredicto mutables en nftables”.
El ejemplo describe cómo utilizar un mapa literal para enrutar paquetes TCP y UDP del protocolo IPv4 e IPv6 a diferentes cadenas para contar los paquetes TCP y UDP entrantes por separado.
Procedimiento
Cree la página web
example_table:nft add table inet example_table
# nft add table inet example_tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow Cree la cadena
tcp_packetsenexample_table:nft add chain inet example_table tcp_packets
# nft add chain inet example_table tcp_packetsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Agregue una regla a
tcp_packetsque cuente el tráfico en esta cadena:nft add rule inet example_table tcp_packets counter
# nft add rule inet example_table tcp_packets counterCopy to Clipboard Copied! Toggle word wrap Toggle overflow Cree la cadena
udp_packetsenexample_tablenft add chain inet example_table udp_packets
# nft add chain inet example_table udp_packetsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Agregue una regla a
udp_packetsque cuente el tráfico en esta cadena:nft add rule inet example_table udp_packets counter
# nft add rule inet example_table udp_packets counterCopy to Clipboard Copied! Toggle word wrap Toggle overflow Cree una cadena para el tráfico entrante. Por ejemplo, para crear una cadena llamada
incoming_trafficenexample_tableque filtre el tráfico entrante:nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }# nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añade una regla con un mapa literal a
incoming_traffic:nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }# nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }Copy to Clipboard Copied! Toggle word wrap Toggle overflow El mapa literal distingue los paquetes y los envía a las diferentes cadenas de contadores en función de su protocolo.
Para listar los contadores de tráfico, visualice
example_table:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Los contadores de la cadena
tcp_packetsyudp_packetsmuestran tanto el número de paquetes como de bytes recibidos.
6.6.2. Uso de mapas de veredicto mutables en nftables Copiar enlaceEnlace copiado en el portapapeles!
El marco nftables admite mapas de veredicto mutables. Puedes utilizar estos mapas en múltiples reglas dentro de una tabla. Otra ventaja con respecto a los mapas literales es que puedes actualizar un mapa mutable sin reemplazar las reglas que lo utilizan.
Cuando se crea un mapa de veredicto mutable, se debe especificar el tipo de elementos
-
ipv4_addrpara un mapa cuya parte coincidente contiene una dirección IPv4, como192.0.2.1. -
ipv6_addrpara un mapa cuya parte coincidente contiene una dirección IPv6, como2001:db8:1::1. -
ether_addrpara un mapa cuya parte coincidente contiene una dirección de control de acceso al medio (MAC), como52:54:00:6b:66:42. -
inet_protopara un mapa cuya parte coincidente contiene un tipo de protocolo de Internet, comotcp. -
inet_servicepara un mapa cuya parte de coincidencia contiene un número de puerto de nombre de servicios de Internet, comossho22. -
markpara un mapa cuya parte coincidente contiene una marca de paquete. Una marca de paquete puede ser cualquier valor entero positivo de 32 bits (0a2147483647. -
counterpara un mapa cuya parte de coincidencia contiene un valor de contador. El valor del contador puede ser cualquier valor entero positivo de 64 bits. -
quotapara un mapa cuya parte de coincidencia contiene un valor de cuota. El valor de la cuota puede ser cualquier valor entero positivo de 64 bits.
El ejemplo describe cómo permitir o descartar paquetes entrantes basándose en su dirección IP de origen. Utilizando un mapa de veredicto mutable, sólo se requiere una única regla para configurar este escenario, mientras que las direcciones IP y las acciones se almacenan dinámicamente en el mapa. El procedimiento también describe cómo añadir y eliminar entradas del mapa.
Procedimiento
Cree una tabla. Por ejemplo, para crear una tabla llamada
example_tableque procese paquetes IPv4:nft add table ip example_table
# nft add table ip example_tableCopy to Clipboard Copied! Toggle word wrap Toggle overflow Cree una cadena. Por ejemplo, para crear una cadena llamada
example_chainenexample_table:nft add chain ip example_table example_chain { type filter hook input priority 0 \_; }# nft add chain ip example_table example_chain { type filter hook input priority 0 \_; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow ImportantePara evitar que el shell interprete los puntos y comas como el final del comando, debe escapar los puntos y comas con una barra invertida.
Cree un mapa vacío. Por ejemplo, para crear un mapa de direcciones IPv4:
nft add map ip example_table example_map { type ipv4_addr : verdict \; }# nft add map ip example_table example_map { type ipv4_addr : verdict \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cree reglas que utilicen el mapa. Por ejemplo, el siguiente comando añade una regla a
example_chainenexample_tableque aplica acciones a las direcciones IPv4 que están definidas enexample_map:nft add rule example_table example_chain ip saddr vmap @example_map
# nft add rule example_table example_chain ip saddr vmap @example_mapCopy to Clipboard Copied! Toggle word wrap Toggle overflow Agregue las direcciones IPv4 y las acciones correspondientes a
example_map:nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }# nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Este ejemplo define las asignaciones de direcciones IPv4 a acciones. En combinación con la regla creada anteriormente, el cortafuegos acepta los paquetes de
192.0.2.1y los descarta de192.0.2.2.Opcionalmente, puede mejorar el mapa añadiendo otra dirección IP y una declaración de acción:
nft add element ip example_table example_map { 192.0.2.3 : accept }# nft add element ip example_table example_map { 192.0.2.3 : accept }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Opcionalmente, eliminar una entrada del mapa:
nft delete element ip example_table example_map { 192.0.2.1 }# nft delete element ip example_table example_map { 192.0.2.1 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Opcionalmente, mostrar el conjunto de reglas:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.7. Configuración del reenvío de puertos mediante nftables Copiar enlaceEnlace copiado en el portapapeles!
El reenvío de puertos permite a los administradores reenviar los paquetes enviados a un puerto de destino específico a un puerto local o remoto diferente.
Por ejemplo, si su servidor web no tiene una dirección IP pública, puede establecer una regla de reenvío de puertos en su cortafuegos que reenvíe los paquetes entrantes en los puertos 80 y 443 del cortafuegos al servidor web. Con esta regla del cortafuegos, los usuarios de Internet pueden acceder al servidor web utilizando la IP o el nombre de host del cortafuegos.
6.7.1. Reenvío de paquetes entrantes a un puerto local diferente Copiar enlaceEnlace copiado en el portapapeles!
Esta sección describe un ejemplo de cómo reenviar paquetes IPv4 entrantes en el puerto 8022 al puerto 22 en el sistema local.
Procedimiento
Cree una tabla llamada
natcon la familia de direccionesip:nft add table ip nat
# nft add table ip natCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade las cadenas
preroutingypostroutinga la tabla:nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; }# nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow NotaPase la opción
--al comandonftpara evitar que el shell interprete el valor de prioridad negativo como una opción del comandonft.Añade una regla a la cadena
preroutingque redirige los paquetes entrantes en el puerto8022al puerto local22:nft add rule ip nat prerouting tcp dport 8022 redirect to :22
# nft add rule ip nat prerouting tcp dport 8022 redirect to :22Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.7.2. Reenvío de paquetes entrantes en un puerto local específico a un host diferente Copiar enlaceEnlace copiado en el portapapeles!
Puede utilizar una regla de traducción de direcciones de red de destino (DNAT) para reenviar los paquetes entrantes en un puerto local a un host remoto. Esto permite a los usuarios de Internet acceder a un servicio que se ejecuta en un host con una dirección IP privada.
El procedimiento describe cómo reenviar los paquetes IPv4 entrantes en el puerto local 443 al mismo número de puerto en el sistema remoto con la dirección IP 192.0.2.1.
Requisito previo
-
Usted está conectado como el usuario
rooten el sistema que debe reenviar los paquetes.
Procedimiento
Cree una tabla llamada
natcon la familia de direccionesip:nft add table ip nat
# nft add table ip natCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade las cadenas
preroutingypostroutinga la tabla:nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; } nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }# nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow NotaPase la opción
--al comandonftpara evitar que el shell interprete el valor de prioridad negativo como una opción del comandonft.Añade una regla a la cadena
preroutingque redirige los paquetes entrantes en el puerto443al mismo puerto en192.0.2.1:nft add rule ip nat prerouting tcp dport 443 dnat to 192.0.2.1
# nft add rule ip nat prerouting tcp dport 443 dnat to 192.0.2.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añade una regla a la cadena
postroutingpara enmascarar el tráfico saliente:nft add rule ip daddr 192.0.2.1 masquerade
# nft add rule ip daddr 192.0.2.1 masqueradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow Activar el reenvío de paquetes:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8. Uso de nftables para limitar la cantidad de conexiones Copiar enlaceEnlace copiado en el portapapeles!
Puede utilizar nftables para limitar el número de conexiones o para bloquear las direcciones IP que intenten establecer una cantidad determinada de conexiones para evitar que utilicen demasiados recursos del sistema.
6.8.1. Limitación del número de conexiones mediante nftables Copiar enlaceEnlace copiado en el portapapeles!
El parámetro ct count de la utilidad nft permite a los administradores limitar el número de conexiones. El procedimiento describe un ejemplo básico de cómo limitar las conexiones entrantes.
Requisitos previos
-
La base
example_chainenexample_tableexiste.
Procedimiento
Añade una regla que permita sólo dos conexiones simultáneas al puerto SSH (22) desde una dirección IPv4 y rechace todas las demás conexiones desde la misma IP:
nft add rule ip example_table example_chain tcp dport ssh meter example_meter { ip saddr ct count over 2 } counter reject# nft add rule ip example_table example_chain tcp dport ssh meter example_meter { ip saddr ct count over 2 } counter rejectCopy to Clipboard Copied! Toggle word wrap Toggle overflow Opcionalmente, visualice el contador creado en el paso anterior:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow La entrada
elementsmuestra las direcciones que actualmente coinciden con la regla. En este ejemplo,elementsmuestra las direcciones IP que tienen conexiones activas al puerto SSH. Tenga en cuenta que la salida no muestra el número de conexiones activas o si las conexiones fueron rechazadas.
6.8.2. Bloqueo de direcciones IP que intentan más de diez nuevas conexiones TCP entrantes en un minuto Copiar enlaceEnlace copiado en el portapapeles!
El marco nftables permite a los administradores actualizar dinámicamente los conjuntos. Esta sección explica cómo utilizar esta función para bloquear temporalmente los hosts que establecen más de diez conexiones TCP IPv4 en un minuto. Después de cinco minutos, nftables elimina automáticamente la dirección IP de la lista de denegación.
Procedimiento
Crear la tabla
filtercon la familia de direccionesip:nft add table ip filter
# nft add table ip filterCopy to Clipboard Copied! Toggle word wrap Toggle overflow Añade la cadena
inputa la tablafilter:nft add chain ip filter input { type filter hook input priority 0 \; }# nft add chain ip filter input { type filter hook input priority 0 \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añade un conjunto llamado
denylista la tablafilter:nft add set ip filter denylist { type ipv4_addr \️; flags dynamic, timeout \️; timeout 5m \️; }# nft add set ip filter denylist { type ipv4_addr \️; flags dynamic, timeout \️; timeout 5m \️; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Este comando crea un conjunto dinámico de direcciones IPv4. El parámetro
timeout 5mdefine quenftableselimine automáticamente las entradas después de 5 minutos del conjunto.Añada una regla que añada automáticamente la dirección IP de origen de los hosts que intenten establecer más de diez nuevas conexiones TCP en un minuto al conjunto
denylist:nft add rule ip filter input ip protocol tcp ct state new, untracked limit rate over 10/minute add @denylist { ip saddr }# nft add rule ip filter input ip protocol tcp ct state new, untracked limit rate over 10/minute add @denylist { ip saddr }Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añada una regla que elimine todas las conexiones de las direcciones IP del conjunto
denylist:nft add rule ip filter input ip saddr @denylist drop
# nft add rule ip filter input ip saddr @denylist dropCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Recursos adicionales
6.9. Depuración de las reglas de nftables Copiar enlaceEnlace copiado en el portapapeles!
El marco nftables proporciona diferentes opciones para que los administradores puedan depurar las reglas y si los paquetes coinciden con ellas. Esta sección describe estas opciones.
6.9.1. Crear una regla con un contador Copiar enlaceEnlace copiado en el portapapeles!
Para identificar si una regla coincide, puede utilizar un contador. Esta sección describe cómo crear una nueva regla con un contador.
Para un procedimiento que añade un contador a una regla existente, véase Sección 6.9.2, “Añadir un contador a una regla existente”.
Requisitos previos
- La cadena a la que se quiere añadir la regla existe.
Procedimiento
Añada una nueva regla con el parámetro
countera la cadena. El siguiente ejemplo añade una regla con un contador que permite el tráfico TCP en el puerto 22 y cuenta los paquetes y el tráfico que coinciden con esta regla:nft add rule inet example_table example_chain tcp dport 22 counter accept
# nft add rule inet example_table example_chain tcp dport 22 counter acceptCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para visualizar los valores del contador:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.9.2. Añadir un contador a una regla existente Copiar enlaceEnlace copiado en el portapapeles!
Para identificar si una regla coincide, puede utilizar un contador. Esta sección describe cómo añadir un contador a una regla existente.
Para conocer el procedimiento para añadir una nueva regla con un contador, consulte Sección 6.9.1, “Crear una regla con un contador”.
Requisitos previos
- La regla a la que se quiere añadir el contador existe.
Procedimiento
Muestra las reglas de la cadena incluyendo sus asas:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añada el contador sustituyendo la regla pero con el parámetro
counter. El siguiente ejemplo sustituye la regla mostrada en el paso anterior y añade un contador:nft replace rule inet example_table example_chain handle 4 tcp dport 22 counter accept
# nft replace rule inet example_table example_chain handle 4 tcp dport 22 counter acceptCopy to Clipboard Copied! Toggle word wrap Toggle overflow Para visualizar los valores del contador:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.9.3. Supervisión de los paquetes que coinciden con una regla existente Copiar enlaceEnlace copiado en el portapapeles!
La función de rastreo en nftables en combinación con el comando nft monitor permite a los administradores mostrar los paquetes que coinciden con una regla. El procedimiento describe cómo habilitar el rastreo para una regla, así como la supervisión de los paquetes que coinciden con esta regla.
Requisitos previos
- La regla a la que se quiere añadir el contador existe.
Procedimiento
Muestra las reglas de la cadena incluyendo sus asas:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Añada la función de rastreo sustituyendo la regla pero con los parámetros de
meta nftrace set 1. El siguiente ejemplo reemplaza la regla mostrada en el paso anterior y habilita el rastreo:nft replace rule inet example_table example_chain handle 4 tcp dport 22 meta nftrace set 1 accept
# nft replace rule inet example_table example_chain handle 4 tcp dport 22 meta nftrace set 1 acceptCopy to Clipboard Copied! Toggle word wrap Toggle overflow Utilice el comando
nft monitorpara mostrar el rastreo. El siguiente ejemplo filtra la salida del comando para mostrar sólo las entradas que contieneninet example_table example_chain:nft monitor | grep "inet example_table example_chain" trace id 3c5eb15e inet example_table example_chain packet: iif "enp1s0" ether saddr 52:54:00:17:ff:e4 ether daddr 52:54:00:72:2f:6e ip saddr 192.0.2.1 ip daddr 192.0.2.2 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 49710 ip protocol tcp ip length 60 tcp sport 56728 tcp dport ssh tcp flags == syn tcp window 64240 trace id 3c5eb15e inet example_table example_chain rule tcp dport ssh nftrace set 1 accept (verdict accept) ...
# nft monitor | grep "inet example_table example_chain" trace id 3c5eb15e inet example_table example_chain packet: iif "enp1s0" ether saddr 52:54:00:17:ff:e4 ether daddr 52:54:00:72:2f:6e ip saddr 192.0.2.1 ip daddr 192.0.2.2 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 49710 ip protocol tcp ip length 60 tcp sport 56728 tcp dport ssh tcp flags == syn tcp window 64240 trace id 3c5eb15e inet example_table example_chain rule tcp dport ssh nftrace set 1 accept (verdict accept) ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow AvisoDependiendo del número de reglas con el rastreo activado y de la cantidad de tráfico que coincida, el comando
nft monitorpuede mostrar una gran cantidad de salida. Utilicegrepu otras utilidades para filtrar la salida.
6.10. Copia de seguridad y restauración de conjuntos de reglas nftables Copiar enlaceEnlace copiado en el portapapeles!
Esta sección describe cómo hacer una copia de seguridad de las reglas de nftables en un archivo, así como la restauración de las reglas desde un archivo.
Los administradores pueden utilizar un archivo con las reglas para, por ejemplo, transferirlas a un servidor diferente.
6.10.1. Copia de seguridad de los conjuntos de reglas de nftables en un archivo Copiar enlaceEnlace copiado en el portapapeles!
Esta sección describe cómo hacer una copia de seguridad de los conjuntos de reglas de nftables en un archivo.
Procedimiento
Para hacer una copia de seguridad de las reglas de
nftables:En formato
nft list ruleset:nft list ruleset > file.nft
# nft list ruleset > file.nftCopy to Clipboard Copied! Toggle word wrap Toggle overflow En formato JSON:
nft -j list ruleset > file.json
# nft -j list ruleset > file.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.10.2. Restauración de conjuntos de reglas nftables desde un archivo Copiar enlaceEnlace copiado en el portapapeles!
Esta sección describe cómo restaurar los conjuntos de reglas de nftables.
Procedimiento
Para restaurar las reglas de
nftables:Si el archivo a restaurar está en formato
nft list ruleseto contiene comandosnft:nft -f file.nft
# nft -f file.nftCopy to Clipboard Copied! Toggle word wrap Toggle overflow Si el archivo a restaurar está en formato JSON:
nft -j -f file.json
# nft -j -f file.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow