EL FIREWALL

Un firewall es una aplicación por software o hardware que tiene como objetivo crear y administrar reglas de entrada y de salida con el fin de proteger todo el proceso de conexión a la red. Así, se impide que paquetes sospechosos o no fiables entren a nuestro equipo y causen algún tipo de daño. Hoy en día, cada ciento tiempo aparecen en los medios noticias de ataques informáticos con robos o secuestro de información. Esto ya nos demuestra la importancia de usar un firewall. Aún siendo Linux un sistema operativo excelente en la seguridad no estamos libres de peligro.

Todo linux tiene un firewall llamado netfilter/iptables. A menudo en linux es frecuente llamar iptables al firewall. Esto no es exacto. El verdadero firewall de linux es netfilter que se encuentra en el kernel, siendo iptables una interfaz (de las muchas que hay) para configurar el firewall. Como Iptables es bastante complejo de entender y configurar, recomiendo instalar alguna interfaz mas amigable. Buscando un poco, enseguida verás que UFW (Uncomplicated Firewall) y FirewallD son dos opciones muy usadas y con menos complejidad que la original de linux. En el fondo, con cualquier interfaz de firewall, seguiremos creando reglas iptables pero con menos dolores de cabeza.

En este capítulo, solo veremos FirewallD. Viene por defecto en algunas distros y se puede instalar en casi todas sustituyendo la interfaz predeterminada. En el caso de mi VPS, Ubuntu 18.04, FirewallD ya venía sin que tuviera que instalar nada. Mi proveedor de VPS, al contratar el servidor me entregó un sistema con varios opciones preinstaladas incluyendo esta interfaz y un panel gráfico de configuración llamado Webmin. Mientras escribía este tutorial he adquirido un nuevo servidor Linux de Oracle que trae ufw instalado sobre Ubuntu. En el siguiente capítulo aprenderemos a configurarlo. Así tendremos vistos los dos firewalls dominantes del entorno Linux.

Aunque me he propuesto hacer la máxima configuración por comandos, también veremos como es FirewallD a través del panel Webmin. FirewallD en Webmin tiene una GUI muy intuitiva.

CONOCIENDO FIREWALLD

El firewalld administra grupos de reglas usando entidades llamadas "zonas". Las zonas son básicamente conjuntos de reglas que determinan el tráfico permitido, dependiendo del nivel de confianza que tenga la red en las que está conectada su ordenador. A las interfaces de red se les asigna una zona por defecto que dicte el comportamiento que debería permitir el firewall. En un servidor el uso de varias zonas, en principio, no tiene sentido porque no se mueve de sitio. Las zonas tienen razón de ser en portátiles que pueden cambiar con frecuencia de red. En función de desde donde nos conectamos seleccionamos una zona más restrictiva que otra.

FirewallD trae estas zonas en orden de la menos confiable a la más confiable:

  • drop: tiene el menor nivel de confianza. Todas las conexiones entrantes se descartan sin respuesta y solo se permiten conexiones salientes.
  • block: es similar a la anterior, pero en lugar de simplemente descartar las conexiones, las solicitudes entrantes se rechazan con un mensaje icmp-host-prohibited o icmp6-adm-prohibited.
  • public: representa redes públicas que no son de confianza. No se confía en otras computadoras, pero puede permitir ciertas conexiones entrantes según cada caso individual.
  • external: redes externas, en caso de que esté usando el firewall como puerta de enlace. Está configurada para enmascaramiento de NAT para que su red interna permanezca privada, pero sea accesible.
  • internal: el otro lado de la zona externa; se usa para la parte interna de una puerta de enlace. Las computadoras son bastante confiables y hay algunos servicios adicionales disponibles.
  • dmz: se utiliza para computadoras ubicadas en una red perimetral (equipos aislados que no tendrán acceso al resto de su red). Solo se permiten ciertas conexiones entrantes.
  • work: se utiliza para las máquinas de trabajo. Se confía en la mayoría de las computadoras de la red. Se pueden permitir algunos servicios más.
  • home: un entorno doméstico. En general, implica que se confía en la mayoría de las otras computadoras y que se aceptarán algunos servicios más.
  • trusted: se confía en todas las máquinas de la red. Es la más abierta de las opciones disponibles y debe usarse con moderación.

Cada una de estas zonas son totalmente configurables. Cuando arrancamos el servicio nos encontramos en la zona "public". Podemos crear reglas, alterar las propiedades de nuestras zonas y luego asignar nuestras interfaces de red a las zonas que sean más apropiadas. En el caso de un servidor web, puede ser buena opción, partir de la zona "public" y sobre ella hacer las reglas adicionales que nos interese. Por ejemplo, si daremos servicio de correo abrir los puertos 25 y 465, para http y https abriremos el 80 y 443. Lo ideal es tener abierto solo lo que se necesita. Con firewalld podemos hacer algunos ajustes de puertos por el nombre del servicio sin tener que saber los puertos. Así, en el caso de http, https, ssh, ftp y muchos mas, habilitando por el nombre del servicio actuaremos sobre los puertos predeterminados de ese servicio. ssh suele ser el 22, fpt el 21, http el 80,...

