GNU/Linux >> Tutoriales Linux >  >> Linux

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

La piratería de servidores y el acceso no autorizado son amenazas reales. Estas son las razones por las que debe implementar un firewall como parte de su estrategia general de seguridad de la red. Configurar un firewall con reglas de iptables es una forma de mitigar tales riesgos en los sistemas Linux.

Por suerte para usted, este tutorial le enseñará cómo implementar un firewall con una configuración básica de reglas de iptables que luego puede personalizar según sus requisitos. ¿Listo para ensuciarte las manos? ¡Hora de sumergirse!

Requisitos

Este tutorial alberga demostraciones prácticas. Si desea seguir, asegúrese de tener un servidor Linux o una computadora de escritorio. Este tutorial usa Ubuntu 14.04 para los ejemplos, pero debería funcionar con otras distribuciones de Linux y versiones más nuevas de Ubuntu.

Instalación del servicio de firewall persistente de Iptables

Como su nombre lo indica, IPTables Persistent Firewall es un servicio que guarda sus conjuntos de reglas y aplica automáticamente las reglas de IPTables en los reinicios del servidor. Pero primero, deberá instalar el paquete de firewall persistente.

Para instalar el Firewall Persistente de IPTables, proceda con los siguientes pasos.

1. Abra una sesión de terminal en su servidor, ya sea localmente o a través de SSH.

2. A continuación, ejecute el siguiente comando para actualizar el caché de origen del paquete de su servidor.

# Updating the package source cache
sudo apt update -y

3. Ahora, ejecute el siguiente comando para instalar el Firewall persistente de IPTables.

# Installing the Persistent Firewall Package
sudo apt install iptables-persistent -y

4. Para guardar las reglas actuales de IPv4 , seleccione y presione Entrar en el aviso. El instalador guarda las reglas de IPv4 en el archivo /etc/iptables/rules.v4.

5. El siguiente mensaje le pide que Guarde las reglas actuales de IPv6 , seleccione Sí, y presione Entrar. El instalador guarda las reglas de IPv6 en el archivo /etc/iptables/rules.v6.

Por último, confirme que el netfilter-persistent.service está activo y habilitado.

sudo systemctl status netfilter-persistent

Configuración de reglas básicas de Iptables

En la configuración básica del firewall, construirá un marco extensible en el que puede construir para configurar su firewall. Por lo general, configurará un "denegar todo-aceptar todo ”, lo que significa que se denegará cualquier solicitud entrante desde cualquier IP, excepto su IP y el puerto SSH 22 (para acceso de administrador).

Se permitirán todas las conexiones en curso desde la IP de su servidor a Internet en general; se eliminarán todas las conexiones entrantes (excepto SSH). Luego, creará excepciones para los servicios específicos y los tipos de tráfico que necesita, aprendiendo gradualmente más adelante en este tutorial.

1. Abra /etc/iptables/rules.v4 archivo en un editor de texto. Este ejemplo usa nano como editor.

sudo nano /etc/iptables/rules.v4

A continuación, elimine todo el contenido en /etc/iptables/rules.v4 archivo y reemplácelo con las siguientes líneas. Consulte los comentarios en línea para comprender qué hace cada línea/sección.

Nota:La siguiente configuración de firewall es lo que puede describir como estricta y es solo para crear una regla de firewall básica, que luego puede personalizar.

*filter
# Setting up a "deny all-accept all" policy
# Allow all outgoing, but deny/drop all incoming and forwarding traffic
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Custom per-protocol chains
# Defining custom rules for UDP protocol.
:UDP - [0:0]
# Defining custom rules for TCP protocol.
:TCP - [0:0]
# Defining custom rules for ICMP protocol.
:ICMP - [0:0]

# Accept SSH UDP traffic
-A TCP -p udp --dport 22 -j ACCEPT
# Accept SSH TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT

# Acceptable ICMP traffic

# Boilerplate acceptance policy
# Allowing packets based on the CONNTRACK connection states of ESTABLISHED and RELATED
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Allowing packets through the loopback interface, which is used for local connections
-A INPUT -i lo -j ACCEPT

# Packets that do not match any rules in the protocol-specific should be dropped.
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Allowing new protocol-specific chains to process packets for UDP that have a NEW conntrack state.
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
# Allowing new protocol-specific chains to process packets for TCP that have a NEW conntrack state.
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
# Allowing new protocol-specific chains to process packets for ICMP that have a NEW conntrack state.
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP

# Reject anything at this point. And print out rejection message with its specific protocol.
# Issuing an ICMP "port unreachable" message to any new incoming UDP packets, rejecting them.
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
# Issuing a "tcp-reset" message to any new incoming TCP packets, rejecting them.
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
# Issuing an "icmp-proto-unreachable" message to any new incoming TCP packets, dropping all other incoming packets.
-A INPUT -j REJECT --reject-with icmp-proto-unreachable

# Commit the changes
COMMIT

