Verificar la configuración del firewall y los ajustes de la red (Linux)

En este artículo encontrará una lista de los comandos más importantes que necesita para verificar la configuración de la red y la configuración del firewall.

Realizar un análisis de los puertos

Para realizar un análisis de los puertos puede usar el programa Netcat (nc), una herramienta universal de escaneo basado en líneas de comando. Se puede utilizar en la terminal o en scripts y permite la comunicación mediante conexiones de red TCP y UDP (Protocolo de Internet versión 4 y versión 6).

Este programa forma parte del paquete de instalación de Ubuntu, pero de ser necesario, también puede ser instalado mediante el paquete netcat-openbsd.

Para instalar netcat en un servidor con la distribución CentOS, introduzca el siguiente comando:

CentOS 7

[root@localhost ~]# yum install nc.x86_64
CentOS 8

[root@localhost ~]# dnf install nmap

 

Para realizar un escaneo de puertos con netcat, escriba el siguiente comando:

nc -v DIRECCIÓN-IP-DEL-SERVIDOR NÚMERO-DE-PUERTO Ejemplo:

[root@localhost ~]# nc -v 192.168.1.1 22

Verificar los servicios de la red

Para obtener una lista de los servicios de red de escucha, los deamons y los programas, escriba el siguiente comando:

netstat -tulpen

A continuación, puede comprobar si los servicios de la red, los deamons y los programas pertinentes están activos y en estado de escucha al puerto correcto. Además, después de introducir el comando puede determinar si el puerto requerido debe ser desbloqueado.

Ejemplo:

[root@localhost ~]# netstat -tulpen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      193        27635      1368/systemd-resolv
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          29477      1582/sshd
tcp6       0      0 :::5355                 :::*                    LISTEN      193        27638      1368/systemd-resolv
tcp6       0      0 :::22                   :::*                    LISTEN      0          29479      1582/sshd
udp        0      0 0.0.0.0:5355            0.0.0.0:*                           193        27634      1368/systemd-resolv
udp        0      0 127.0.0.53:53           0.0.0.0:*                           193        27640      1368/systemd-resolv
udp        0      0 0.0.0.0:68              0.0.0.0:*                           0          27510      1314/dhclient
udp        0      0 127.0.0.1:323           0.0.0.0:*                           0          25505      1174/chronyd
udp6       0      0 :::5355                 :::*                                193        27637      1368/systemd-resolv
udp6       0      0 ::1:323                 :::*                                0          25506      1174/chronyd

Verificar la configuración de la red

Para visualizar las interfaces que han sido configuradas, introduzca el comando ip addr. Después de introducir el comando, se muestra el estado de cada interfaz:

Ejemplo:

root@localhost:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:00:f1:5b brd ff:ff:ff:ff:ff:ff
    inet 217.160.173.123/32 brd 217.160.173.123 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fe00:f15b/64 scope link
       valid_lft forever preferred_lft forever


Puede reactivar una interfaz desactivada con el siguiente comando:

sudo ifup NOMBRE_DE_LA_INTERFAZ


Ejemplo:

[root@localhost ~]# sudo ifup ens192
Si este comando falla, es posible que la interfaz se encuentre en un estado desconocido para el script del comando. En este caso, introduzca el mismo comando con el parámetro --force:

sudo ifup --force NOMBRE_DE_LA_INTERFAZ
Ejemplo:

[root@localhost ~]# sudo ifup --force ens192

A continuación, compruebe si puede establecer una conexión de red cifrada con su servidor. Si esto no es posible, compruebe la configuración de la red del servidor.

Para ello, abra los archivos de configuración que aparecen a continuación con el editor vi. Compruebe y edite la configuración y, de ser necesario, reinicie la red para aplicar los cambios a la configuración de la red:

Ubuntu

/etc/network/interfaces

CentOS 7 y CentOS 8

/etc/sysconfig/network-scripts/


Para reiniciar la red, escriba el/los siguiente(s) comando(s):

Ubuntu

[root@localhost ~]# /etc/init.d/networking restart
CentOS 7

[root@localhost ~]# /etc/init.d/network restart
CentOS 8

[root@localhost ~]# nmcli networking off
[root@localhost ~]# nmcli networking on

Mostrar y configurar la tabla de rutas IP con la ruta apropiada

Puede usar el programa route para ver y configurar la tabla de rutas IP. Para ello, introduzca el siguiente comando:

[root@localhost ~]# route

Después de introducir el comando, se verá información como la del siguiente ejemplo:

[root@localhost home]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens192
gateway         0.0.0.0         255.255.255.255 UH    100    0        0 ens192
169.254.169.254 gateway         255.255.255.255 UGH   100    0        0 ens192
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
localhost       0.0.0.0         255.255.255.255 UH    100    0        0 ens192

Verificar la configuración del firewall (CentOS 6, CentOS 7 y Ubuntu)

