GNU/Linux >> Tutoriales Linux >  >> Linux

Asegure su red Linux con firewall-cmd

Los firewalls son una parte vital de la seguridad de la red, por lo que es importante que un administrador de sistemas esté familiarizado con su funcionamiento. Si comprende los firewalls, puede mantener su red segura al tomar decisiones inteligentes sobre el tráfico que permite la entrada y salida.

Debido a que "cortafuegos" es un nombre tan emocionante, la gente a menudo imagina una intrincada batalla de neón al estilo de Tron en las afueras de una red, con paquetes de datos no autorizados que se encienden para proteger la fortaleza tecnológica de sus usuarios. En realidad, un firewall es solo una pieza de software que controla el tráfico de red entrante y saliente.

Puertos

Un firewall puede administrar este tráfico al monitorear los puertos de red. En el mundo de los cortafuegos, el término puerto no se refiere a una conexión física como un puerto USB, VGA o HDMI. A los efectos de los cortafuegos, un puerto es una construcción artificial creada por el sistema operativo para representar un camino para un tipo específico de datos. Este sistema podría haberse llamado cualquier cosa, como "contactos", "conexiones" o incluso "pingüinos", pero los creadores usaron "puertos", y ese es el nombre que todavía usamos hoy. El punto es que no hay nada especial en ningún puerto; son solo una forma de designar una dirección donde ocurre la transferencia de datos.

Hay una serie de puertos que son bien conocidos, pero incluso estos son solo convenciones. Por ejemplo, puede saber que el tráfico HTTP ocurre en el puerto 80, el tráfico HTTPS usa el puerto 443, FTP usa el puerto 21 y SSH usa el puerto 22. Cuando su computadora transmite datos a otra computadora, agrega un prefijo a los datos para indicar qué puerto al que quiere acceder. Si el puerto en el extremo receptor acepta datos del mismo protocolo que los datos que está enviando, entonces los datos se intercambian con éxito.

Puede ver este proceso en acción visitando cualquier sitio web. Abra un navegador web y vaya a example.com:80 , lo que hace que su computadora envíe una solicitud HTTP al puerto 80 de la computadora que sirve al sitio web example.com. Recibes una página web a cambio. Sin embargo, los navegadores web no requieren que ingrese el puerto al que desea acceder cada vez que navega a una URL, porque se supone que el tráfico HTTP accede al puerto 80 o 443.

Puede probar este proceso utilizando un navegador web basado en terminal:

$ curl --connect-timeout 3 "http://example.com:80" | head -n4
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

Usando la misma notación, puede forzar el rechazo navegando a un sitio web usando un puerto no estándar. Navegue a un puerto arbitrario, example.com:79 por ejemplo. Se rechazó su solicitud de una página web:

$ curl --connect-timeout 3 "http://example.com:79"
curl: (7) Failed to connect: Network is unreachable

La correlación entre puertos y protocolos son meras convenciones acordadas mutuamente por un grupo de estándares y una base de usuarios. Estas configuraciones se pueden cambiar en computadoras individuales. De hecho, en los días pioneros de la computación, muchas personas pensaban que simplemente cambiar el número de puerto de los servicios populares disiparía un ataque. Hoy en día, los ataques son mucho más sofisticados. No tiene mucho valor sorprender a un escáner de puertos automatizado cambiando el puerto en el que escucha un servicio.

En su lugar, un cortafuegos gobierna qué actividad está permitida en un puerto determinado.

[ Descarga gratuita:hoja de referencia de comandos avanzados de Linux. ]

La interfaz de firewall-cmd

Su infraestructura puede tener un servidor en un bastidor con el único propósito de ejecutar un firewall, o puede tener un firewall integrado en el enrutador, o módem, que actúa como su puerta de enlace principal a Internet. Probablemente también tenga un firewall ejecutándose en su estación de trabajo personal o computadora portátil. Todos estos cortafuegos tienen su propia interfaz de configuración. Este artículo cubre el firewall-cmd comando de terminal que se encuentra en la mayoría de las distribuciones de Linux.