*raw
# Allowing packets in the PREROUTING chain
:PREROUTING ACCEPT [0:0]
# Allows packets in the OUTPUT chain, which is used for locally generated packets
:OUTPUT ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT
# NAT table is used to alter packets as they are routed through the system
*nat
:PREROUTING ACCEPT [0:0]
# Allowing packets in the INPUT chains for NAT
:INPUT ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for NAT
:OUTPUT ACCEPT [0:0]
# Allowing packets in the POSTROUTING chains for NAT
:POSTROUTING ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

*security
# Allowing packets in the INPUT chains for security
:INPUT ACCEPT [0:0]
# Allowing packets in the FORWARD chains for security
:FORWARD ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for security
:OUTPUT ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

*mangle
# Allowing packets in the PREROUTING chains for mangle
:PREROUTING ACCEPT [0:0]
# Allowing packets in the INPUT chains for mangle
:INPUT ACCEPT [0:0]
# Allowing packets in the FORWARD chains for mangle
:FORWARD ACCEPT [0:0]
# Allowing packets in the OUTPUT chains for mangle
:OUTPUT ACCEPT [0:0]
# Allowing packets in the POSTROUTING chains for mangle
:POSTROUTING ACCEPT [0:0]
# Commits the changes to the kernel
COMMIT

3. Guarde el archivo. En nano , presione CTRL+X, Y, Intro.

4. Ejecute el iptables-restore comando a continuación para validar o encontrar cualquier error de sintaxis. Si no hay errores, el cortafuegos se reiniciará con las reglas que definió en el archivo. Si hay errores, el comando devolverá una lista de los errores y cómo corregirlos.

sudo iptables-restore -t /etc/iptables/rules.v4

5. A continuación, edite /etc/iptables/rules.v6 para implementar su política de firewall y marco para IPv6.

sudo nano /etc/iptables/rules.v6

6. Reemplace el archivo /etc/iptables/rules.v6 con las siguientes lineas. Guarde y salga de /etc/iptables/rules.v6 presionando CTRL+X, Y, Enter.

Las reglas de iptables a continuación eliminarán todo el tráfico de IPv6 y asumen que no hay ninguna aplicación o servicio en el servidor que dependa o use IPv6.

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT

7. Ejecute el siguiente comando para encontrar y corregir cualquier error de sintaxis.

sudo ip6tables-restore -t /etc/iptables/rules.v6

8. Ahora, recarga el netfilter-persistent servicio para que las reglas de iptables surtan efecto.

sudo service netfilter-persistent reload

9. Ejecute el siguiente comando para guardar las nuevas reglas de iptables.

sudo service netfilter-persistent save

10. Ejecute el siguiente comando para enumerar todas las reglas para IPv4 actualmente en uso.

sudo iptables -S

10. Finalmente, enumere las reglas de iptables para IPv6.

sudo ip6tables -S

Cambiar la dirección IP del servidor DNS de su servidor (condicional)

El bloqueo de todo el tráfico IPv6 puede tener efectos secundarios desfavorables, específicamente si su servidor depende de IPv6 para la resolución de nombres.

En este ejemplo, la configuración de la red se basa en servidores de nombres IPv6 (como 2001:4860:4860::8888 y 2001:4860:4860::8844). Dado que el cortafuegos solo aplica el tráfico IPv4, el sistema no puede buscar servidores de nombres para IPv6.

Por ejemplo, es posible que algunos de sus repositorios APT no funcionen si el firewall bloquea todo el tráfico IPv6. Si intenta volver a ejecutar el sudo apt update comando, es posible que obtenga el siguiente error.

La solución es actualizar su archivo de configuración de red, prefiriendo usar servidores de nombres IPv4 (como 8.8.8.8 y 8.8.4.4).

1. Abra /etc/network/interfaces archivo en un editor de texto.

Los archivos de configuración de la interfaz de red pueden diferir según la distribución o versión de Linux. El siguiente ejemplo es específicamente para Ubuntu 14.04 LTS.

sudo nano /etc/network/interfaces

2. Busque el dns-nameservers directiva. Cambie esta directiva a dns-nameservers 8.8.8.8 8.8.4.4 .

El 8.8.8.8 y el 8.8.4.4 son servidores DNS públicos administrados por Google. Estos servidores DNS públicos son confiables y rápidos. No dude en utilizar otros servidores DNS, como OpenDNS o un DNS IPv4 interno en su organización.

3. Ejecute el siguiente comando para cambiar la interfaz de red de su servidor y usar los nuevos servidores de nombres.

sudo ifdown eth0 && sudo ifup eth0

4. A continuación, abra /etc/apt/apt.conf.d/99force-ipv4 en un editor de texto. Esta configuración predeterminada archiva lo que APT usos para configuraciones persistentes.

sudo nano /etc/apt/apt.conf.d/99force-ipv4

5. Complete el 99force-ipv4 archivo con la siguiente línea. Este valor obligará a APT a utilizar IPv4 para la resolución de nombres. Guarde y salga de 99force-ipv4 .

Acquire::ForceIPv4 "true";

6. Cierre sesión y vuelva a iniciar sesión en su sesión SSH y vuelva a ejecutar el sudo apt update dominio. Ya no debería ver los errores de resolución de nombres.