Por defecto, el núcleo de Linux viene con un filtro de paquetes que es proporcionado por los módulos del paquete de software de Netfilter. Sin embargo, para configurarlo se requiere un programa adicional.

Con el usuario de administrador puede usar el programa iptables para crear, modificar o eliminar reglas. iptables es un programa que facilita la configuración de las tablas proporcionadas por el firewall en el núcleo de Linux.

Los ajustes que hayan sido realizados con iptables se perderán al reiniciar el sistema. Por lo tanto es recomendable usar las herramientas iptables-save e iptables-restore para guardar y restaurar las reglas creadas. 

Atención

Siempre que realice cambios en iptables, asegúrese de que los puertos necesarios para la accesibilidad del servidor, como el puerto 22, no estén bloqueados.

El script de inicio (init-script) se encarga de hacer esto automáticamente durante el proceso de arranque. iptables está limitado a IPv4, por lo que para los demás protocolos existen otras variaciones adecuadas como ip6tables para IPv6 o ebtables para paquetes Ethernet, que también están incluidos en el módulo del núcleo.

Por lo general, iptables viene instalado por defecto en Linux. iptables requiere privilegios avanzados del sistema, por lo que solo puede ser ejecutado desde el usuario root o con privilegios de administrador.
La comprobación de paquetes y las reglas de filtrado que se crean con los iptables tienen tres niveles: tablas, cadenas y reglas.

Las tablas que vienen con el programa y las que han sido creadas previamente por el núcleo contienen cadenas de reglas que definen cómo deben ser tratados los paquetes de datos entrantes y salientes. Dentro de una cadena, estos paquetes son trasladados de una regla a otra. Todas las reglas pueden producir una acción (jump target) o provocar un cambio a otra cadena (goto chain).

Se pueden activar las siguientes reglas:

ACCEPT: acepta el paquete.

DROP: descarta el paquete.

QUEUE: traslada el paquete a los procesos de usuario; requiere un intermediario (queue handler) que reenvíe los paquetes a una aplicación.

RETURN: devuelve el paquete a la cadena anterior en caso de que esta haya sido definida por el usuario. La política se ejecuta en cadenas estándar. La acción ACCEPT se ejecuta por defecto y sin necesidad de realizar más configuraciones.

Tablas

Las tablas se utilizan para agrupar las reglas de filtrado y se dividen según la tarea básica. Hay cuatro tablas importantes en las que se pueden determinar las reglas de filtrado:

filter: es la tabla estándar.

nat: se utiliza para cambiar los paquetes que establecen una nueva conexión y se usan para la traducción de direcciones (Network Adress Translation, NAT).

mangle: se utiliza normalmente para ciertos tipos de manipulación de paquetes.

raw: se utiliza principalmente para definir excepciones de seguimiento de conexiones en combinación con el objetivo NOTRACK.

Cadenas

Cada tabla contiene diferentes cadenas que determinan cuando un paquete debe ser revisado. Se diferencia entre las siguientes cadenas:

Cadena Tabla Descripción
INPUT filter, mangle Se aplica a todos los paquetes que se dirijan a un proceso local.
OUTPUT filter, nat, mangle, raw Se aplica a todos los paquetes que tengan su origen en un proceso local.
FORWARD filter, mangle Se aplica a todos los paquetes para los cuales se determina una ruta.
PREROUTING nat, mangle, raw Se aplica a todos los paquetes antes de su enrutamiento.
POSTROUTING nat, mangle Se aplica a todos los paquetes después de su enrutamiento.

Las reglas de filtrado se definen en las tablas y cadenas. Para ello es necesario que se muestren los iptables en la terminal.

Consulte la página Man para obtener una descripción detallada de cómo funciona el software de filtrado de paquetes. Puede mostrarlo con el siguiente comando:

[root@localhost ~]# man iptables
Además, podrá encontrar más información (disponible solo en inglés) en la siguiente página:

http://www.netfilter.org

Para mostrar el comportamiento estándar de las iptables, escriba el siguiente comando:

[root@localhost ~]# iptables -L

Para verificar las reglas de filtrado almacenadas, introduzca los siguientes comandos:

[root@localhost ~]# sudo iptables -t filter -L

[root@localhost ~]# sudo iptables -t nat -L

[root@localhost ~]# sudo iptables -t mangle -L

[root@localhost ~]# sudo iptables -t raw -L
Para borrar todas las reglas, escriba el siguiente comando:

[root@localhost ~]# iptables -F

Otros comandos importantes

A continuación encontrará una lista de otros comandos importantes para los iptables.


Crear una nueva cadena:

sudo iptables -N NOMBRE_DE_LA_CADENA
Ejemplo:

[root@localhost ~]# sudo iptables -N Test

 

Borrar una cadena:

sudo iptables -X NOMBRE_DE_LA_CADENA
Ejemplo:

[root@localhost ~]# sudo iptables -X Test

 

Mostrar una lista de las reglas de cadena Test:

sudo iptables -L NOMBRE_DE_LA_CADENA


Ejemplo:

[root@localhost ~]# sudo iptables -L Test

 

Eliminar reglas de la cadena Test:

sudo iptables -F NOMBRE_DE_LA_CADENA
Ejemplo:

[root@localhost ~]# sudo iptables -F Test

 

Establecer una política para la cadena:

En el ejemplo siguiente, el paquete se aceptará automáticamente si no se aplican las reglas de filtrado de la cadena INPUT.

[root@localhost ~]# sudo iptables -P INPUT ACCEPT

 

Agregar una nueva regla a una cadena seleccionada:

sudo iptables -A NOMBRE_DE_LA_CADENA -s DIRECCIÓN_IP -j DROP
En el siguiente ejemplo, la regla para descartar paquetes de datos provenientes de la dirección IP 217.160.172.48 ha sido añadida a la cadena Test.

[root@localhost ~]# sudo iptables -A Test -s 217.160.172.48 -j DROP

 

Borrar una regla determinada en la cadena seleccionada:

sudo iptables -D NOMBRE_DE_LA_CADENA -s DIRECCIÓN_IP -j DROP
Ejemplo:

[root@localhost ~]# sudo iptables -D Test -s 217.160.172.48 -j DROP

 

Insertar una nueva regla en una posición determinada de la cadena:

sudo iptables -I NOMBRE_DE_LA_CADENA 1 -s DIRECCIÓN_IP -j DROP
En este ejemplo, la cadena ha sido insertada en la posición 1.

Ejemplo:

[root@localhost ~]# sudo iptables -I Test 1 -s 217.160.172.48 -j DROP

 

Especificar una posición para borrar una regla de la cadena seleccionada:

sudo iptables -D NOMBRE_DE_LA_CADENA 1
Ejemplo:

[root@localhost ~]# sudo iptables -D Test 1

Guardar los resultados

Para guardar los ajustes realizados con iptables de forma permanente en un archivo, escriba el siguiente comando:

Ubuntu

sudo iptables-save > /etc/iptables/rules.v4
CentOS

iptables-save > /etc/sysconfig/iptables

 

Para recargar el archivo para el protocolo IPv4, introduzca el siguiente comando:

Debian/Ubuntu

iptables-restore /etc/iptables/rules.v4
CentOS

iptables-restore /etc/sysconfig/iptables

 

Si desea cargar las reglas automáticamente, puede utilizar los siguientes métodos:

Ubuntu

Con el paquete iptables-persistent las reglas del firewall se almacenarán en los archivos de configuración, en /etc/iptables/. De esta manera las reglas se cargarán y se activarán de nuevo cuando se inicie el servidor. Para ello, es necesario que las reglas estén almacenadas en el archivo /etc/iptables/rules.v4 para el protocolo IPv4.

Para usar iptables-persistent, debe instalar el siguiente paquete:

apt-get install iptables-persistent

CentOS 7

Para almacenar las reglas de iptables de manera permanente, es necesario instalar el servicio iptables-services.

yum install - iptables-services
Para continuar usando iptables, es necesario desactivar el servicio firewalld.

systemctl stop firewalld
systemctl mask firewalld

Ahora debe activar el servicio.

systemctl enable iptables.service
systemctl -t service | grep iptables

Las reglas para IPv4 se almacenarán en el archivo /etc/sysconfig/iptables.

También puede utilizar el siguiente script para guardar las reglas actuales:

[root@localhost ~]# /usr/libexec/iptables/iptables.init save

Nota

Después de configurar iptables y guardar las reglas de manera permanente, compruebe que estas se carguen al reiniciar el servidor.

Puede visualizar las reglas después del reinicio con el siguiente comando:

iptables -L
Otra alternativa es escribir el siguiente comando para comprobar el estado de ip-tables:

systemctl status iptables.service

Verificar la configuración del firewall (CentOS 8)

Por defecto, CentOS 8 establece el firewall basándose en la infraestructura de nftables y lo utiliza como backend estándar.

nftables no crea tablas y cadenas por defecto, como lo hacía su predecesor iptables. Desde su usuario de administrador, primero cree las tablas y añada las cadenas que se anclen al núcleo de Linux tales como los Netfilter-Hooks. Luego cree las reglas apropiadas para las cadenas.

A continuación encontrará algunas diferencias importantes entre nftables e iptables:

  • Las tablas y cadenas son totalmente configurables.

  • Ya no hay distinción entre coincidencias y objetivos.

  • Se pueden especificar múltiples acciones en una sola regla.

  • Se provee un mejor soporte para las actualizaciones del conjunto de reglas dinámicas.