INSTALAR FIREWALLD

Nuestra distro de linux es posible que no tenga FirewallD instalado. Como ya comenté arriba, interfaces hay muchas. Podríamos tener UFW, Iptables,... o no tener ninguna. En el caso de tener otra interfaz y queramos cambiar a FirewallD, debemos desinstalarla para evitar conflictos. Para saber si tenemos FirewallD, abrimos sesión SSH y desde la terminal ponemos:

sudo firewall-cmd --state
running

La respuesta "running" confirma que ya tengo FirewallD instalado y levantado. Para saber cual tienes, deberás investigar un poco. Para comprobar si la interfaz ufw está instalada:

ufw status
sh: 1: ufw: not found

Como ves, responde "ufw no encontrado". Si lo tuviera instalado la respuesta sería algo así como status: activado o desactivado. Recientemente he conseguido un servidor VPS de Oracle con Ubuntu donde no tengo FirewallD y trae UFW. El próximo capítulo de este curso de introducción a Servidores Linux será sobre el firewall UFW.

Una vez tengamos claro que estamos limpios de otros interfaces, para instalar FirewallD como siempre desde usuario root o usuario con permisos sudo

sudo apt install firewalld

Una aclaración: A veces, me salto la recomendación de evitar usar el usuario root. Es por comodidad. Muchas veces entro a la consola del servidor por una terminal web del panel de configuración y por defecto ya entro como root. Por eso muchas veces no aparece sudo al principio de los comandos. Esto se considera una mala praxis. No confundirse con que todos los comandos requierensudodelante. Solamente, las operaciones tienen que ver con la administración del servidor. En el capítulo dedicado a Usuarios y Grupos tocaremos de nuevo el tema de sudo y los permisos administrativos.

Volvemos al tema de Firewalld. Una vez instalado debemos levantar el servicio y fijar que se arranque automaticamente siempre que se inicie el servidor.

sudo systemctl start firewalld
sudo systemctl enable firewalld

Si no hay respuesta de error ya lo tenemos instalado y funcionando.

ESTADO DEL FIREWALL

Vamos a conocer algunos comandos para sacar información del firewall. Ya vimos antes el comando firewall-cmd --state

Con el siguiente además de saber si está en ejecución nos pasa mas info:

$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded:loaded (/lib/systemd/system/ firewalld.service; enabled; vendor preset: enabled)
Active:active (running) since Fri 2021-10-29 16:24:38 UTC; 1 weeks 0 days ago
Docs: man:firewalld(1)
Main PID: 190 (firewalld)
Tasks: 2 (limit: 614)
CGroup: /system.slice/firewalld.service
└─190 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid

Para saber que puertos y servicios tenemos abiertos en una zona y otros detalles:

$ sudo firewall-cmd --zone=public --list-all

Que en mi caso devuelve:

public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client smtp smtps ftp pop3 pop3s imap imaps https snmp http
ports: 587/tcp 53/tcp 20/tcp 2222/tcp 10000-10100/tcp 20000/tcp 1025-65535/tcp 53/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

Como ves nos informa que estamos en la zona public, los servicios y puertos abiertos. Hay otra información más avanzada que se escapa de este tutorial de introducción. Por el momento, enmascarar o reglas rich no tocaremos.

Modificando este comando y cambiando -all por -services o -ports nos devolverá el estado solamente de lo que indiquemos:

$ sudo firewall-cmd --zone=public --list-ports
$ sudo firewall-cmd --zone=public --list-services

Para ver una lista con el estado de todas las zonas:

$ sudo firewall-cmd --list-all-zones

Para saber la zona actual:

$ sudo firewall-cmd --get-default-zone

Aunque la zona "public" es un buen punto de comienzo, podemos cambiar a cualquier otra con esta sentencia sustituyendo nombre_de_zona por la que se quiera asignar:

$ sudo firewall-cmd --set-default-zone= nombre_de_zona

AJUSTES Y CONFIGURACIONES POR SERVICIOS

Sobre la configuración actual podemos hacer infinidad de cambios. Si queremos eliminar o añadir un servicio que no usemos debemos ejecutar 2 líneas de instrucciones. La primera hace la operación y la segunda recarga el servicio FirewallD para que se haga efectivo el cambio. Ejemplo para eliminar el servicio http:

$ sudo firewall-cmd --zone=public --permanent --remove-service=http
success
$ sudo firewall-cmd --reload
success

Fíjate que puse el parámetro --permanent y así este cambio queda predeterminado. Si la respuesta es "success" se hizo efectivo el cambio y se puede comprobar que http ha desaparecido con firewall-cmd --zone=public --list-services. La lista de servicios abiertos ya no indica http. Ahora, para hacer el proceso contrario y volver a abrir el servicio http:

$ sudo firewall-cmd --zone=public --permanent --add-service=http
success
$ sudo firewall-cmd --reload
success