Agregar exenciones para servicios específicos

Ahora que tiene las reglas de iptables de "permitir todo-denegar todo", ahora puede abrir puertos específicos para ciertos servicios según sea necesario. Por ejemplo, si su servidor aloja o alojará un sitio web, deberá permitir el tráfico del puerto HTTP 80 o del puerto HTTPS 443. Para ello, proceda de la siguiente manera.

1. En la terminal, ejecute el siguiente comando para abrir el puerto TCP 80 para el tráfico HTTP y el puerto 443 para el tráfico HTTPS.

  • El -A El parámetro acepta qué cadena agregar a la regla.
  • El -p El parámetro especifica el tipo de protocolo que aplica la regla.
  • El --dport el valor del parámetro es el número de puerto de destino.
  • El -j El parámetro indica qué acción tomar cuando la regla coincide.
sudo iptables -A TCP -p tcp --dport 80 -j ACCEPT
sudo iptables -A TCP -p tcp --dport 443 -j ACCEPT

2. Ejecute el siguiente comando para verificar que las nuevas reglas ahora son efectivas.

sudo iptables -L -v

Verá sus dos entradas para HTTP y HTTPS, respectivamente.

3. Finalmente, ejecute el siguiente comando para guardar los cambios en las reglas de iptables.

sudo service netfilter-persistent save

Permitir conexiones basadas en la fuente

Iptables también le permite crear reglas para permitir el tráfico de fuentes específicas, como una o más direcciones IP. Por ejemplo, su empresa puede tener tres sitios, cada uno con su dirección IP (por ejemplo, 192.168.1.20, 192.168.1.30 y 192.168.1.40).

Probablemente desee permitir conexiones a su servidor desde cada sitio. Para hacerlo, creará tres reglas separadas con el -s para especificar la fuente específica.

1. Ejecute los siguientes comandos para permitir las conexiones desde tres direcciones IP específicas.

Las direcciones IP a continuación son solo para fines de ejemplo y es posible que no reflejen un escenario del mundo real. Las direcciones IP de sus sitios serán diferentes.

# Allowing connection from 192.168.1.20
sudo iptables -A TCP -s 192.168.1.20 -j ACCEPT
# Allowing connection from 192.168.1.30
sudo iptables -A TCP -s 192.168.1.30 -j ACCEPT
# Allowing connection from 192.168.1.40
sudo iptables -A TCP -s 192.168.1.40 -j ACCEPT

2. Vuelva a ejecutar el siguiente comando para verificar que se agregaron las nuevas reglas.

sudo iptables -L -v

Verá tres entradas para sus tres fuentes específicas, lo que les permitirá conectarse a su servidor.

3. Finalmente, no olvide guardar sus reglas de iptables ejecutando el siguiente comando.

sudo service netfilter-persistent save

Restablecimiento de las reglas de Iptables

Ahora ha configurado con éxito un cortafuegos con reglas de iptables. Pero no todo va según lo planeado todo el tiempo. Pero, ¿y si te equivocas y quieres empezar de nuevo?

Una opción es restablecer todas las reglas de iptables. Para hacerlo, siga los pasos a continuación.

1. Primero, haga una copia de seguridad de sus reglas de iptables existentes. El siguiente comando copia el rules.v4 y reglas.v6 archivos a su directorio de inicio.

sudo cp /etc/iptables/* ~/

2. A continuación, elimine todas las reglas de iptables existentes ejecutando el siguiente comando.

sudo service netfilter-persistent flush

3. Confirme que las reglas ya no existen.

sudo iptables -S

Como puede ver a continuación, solo quedan las reglas predeterminadas de iptables, lo que permite todo. Este comportamiento garantiza que restablecer las reglas no provocará un escenario de bloqueo de acceso de administrador.

Conclusión

A lo largo de este tutorial, aprendió cómo proteger su firewall de Linux con reglas de iptables y cómo configurar exenciones.

Algunos administradores de Linux pueden argumentar que iptables está desactualizado para configurar el firewall de Linux. Pero muchas aplicaciones aún dependen de iptables, lo que podría significar que seguirá siendo un pilar durante muchos años más.

¿Qué opinas del uso de reglas persistentes de iptables? ¿Considerará implementarlo o pasar a opciones más nuevas como el cortafuegos sin complicaciones (UFW)?


Linux
  1. Cómo vaciar las reglas de iptables

  2. Cómo vaciar las reglas de iptables

  3. Cómo:Linux General – IPTables en General

  4. IPTables de Linux:cómo agregar reglas de firewall (con el ejemplo Permitir SSH)

  5. Cómo verificar si iptables se está ejecutando o el firewall está activado

Asegure su red Linux con firewall-cmd

Cómo asegurar servidores Linux con SE Linux

Cómo configurar un cortafuegos con GUFW en Linux

Cómo configurar el cortafuegos con UFW en Ubuntu Linux

Tutorial de firewall de Linux:tablas, cadenas y fundamentos de reglas de IPTables

Cómo configurar un cortafuegos en su servidor Linux