GNU/Linux >> Tutoriales Linux >  >> Linux

IPTables de Linux:ejemplos de reglas entrantes y salientes (SSH y HTTP)

En nuestro artículo anterior de la serie de cortafuegos IPTables, revisamos cómo agregar una regla de cortafuegos usando "iptables -A".

También explicamos cómo permitir la conexión SSH entrante. En un nivel alto, implica seguir 3 pasos.

  1. Eliminar todas las reglas existentes:“iptables -F”
  2. Permitir solo SSH entrante:"iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT"
  3. Elimine todos los demás paquetes entrantes:"iptables -A INPUT -j DROP"

Lo anterior funciona. Pero no está completo. Un problema con los pasos anteriores es que no restringe los paquetes salientes.

Política de cadena predeterminada

La política por defecto de una cadena es ACEPTAR. Si no sabe lo que significa una cadena, es mejor que lea nuestro artículo de introducción a iptables. Por lo tanto, la política predeterminada de la cadena de ENTRADA y SALIDA es ACEPTAR. En los 3 pasos anteriores, descartamos todos los paquetes entrantes al final (excepto el ssh entrante). Sin embargo, no restringimos el tráfico saliente.

Como verá a continuación, dice "(política ACEPTAR)" junto a los tres nombres de cadena (ENTRADA, SALIDA y ADELANTE). Esto indica que la política de cadena predeterminada es ACEPTAR.

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Entonces, aquí tienes dos opciones.

Opción 1:Añadir reglas de abandono

Al final, agregue las siguientes tres reglas de descarte que descartarán todos los paquetes entrantes, salientes y reenviados (excepto aquellos que se definen arriba de estas tres reglas). Si hace esto, la política de cadena predeterminada sigue siendo ACEPTAR, lo que no debería importar, ya que de todos modos descartará todos los paquetes al final.

iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP

Opción 2:cambiar la política de cadena predeterminada a DROP

Al principio, ejecute los siguientes tres comandos que cambiarán la política predeterminada de la cadena a DROP.

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

Ahora, si agrega la regla allow ssh:"iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT", y hace iptables -L, notará que dice "(policy DROP)" junto a las tres cadenas.

# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy DROP)
target     prot opt source               destination

Pero hay un problema aquí. La regla de permitir conexión entrante ssh ya no funcionará porque todos los paquetes salientes se descartan.

Permitir conexiones entrantes

Cuando la política predeterminada es DROP para cadenas de ENTRADA y SALIDA, para cada regla de firewall entrante, debe especificar las siguientes dos reglas.

  1. Regla de solicitud:esta es la solicitud que proviene del cliente al servidor para la conexión entrante.
  2. Regla de respuesta:Esto es para la respuesta que sale del servidor al cliente (para la solicitud entrante correspondiente).

Ejemplo 1:Permitir conexión SSH entrante

Esto es para permitir la conexión SSH desde el exterior a su servidor. es decir, puede ssh a su servidor desde el exterior.

Esto implica dos pasos. Primero, debemos permitir nuevas conexiones SSH entrantes. Una vez que se permite la conexión ssh entrante, también debemos permitir la respuesta para esa conexión ssh entrante.

Primero, permita la solicitud de conexión SSH entrante, como se muestra a continuación.

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

En el ejemplo anterior:

  • iptables -A INPUT:agregue la nueva regla a la cadena INPUT. Para la solicitud de conexión entrante, siempre tiene que ser ENTRADA.
  • -i eth0:Esto se refiere a la interfaz de entrada. Para conexiones entrantes, esto siempre tiene que ser '-i'.
  • -p tcp:Indica que esto es para el protocolo TCP.
  • –dport 22:se refiere al puerto de destino para la conexión entrante. El puerto 22 es para ssh.
  • -m state:esto indica que se utiliza el módulo de coincidencia "state". Discutiremos más sobre la opción "-m" (y todos los módulos coincidentes disponibles para iptables) en un artículo futuro.
  • –state NUEVO, ESTABLECIDO:Opciones para el módulo de correspondencia de “estado”. En este ejemplo, solo se permiten los estados NUEVO y ESTABLECIDO. La primera vez que se inicia una solicitud de conexión SSH desde el cliente al servidor, se utiliza el estado NUEVO. El estado ESTABLECIDO se utiliza para todas las solicitudes posteriores del cliente al servidor.