Para obtener más información sobre las diferencias entre iptables y nftables, haga clic en el siguiente enlace (disponible en inglés):

https://wiki.nftables.org/wiki-nftables/index.php/Main_differences_with_iptables

Sintaxis de los comandos

Los comandos básicos de las tablas, cadenas y reglas siempre están estructurados de la siguiente manera:

nft <add|list|flush|delete> <table|chain|rule> <OtrasOpciones>

Crear una tabla

Para crear una tabla y un conjunto de reglas, introduzca el siguiente comando:

[root@localhost ~]# nft add table inet mi_tabla
nft list ruleset
table inet mi_tabla {
}

Para crear una cadena, introduzca el siguiente comando. Al hacer esto, debe especificar a qué tabla pertenece la cadena. Además debe definir el tipo, el hook y la prioridad.

nft add chain inet mi_tabla mi_cadena_de_filtro { type filter hook input priority 0 \; }

Nota

La barra invertida (\) es necesaria para que la interfaz de comandos no interprete el punto y coma como el final de un comando.

También es posible crear cadenas sin especificar un hook. Las cadenas que se crean sin especificar un hook son equivalentes a las cadenas de iptables personalizadas. Con las reglas se pueden utilizar las instrucciones "jump" o "goto" para ejecutar las reglas en la cadena. Esto es útil para separar las reglas de manera lógica o para compartir un subconjunto de reglas que de otro modo estarían duplicadas.

Una gran innovación en nftables es el concepto de familias: nft proporciona un conjunto de familias de direcciones para crear reglas. Los predefinidos son arp (ARP), bridge (anteriormente proporcionado por Ebtables), inet (que incluye los protocolos IPv4 e IPv6), ip (para IPv4), ip6 (para IPv6) y netdev. Todas las tablas relacionadas deben estar en la misma familia, lo cual es de gran importancia cuando se generen tablas y cadenas.

Por ejemplo, para crear una regla para la cadena que permita una conexión SSH, escriba el siguiente comando:

nft add rule familia_de_direcciones mi_tabla mi_cadena_de_filtro tcp dport ssh accept 
Ejemplo:

[root@localhost ~]# nft add rule inet mi_tabla mi_cadena_de_filtro tcp dport ssh accept

Puede eliminar las reglas con los controladores de reglas (handle). Para borrar una regla, debe encontrar el controlador de la regla que desee borrar.

Ejemplo:

[root@localhost ~]# nft --handle list ruleset
table inet mi_tabla { # handle 21
chain mi_cadena_de_filtro { # handle 1
type filter hook input priority 0; policy accept;
tcp dport http accept # handle 3
tcp dport 1234 accept # handle 8
tcp dport nfs accept # handle 7
tcp dport ssh accept # handle 2 }
}

A continuación utilice el controlador para borrar la regla. Para ello, introduzca el siguiente comando:

nft delete rule [<familia>] <tabla> <cadena> [handle <handle>]
Ejemplo:

[root@localhost ~]# nft delete rule inet mi_tabla mi_cadena_de_filtro handle 8
[root@localhost ~]# nft --handle list ruleset
table inet mi_tabla { # handle 21
    chain mi_cadena_de_filtro { # handle 1
    type filter hook input priority 0; policy accept;
    tcp dport http accept # handle 3
    tcp dport nfs accept # handle 7
    tcp dport ssh accept # handle 2
    }
}

Mostrar una lista de reglas

Para mostrar una tabla, utilice los siguientes comandos:

nft list tables [<familia>]
nft list table [<familia >] <name> [-n] [-a]
nft (add | delete | flush) table [<familia >] <name>

Para mostrar todas las reglas de una tabla en particular, introduzca el siguiente comando:

[root@localhost ~]#  nft list table inet mi_tabla
table inet mi_tabla {
    chain mi_cadena_de_filtro {
        type filter hook input priority 0; policy accept;
        tcp dport http accept
        tcp dport nfs accept
        tcp dport ssh accept
    }
}

Para mostrar todas las reglas en una cadena, introduzca el siguiente comando:

[root@localhost ~]#  nft list chain inet mi_tabla mi_otra_cadena
table inet mi_tabla {
    chain mi_cadena_de_filtro {
        udp dport 12345 log prefix "UDP-12345"
    }
}


Puede guardar un conjunto de reglas con el siguiente comando:

nft list ruleset > /root/nftables.conf

Puede crear un conjunto de reglas con el siguiente comando:

nft -f /root/nftables.conf

Para habilitar el servicio systemd y configurar que sus reglas sean restauradas al reiniciar, introduzca el siguiente comando:

systemctl enable nftables
nft list ruleset > /etc/sysconfig/nftables.conf

Puede obtener más información sobre nftables en el siguiente enlace (disponible en inglés):

https://wiki.nftables.org/wiki-nftables/index.php/Main_Page