Firewall-cmd es una herramienta de front-end para administrar el firewalld daemon, que interactúa con el marco netfilter del kernel de Linux. Esta pila probablemente no esté presente en los módems incorporados comunes en las pequeñas y medianas empresas, pero está disponible para cualquier distribución de Linux que use systemd. .

Sin un cortafuegos activo, firewall-cmd no tiene nada que controlar, por lo que el primer paso es asegurarse de que firewalld está ejecutando: 

$ sudo systemctl enable --now firewalld

Este comando inicia el demonio del cortafuegos y lo configura para que se cargue automáticamente al reiniciar.

Bloquear (casi) todo

El consejo común al configurar un firewall es primero bloquear todo y luego abrir los puertos que sabe que realmente necesita. Sin embargo, eso significa que tienes que saber lo que necesitas y, a veces, averiguarlo es un trabajo de una tarde.

Si su organización ejecuta su propio servicio de almacenamiento en caché DNS o DNS, por ejemplo, debe recordar desbloquear el puerto (generalmente 53) que maneja la comunicación DNS. Si confía en SSH para configurar sus servidores de forma remota, entonces no debe bloquear ese puerto. Debe dar cuenta de todos los servicios que se ejecutan en su infraestructura y debe comprender si ese servicio es solo interno o si necesita interactuar con el mundo exterior.

En el caso del software propietario, es posible que se realicen llamadas al mundo exterior de las que ni siquiera es consciente. Si algunas aplicaciones reaccionan mal a un firewall estricto que se implementó recientemente, es posible que deba realizar ingeniería inversa (o hablar con la línea de soporte de la aplicación) para descubrir qué tipo de tráfico está tratando de crear y por qué. En el mundo del código abierto, este problema es menos común, pero no está fuera del ámbito de la posibilidad, especialmente en el caso de pilas de software complejas (por ejemplo, hoy en día, incluso los reproductores multimedia hacen llamadas a Internet, aunque solo sea para buscar la carátula del álbum o una lista de canciones).

Firewall-cmd utiliza zonas como ajustes preestablecidos, lo que le brinda valores predeterminados sensatos para elegir. Hacer esto le evita tener que construir un firewall desde cero. Las zonas se aplican a una interfaz de red, por lo que en un servidor con dos interfaces ethernet, puede tener una zona que gobierne una interfaz ethernet y una zona diferente que gobierne la otra.

Vale la pena tomarse un tiempo para familiarizarse con las zonas provistas en su sistema. Para ver todas las zonas disponibles, utilice:

$ sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work

Para ver lo que está desbloqueado en una zona específica:

$ sudo firewall-cmd --zone work --list-all
work
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Utilice una de las zonas existentes como punto de partida para sus propias reglas de cortafuegos, o simplemente cree las suyas propias.

Crear una zona

Para crear una nueva zona, use --new-zone opción.

Todo firewall-cmd las acciones persisten solo hasta que se reinicia el firewall o la computadora que lo ejecuta. Todo lo que desee que sea permanente debe ir acompañado del --permanent bandera.

Por ejemplo, cree una nueva zona permanente llamada corp y, a continuación, vuelva a cargar las reglas del cortafuegos para que se active su nueva zona:

$ sudo firewall-cmd --new-zone corp --permanent
success
$ sudo firewall-cmd --reload

Antes de asignar cualquier interfaz de red a esta nueva zona, agregue el ssh servicio para que pueda acceder a él de forma remota. Usa el --permanent opción para hacer que esta adición persista entre reinicios:

$ sudo firewall-cmd --zone corp --add-service ssh --permanent

Tu nueva zona, llamada corp , ahora está activo, rechaza todo el tráfico excepto SSH y no está asignado a ninguna interfaz de red específica. Para hacer corp la zona activa y predeterminada para la interfaz de red que desea proteger (ens3 en este ejemplo), utilice --change-interface opción:

$ firewall-cmd --change-interface ens3 \
  --zone corp --permanent
The interface is under control of NetworkManager, setting zone to 'corp'.
success