A continuación, permita la respuesta de conexión SSH saliente (estado ESTABLECIDO únicamente) (para la solicitud de conexión SSH entrante correspondiente).

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

En el ejemplo anterior:

  • iptables -A OUTPUT:agregue la nueva regla a la cadena OUTPUT. Dado que esto es para la regla de respuesta (para la solicitud entrante correspondiente) que sale del servidor, debería ser SALIDA.
  • -o eth0:Esto se refiere a la interfaz de salida. Para conexiones salientes, esto siempre tiene que ser '-o'.
  • -p tcp:Indica que esto es para el protocolo TCP.
  • –sport 22:se refiere al puerto de origen de la conexión saliente. El puerto 22 es para ssh. Dado que la solicitud entrante (de la regla anterior) llegó al puerto de "destino", la respuesta saliente pasará por el puerto de "origen".
  • -m estado:Esto indica que se utiliza el módulo de coincidencia "estado".
  • –state ESTABLECIDO:Dado que esta es una regla de respuesta, solo permitimos una conexión ESTABLECIDA (y no cualquier conexión NUEVA).

Ejemplo 2:permitir la conexión HTTP entrante

Esto es para permitir la conexión HTTP desde el exterior a su servidor. es decir, puede ver su sitio web ejecutándose en el servidor desde el exterior.

Al igual que las reglas de entrada de SSH anteriores, esto también implica dos pasos. Primero, debemos permitir la nueva conexión HTTP entrante. Una vez que se permite la conexión HTTP entrante, debemos permitir la respuesta para esa conexión HTTP entrante.

Primero, permita la solicitud de conexión HTTP entrante, como se muestra a continuación.

iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

A continuación, permita la respuesta de conexión HTTP saliente (solo ESTABLECIDA) (para la solicitud de conexión SSH entrante correspondiente).

iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Nota:En la regla de solicitud y respuesta HTTP anterior, todo es igual que el ejemplo de SSH excepto el número de puerto.

Permitir conexiones salientes

Cuando la política predeterminada es DROP para las cadenas de ENTRADA y SALIDA, para cada regla de firewall saliente, debe especificar las siguientes dos reglas.

  1. Regla de solicitud:esta es la solicitud que sale del servidor al exterior para la conexión saliente.
  2. Regla de respuesta:Esto es para la respuesta que regresa desde el exterior al servidor (para la solicitud saliente correspondiente).

Ejemplo 3:Permitir conexión SSH saliente

Esto es para permitir la conexión SSH desde su servidor al exterior. es decir, puede enviar ssh a un servidor externo desde su servidor.

Esto implica dos pasos. Primero, debemos permitir la nueva conexión SSH saliente. Una vez que se permite la conexión ssh saliente, también debemos permitir la respuesta para esa conexión ssh saliente.

Primero, permita la solicitud de conexión SSH saliente, como se muestra a continuación.

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

En el ejemplo anterior:

  • iptables -A OUTPUT:agregue la nueva regla a la cadena OUTPUT. Para la solicitud de conexión saliente, siempre tiene que ser SALIDA.
  • -o eth0:Esto se refiere a la interfaz de salida. Para conexiones salientes, esto siempre tiene que ser '-o'.
  • -p tcp:Indica que esto es para el protocolo TCP.
  • –dport 22:se refiere al puerto de destino para la conexión saliente.
  • -m estado:Esto indica que se utiliza el módulo de coincidencia de "estado".
  • –state NUEVO, ESTABLECIDO:Opciones para el módulo de correspondencia de “estado”. En este ejemplo, solo se permiten los estados NUEVO y ESTABLECIDO. La primera vez que se inicia una solicitud de conexión SSH desde el servidor hacia el exterior, se utiliza el estado NUEVO. El estado ESTABLECIDO se utiliza para todas las solicitudes posteriores del servidor al exterior.

