#4sysadmins

Inicio » GNU/Linux » Administrar cortafuegos con firewalld

Administrar cortafuegos con firewalld

Follow #4sysadmins on WordPress.com

 

FirewallD

Se trata de un cortafuegos dinámico con soporte para IPv4, IPv6 y puentes de red, que nos permite definir en las interfaces de red ciertas zonas de confianza, a parte de las tradicionales reglas de reenvío, denegación, enmascaramiento, etc…

Al ser dinámico podremos cargar nuevas reglas o modificar las existentes sin necesidad de reiniciar el servicio de cortafuegos, lo que implicaría entre otras cosas, romper las conexiones y, descargar y cargar módulos del kernel. Otra ventaja de firewalld es la de crear reglas de una forma sencilla, basta con seleccionar un servicio (combinación de puerto y protocolo) y elegir a que zona queremos añadirlo. De la misma manera añadiremos interfaces de red, redes, etc…

La desventaja es que «nos obliga» a tener que utilizar exclusivamente firewalld, ya que este no permite la modificación de reglas mediante los tradicionales comandos IPtables. Cierto es, que es nuestra decisión el activar el tradicional IPtables o firewalld pero nunca los dos de forma simultánea.

Nota: Podemos ver a firewalld como el hermano de ufw de Debian, una capa de abstracción para facilitarnos la vida a la hora de configurar el cortafuegos usando de fondo iptables/netfilter.

 

Al lío…

Estamos ante uno de los sistemas que implementan firewalld, bien… ¿como empezamos?, pues viendo si el cortafuegos se encuentra activado o no:

# systemctl status firewalld

ó

# firewall-cmd --state

Para interactuar con firewalld podremos utilizar las herramientas firewall-config (GUI) o firewall-cmd (CLI). Nosotros en esta entrada aprenderemos firewall-cmd.

Activar firewalld en caso de encontrarse desactivado:

# systemctl start firewalld

¿Como instalar firewalld si no viene instalado?

# yum install firewalld

Si además queremos la interfaz gráfica:

# yum install firewall-config

 

¿Zonas de confianza?

Al inicio, hemos comentado la «gran» novedad, la de definir zonas de confianza, bien, pues vamos allá.

¿Que zona tenemos actualmente definida?

# firewall-cmd --get-default-zone

¿Que interfaz de red tenemos asignada a esta zona?

# firewall-cmd --get-active-zones

¿De que otras zonas dispongo?

# firewall-cmd --get-zones

Breve descripción de las zonas:

block: Se rechaza cualquier conexión de entrada emitiendo una respuesta ICMP avisando al origen de la denegación de la conexión.

drop: Se deniega cualquier conexión de entrada sin emitir paquete que informe del rechazo.

dmz: Zona desmilitarizada. Solo serán aceptadas aquellas conexiones preseleccionadas. Una especie de acceso público pero en el que se acaba limitando las conexiones.

external: Redes externas con enmascaramiento habilitado. Solo las conexiones de entrada preseleccionada podrán accesar.

internal: Redes internas (privadas)

home: Área del hogar. Conocido por el mundo MS Windows.

work: Área de trabajo

public: Redes públicas. Las conexiones no son de confianza.

trusted: Toda conexión es aceptada

¿Como cambiar la zona por defecto?

# firewall-cmd --set-default-zone=work

¿Como añadir una interfaz de red a una zona concreta de forma temporal?

Info: Cuando añadimos una regla en firewalld esta puede usarse de forma temporal (se perderá al reinicio) o de forma permanente

# firewall-cmd --zone=internal --change-interface=eth0

¿Y para que perdure tras el reinicio del servicio?

# firewall-cmd --permanent --zone=internal --change-interface=eth0

¿Como averiguar a que otras zonas pertenece por ejemplo eth0?

# firewall-cmd --get-zone-of-interface=eth0

¿Como listar la configuración de una zona?

# firewall-cmd --zone=public --list-all

Nota: Esto mostrará la configuración que se encuentra en ejecución, quizás diferente a la que podría tener si reiniciáramos.

¿Listar la configuración permanente de una zona? Esto es, la que tendrá aun cuando reiniciemos el servicio:

# firewall-cmd --zone=public --permanent --list-all

¿Como listar solo las redes asignadas a una determinada zona?

# firewall-cmd --zone=trusted --list-sources

¿Como crear mi propia zona, por ejemplo llamada secureme?

# firewall-cmd --permanent --new-zone=secureme

¿Como añado una red (source) a mi nueva zona de forma permanente?

# firewall-cmd --permanent --zone=secureme --add-source=192.168.1.0/24

¿Como recargamos el servicio para que el cambio se haga efectivo?

# firewall-cmd --reload