FirewallD tiene una lista de los servicios más comunues para ayudarte a configurar su estado. Así no es necesario recordar cuales son los puertos que necesita cada sercicio. Para ver la lista de servicios:

$ sudo firewall-cmd --get-services

Devolverá la lista de todos los servicios disponibles en FirewallD. (No confundir con los que están abiertos).

RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls managesieve mdns minidlna mosh mountd ms-wbt mssql murmur mysql nfs nfs3 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

Podemos obtener mas detalles de los puertos disponibles en el directorio /usr/lib/firewalld/services. Para cada uno de los servicios hay un archivo XML con el nombre y los puertos que abre. Si el servicio que queremos abrir no está en el directorio o los puertos no se corresponden, con vista a futuros cambios, es recomendable crear un fichero XML con el nombre de este servicio y los puertos que necesita. Aunque requiere un cierto trabajo previo para crearlo, en el futuro, nos facilitará mucho aplicar cambios o desinstalar el servicio ya que es mas fácil administrar servicios que puertos.

Los archivos de servicios personalizados en XML deben guardarse en el directorio/etc/firewalld/services que es donde firewalld busca definiciones no estándar.

Vamos a imaginar que tenemos una aplicación llamada Demo que requiere los puertos 1515/tcp, 2015/tcp y 333/udp. Para crear este archivo podemos copiar uno de los estándar y le cambiamos nombre y características. Podemos tomar como base el servicio ssh y lo personalizamos:

$sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/demoservicio.xml

El comando cp copiará el archivo ssh.xml en el otro directorio y lo renombrará como demoservicio.xml.

El siguiente paso es con un editor de texto cambiar los puertos, descripción y puertos. Suelo utilizar el editor nano, si lo prefieres puedes usar vi o cualquier otro.

$ sudo nano /etc/firewalld/services/demoservicio.xml


Una vez modificado, para guardar cambios con nano pulsamos Ctrl+X

Los siguientes pasos ya los hemos visto anteriormente. Para añadir el servicio personalizado usamos el nombre del archivo XML y a continución recargamos FirewallD.

$ sudo firewall-cmd --zone=public --permanent --add-service=demoservicio
$ sudo firewall-cmd --reload

Si devuelve success veremos los cambios con la ya conocida:

$ sudo firewall-cmd --zone=public --list-all

Y tal como vimos, para eliminar este servicio usamos:

$ sudo firewall-cmd --zone=public --permanent --remove-service=demoservicio

AJUSTES Y CONFIGURACIONES POR PUERTOS

Si queremos abrir un puerto que no corresponde con ningún servicio y no queremos crear uno como hicimos en el anterior apartado, podemos abrirlos o cerrarlos directamente. Por ejemplo, para abrir el puerto 5022/tcp:

$ sudo firewall-cmd --zone=public --add-port=5022/tcp --permanent
success
$ sudo firewall-cmd --reload
success

Como siempre, después de la orden de cambio tenemos que recargar firewalld y ahora si entramos firewall-cmd --zone=public --list-ports aparece el puerto 5022 entre los abiertos. El proceso contrario es muy parecido, cambiamos add por el parámetro --remove. Como siempre después del ajuste es necesario un reload.

$ sudo firewall-cmd --zone=public --remove-port=5022/tcp --permanent

También es posible abrir un rango de puertos. Por ejemplo para abrir todos los puertos entre 5000 y 5025

$ sudo firewall-cmd --zone=public --add-port=5000-5025/tcp --permanent

PERMANENCIA DE LAS REGLAS

En firewalld, las reglas pueden ser designadas como permanentes o inmediatas. Si se agrega o modifica una regla, de manera predeterminada, se modifica el comportamiento del firewall que se ejecuta actualmente. Al reiniciar el servidor esas reglas se anulan. Para que sean permanentes al aplicar la regla se debe añadir el parámetro --permanent. Conviene ser prudente al aplicar determinadas reglas y si no estamos seguros no hacerlas permanentes. Si vemos que funciona como esperamos la asignamos permanente. Puede darse el caso de aplicar una regla equivocada y que nos impida conectarnos. En estos casos si las reglas son predeterminadas, simplemente reiniciando volveremos al estado anterior. De ser ajustes permanentes, podríamos tener un problema serio para recuper el control.

Para fijar las reglas permanentes:

$ sudo firewall -cmd --runtime-to-permanent

Con esto conseguimos que el firewall tal como lo estamos ejecutando tenga esos ajustes predeterminados al reniniciar el VPS. Como ya se ha dicho, todo lo que no sea permanente se pierde al reiniciar.

FIREWALLD DESDE WEBMIN

Para acabar este capítulo dedicado al firewall, no está de mas enseñar la comodidad que da una GUI para configurar. En mi caso particular, tengo el panel Webmin que facilita mucho hacer las configuraciones mas comunes. Por el momento, no explicaré nada sobre esta posibilidad pero viendo la imagen se intuye lo práctico que resulta realizar muchas operaciones que hemos visto por comandos.



En el siguiente capítulo veremos UFW. Uno de los interfaces mas utilizados y, al igual que firewallD, muy sencillo de usar.