A continuación, permita la respuesta de conexión SSH saliente (solo ESTABLECIDA) (para la solicitud de conexión SSH entrante correspondiente).

iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

En el ejemplo anterior:

  • iptables -A INPUT:agregue la nueva regla a la cadena INPUT. Dado que esto es para la regla de respuesta (para la solicitud saliente correspondiente) que viene del exterior al servidor, debe ser ENTRADA.
  • -i eth0:Esto se refiere a la interfaz de entrada. Para conexiones entrantes, esto siempre tiene que ser '-i'.
  • -p tcp:Indica que esto es para el protocolo TCP.
  • –sport 22:se refiere al puerto de origen de la conexión entrante. Dado que la solicitud saliente (de la regla anterior) fue al puerto "destino", la respuesta entrante vendrá del puerto "origen".
  • -m estado:Esto indica que se utiliza el módulo de coincidencia "estado".
  • –state ESTABLECIDO:Dado que esta es una regla de respuesta, solo permitimos una conexión ESTABLECIDA (y no cualquier conexión NUEVA).

Poniéndolo todo junto

Cree un script de shell rules.sh que haga lo siguiente:

  1. Eliminar todas las reglas existentes
  2. Establecer políticas de cadena predeterminadas
  3. Permitir SSH entrante
  4. Permitir HTTP entrante
  5. Permitir SSH saliente

Primero, crea las reglas.sh

$ vi rules.sh
# 1. Delete all existing rules
iptables -F

# 2. Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# 3. Allow incoming SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

# 4. Allow incoming HTTP
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

# 5. Allow outgoing SSH
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

A continuación, ejecute rules.sh y vea las reglas.

# chmod u+x rules.sh

# ./rules.sh

# iptables -L
Chain INPUT (policy DROP)
target     prot opt source      destination
ACCEPT     tcp  --  anywhere    anywhere      tcp dpt:ssh state NEW,ESTABLISHED
ACCEPT     tcp  --  anywhere    anywhere      tcp dpt:http state NEW,ESTABLISHED
ACCEPT     tcp  --  anywhere    anywhere      tcp spt:ssh state ESTABLISHED 

Chain FORWARD (policy DROP)
target     prot opt source      destination         

Chain OUTPUT (policy DROP)
target     prot opt source      destination
ACCEPT     tcp  --  anywhere    anywhere      tcp spt:ssh state ESTABLISHED
ACCEPT     tcp  --  anywhere    anywhere      tcp spt:http state ESTABLISHED
ACCEPT     tcp  --  anywhere    anywhere      tcp dpt:ssh state NEW,ESTABLISHED

Usando esto como base, debería poder escribir sus propias reglas de firewall de iptables entrantes y salientes. Hay mucho más que cubrir en IPTables. ¡Estén atentos!

Artículos anteriores de la serie iptables:

  • Tutorial de cortafuegos de Linux:tablas IPTables, cadenas, fundamentos de reglas
  • IPTables Flush:eliminar/eliminar todas las reglas en RedHat y CentOS Linux
  • IPTables de Linux:cómo agregar reglas de firewall (con el ejemplo Permitir SSH)

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

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

  3. CentOS / RHEL:Cómo bloquear puertos entrantes y salientes usando iptables

  4. Ejemplos de comandos mkdir y rmdir en Linux

  5. Ejemplos de comandos swapon y swapoff en Linux

Establecer una conexión SSH entre Windows y Linux

19 comandos SSH comunes en Linux con ejemplos

Comandos SSH en Linux con ejemplos de uso

Opciones de comando y ejemplos de Tee Command en Linux

50 ejemplos simples y útiles del comando Buscar en Linux

16 Ejemplos Prácticos y Útiles del Comando Echo en Linux