IMPORTANTE: Si queremos por ejemplo añadir una red (source) a una zona pero de forma temporal, bastaría con no pasar el parámetro –permanent y no recargar el servicio, de lo contrario cancelaríamos la operación.

Con el anterior comando podemos también, eliminar el source si aplicamos –remove-source en vez de –add-source o cambiarla de zona si hubiésemos utilizado –change-source y una nueva zona.

 

Añadiendo servicios (puertos y protocolos)

Ahora que hemos finalizado creando nuestra propia zona de confianza (secureme) le hemos asignado nuestra source (192.168.1.0/24), vamos a agregarle algunas reglas de conexiones, por ejemplo:

 # firewall-cmd --permanent --zone=secureme --add-service=samba

Añadimos el acceso a samba en la zona secureme. Ahora habrá que recargar el servicio:

# firewall-cmd --reload

Ahora vamos a desactivar temporalmente el servicio http de nuestra zona secureme:

# firewall-cmd --zone=secureme --remove-service=http

Nota: Para los principales servicios existen definiciones en los archivos /usr/lib/firewalld/services y /etc/firewalld/services (este último tiene preferencia en caso de existir una definición para un servicio concreto en ambos archivos). Podremos crear nuestras propias definiciones para aquellos servicios que no vengan predefinido.

¿Como ver los servicios que vienen predefinido?

# ls /usr/lib/firewalld/services/

¿Como ver los servicios definidos por el usuario?

# ls /etc/sysconfig/iptables

Permitir el tráfico por el puerto 443 en nuestra zona secureme de forma permanente:

# firewall-cmd --zone=internal --add-port=443/tcp

Info: Podemos ver los servicios y puertos habilitados en una zona concreta (en este caso secureme) de la siguiente manera:

# firewall-cmd --zone=secureme --list-services
# firewall-cmd --zone=secureme --list-ports

Crear masquerading desde una zona external a la default que tenemos seteada (secureme):

# firewall-cmd --permanent  --zone=external --add-masquerade

Nota: –remove-masquerade para eliminar el masquerading

¿Como ver si tenemos activo el masquerading?

# firewall-cmd --query-masquerade

¿Como reenviar desde y hacia un puerto?

# firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toport=2222

Nota: Esto reenviará el trafico entrante desde la zona external por el puerto 22 al puerto 2222 de nuestra zona secureme (activa como default). Podemos ver los reenvíos de puertos con la opción –query-forward-port y eliminarlo con –remove-forward-port

 

¿Como habilitar IPtables en sistemas que activan FirewallD como cortafuegos predefinido?

Si queremos utilizar IPtables en un sistema que activa por defecto firewalld (Fedora 21 en adelante y Red Hat 7, lo que incluye entre otras distribuciones a CentOS) bastará con desactivar el servicio:

# systemctl mask firewalld.service
# systemctl stop firewalld.service

Instalar, habilitar y activar IPtables IPv4 e IPv6:

# yum install iptables-services
# systemctl enable iptables.service
# systemctl enable ip6tables.service
# systemctl start iptables.service
# systemctl start ip6tables.service

Listo, de ahora en adelante podemos usar nuestro conocido IPtables. Definiendo las reglas como ya sabemos, bien mediante los comandos, o en sus archivos estáticos (/etc/sysconfig/iptables y /etc/sysconfig/ip6tables). Podremos además instalar system-config-firewal para crear reglas de una forma cómoda.

Nota: Para saber mas sobre IPtables acuda a esta otra entrada


7 comentarios

  1. y como bloqueo o habilito que un programa pase o no por el firewall ? pasan todos los programas o no pasan si todos usan un mismo protocolo? solo por protocolo se controla entonces?

    Me gusta

  2. Muy buena publicación. Se agradece!

    Me gusta

  3. DIEGO ESTEBAN dice:

    1-la zona por defecto es la cual estamos trabajando?
    2- si yo agrego un servicio o protocolo a mi zona por ejemplo ftp , ese servicio viene activo?
    o hay que levantarlo por comandos? saludos

    Me gusta

    • nebul4ck dice:

      Hola Diego debes de comprobar cual es la zona activa por defecto al momento de trabajar con firewallD (firewall-cmd –get-default-zone). Cuando sepas que zona es sobre la que trabajas (activa por defecto). Puedes comprobar también de que tu interfaz de red está asociada con la red por defecto, eso te asegurará de que las reglas se aplican sobre la zona y la zona trabaja con esa interfaz firewall-cmd –get-active-zones(). Ya a partir de ahí trabaja sobre esa zona especificándolo al instante de crear la regla (–zone=).

      Espero haberte ayudado, un saludo.

      Me gusta

  4. Oscar Jasso dice:

    EXCELENTE GRACIAS, AMIGO SALUDOS.

    Me gusta

Deja un comentario, Gracias!