Haciendo corp la zona predeterminada, todos los comandos futuros se aplican a corp a menos que --zone La opción especifica una zona diferente. Si desea configurar corp ya que el valor predeterminado depende de si planea esta zona como su nueva zona principal. Si es así, lo siguiente hace el trabajo:

$ sudo firewall-cmd --set-default corp

Para ver las zonas actualmente asignadas a cada interfaz, utilice --get-active-zones opción:

$ sudo firewall-cmd --get-active-zones``
corp
  interfaces: ens3
work
  interfaces: ens4

Añadir y quitar servicios

Ahora que ha bloqueado todo menos SSH, puede abrir los puertos de los que depende su red. La forma rápida y fácil de permitir el tráfico a través de su firewall es agregar un servicio predefinido.

La lista de servicios predefinidos disponibles es extensa. Para verlo, use:

$ sudo firewall-cmd --get-services
RH-Satellite-6 amanda-client amqp 
amqps apcupsd audit bacula bacula-client
bgp bitcoin bitcoin-rpc bitcoin-testnet ceph
cockpit dhcp dhcpv6 dhcpv6-client distcc dns
[...]

Suponga que necesita ejecutar un servidor web. Primero, instalaría el servidor web que desea usar (el httpd paquete en RHEL o Fedora, apache2 en Ubuntu y Debian). Para este ejemplo, usaremos httpd :

$ sudo dnf install httpd
$ sudo systemctl --enable --now httpd 

Luego, pruebe su servidor web localmente:

$ curl --silent localhost:80 | grep title
<title>Test Page for the Apache HTTP Server on Red Hat Enterprise Linux</title>

A continuación, intente conectarse a su servidor web desde un navegador externo. La conexión falla, demostrando que el firewall es efectivo:

$ curl --connect-timeout 3 192.168.122.206
curl: (28) Connection timed out after 3001 milliseconds

Desbloquear un servicio

Para permitir el tráfico HTTP a través de su firewall, agregue el http servicio:

$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --reload

Luego, prueba con una fuente externa:

$ curl --silent 192.168.122.206 | grep title
<title>Test Page for the Apache HTTP Server on Red Hat Enterprise Linux</title>

Ahora que sabe cómo agregar un servicio, eliminar uno es bastante intuitivo:

$ sudo firewall-cmd --remove-service http --permanent
$ sudo firewall-cmd --reload

Añadir y eliminar puertos

A veces, un servicio predefinido no existe o asume valores predeterminados que no coinciden con su red. En lugar de agregar un servicio, puede agregar un número de puerto y un tipo de protocolo directamente con --add-port .

Por ejemplo, si necesita agregar el puerto no estándar 1622 para SSH a su zona personalizada (si su zona personalizada no es la zona predeterminada para sus comandos, agregue --zone opción):

$ sudo firewall-cmd --add-port 1622/tcp --permanent
success
$ sudo firewall-cmd --reload

Para eliminar ese puerto, use --remove-port :

$ sudo firewall-cmd --remove-port 1622/tcp --permanent
success
$ sudo firewall-cmd --reload

Paredes de fuego

Hay mucho más que puede hacer con firewall-cmd , como la definición de sus propios servicios, el bloqueo de ICMP y la definición de fuentes de tráfico entrante permitido. La mejor manera de aprender es experimentando, así que instale Red Hat Enterprise Linux o Fedora en GNOME Boxes y experimente modelando el tráfico a través de todas las opciones firewall-cmd proporciona.


Linux
  1. Comience con NetworkManager en Linux

  2. Asegure sus contenedores con SELinux

  3. Cómo proteger sus servicios de correo electrónico de Linux con SSL/TLS

  4. Introducción a los cortafuegos de Linux

  5. 6 herramientas de código abierto imprescindibles para proteger su servidor Linux

Haga que Linux sea más fuerte con firewalls

Asegure su privacidad en línea con estas distribuciones de Linux

Cómo asegurar servidores Linux con SE Linux

Network Manager en Linux con ejemplos

Cómo proteger un firewall de Linux con reglas de IPTables

5 prácticas recomendadas de seguridad SSH de Linux para proteger sus sistemas