GNU/Linux >> Tutoriales Linux >  >> Linux

¿Depuración de iptables y trampas comunes de firewall?

Solución 1:

En general:

Ver y modificar la configuración del firewall requiere privilegios de administrador (root ) al igual que los servicios de apertura en el rango de número de puerto restringido. Eso significa que debe iniciar sesión como root o alternativamente use sudo para ejecutar el comando como root. Intentaré marcar dichos comandos con el [sudo] opcional .

Contenido:

  1. El orden importa o la diferencia entre -I y -A
  2. Mostrar la configuración actual del cortafuegos
  3. Interpretando la salida de iptables -L -v -n
  4. Conoce tu entorno
  5. Las cadenas INPUT y FORWARD
  6. Módulos del núcleo

1. El orden importa o la diferencia entre -I y -A

Lo que debe recordar es que las reglas del firewall se verifican en el orden en que aparecen. El núcleo dejará de procesar la cadena cuando se active una regla que permita o no permita un paquete o una conexión.

Creo que el error más común para los administradores de cortafuegos novatos es que sigan las instrucciones correctas para abrir un nuevo puerto, como el siguiente:

[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT

y luego descubra que no surtirá efecto.

La razón de esto es que el -A opción agrega esa nueva regla, después de todas las reglas existentes y dado que muy a menudo la regla final en el firewall existente era la que bloqueaba todo el tráfico que no estaba explícitamente permitido, lo que resultaba en

...
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
8        0  0    ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080

O equivalente en iptables-save:

...
iptables -A INPUT  -j REJECT
iptables -A INPUT  -p tcp --dport 8080 -j ACCEPT

y nunca se alcanzará la nueva regla que abre el puerto TCP 8080. (como lo demuestran los contadores que permanecen obstinadamente en 0 paquetes y cero bytes).

Insertando la regla con -I la nueva regla habría sido la primera de la cadena y funcionará.

2. Mostrar la configuración actual del cortafuegos

Mi recomendación para el administrador del cortafuegos es que observe la configuración real que ejecuta el kernel de Linux, en lugar de tratar de diagnosticar los problemas del cortafuegos con herramientas fáciles de usar. A menudo, una vez que comprende los problemas subyacentes, puede resolverlos fácilmente en un asunto respaldado por esas herramientas.

El comando [sudo] iptables -L -v -n es tu amigo (aunque a algunas personas les gusta iptables-save mejor). A menudo, cuando se habla de configuraciones, es útil usar el --line-numbers opción también a las rectas numéricas. Hacer referencia a la regla #X hace que discutirlas sea un poco más fácil.
Nota: Las reglas NAT están incluidas en el iptables-save salida, pero debe enumerarse por separado agregando el -t nat opción, es decir, [sudo] iptables -L -v -n -t nat --line-numbers .

Ejecutar el comando varias veces y verificar los contadores en aumento puede ser una herramienta útil para ver si realmente se activa una nueva regla.

[[email protected] ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     784K   65M fail2ban-SSH  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
2    2789K  866M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3       15  1384 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain fail2ban-SSH (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       117.239.37.150       0.0.0.0/0           reject-with icmp-port-unreachable
2        4   412 REJECT     all  --  *      *       117.253.208.237      0.0.0.0/0           reject-with icmp-port-unreachable

Alternativamente, la salida de iptables-save proporciona un script que puede regenerar la configuración del cortafuegos anterior:

[[email protected] ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT

Es una cuestión de preferencia lo que le resulte más fácil de entender.

3. Interpretando la salida de iptables -L -v -n

La política establece la acción predeterminada que utiliza la cadena cuando no coincide ninguna regla explícita. En el INPUT cadena que está configurada para ACEPTAR todo el tráfico.

La primera regla en la cadena INPUT es inmediatamente interesante, envía todo el tráfico (origen 0.0.0.0/0 y destino 0.0.0.0/0) destinado al puerto TCP 22 (tcp dpt:22 ) el puerto predeterminado para SSH a un objetivo personalizado (fail2ban-SSH ).Como su nombre lo indica, esta regla la mantiene fail2ban (un producto de seguridad que, entre otras cosas, escanea los archivos de registro del sistema en busca de posibles abusos y bloquea la dirección IP del abusador).

Esa regla habría sido creada por una línea de comando de iptables similar a iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH o se encuentra en la salida de iptables-save as -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH . A menudo encontrará cualquiera de esas anotaciones en la documentación.

Los contadores indican que esta regla ha acertado 784'000 paquetes y 65 Megabytes de datos.

El fail2ban-SSH procesa el tráfico que coincide con esta primera regla. cadena que, como cadena no estándar, aparece debajo de la cadena OUTPUT.

Esa cadena consta de dos reglas, una para cada abusador (dirección IP de origen 117.253.221.166 o 58.218.211.166) que está bloqueado (con un reject-with icm-port-unreachable ).

 -A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
 -A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable

Los paquetes SSH que no provienen de esos hosts bloqueados no están ni permitidos ni no permitidos todavía y ahora que la cadena personalizada está completa se compararán con la segunda regla en la cadena INPUT.

Todos los paquetes que no estaban destinados al puerto 22 pasaron la primera regla en la cadena INPUT y también se evaluarán en la regla INPUT #2.

La regla INPUT número 2 significa que se trata de un cortafuegos con estado , que rastrea las conexiones. Eso tiene algunas ventajas, solo los paquetes para nuevas conexiones deben verificarse con el conjunto completo de reglas, pero una vez permitidos, los paquetes adicionales que pertenecen a una conexión establecida o relacionada se aceptan sin más verificación.

La regla de entrada #2 coincide con todas las conexiones abiertas y relacionadas y los paquetes que coincidan con esa regla no necesitarán ser evaluados más.

Nota: los cambios de reglas en la configuración de un cortafuegos con estado solo afectarán a las conexiones nuevas, no a las conexiones establecidas.

Por el contrario, un filtro de paquetes simple prueba cada paquete contra el conjunto completo de reglas, sin rastrear el estado de la conexión. En tal cortafuegos ningún estado se utilizarían palabras clave.

La regla INPUT #3 es bastante aburrida, todo el tráfico se conecta al loopback (lo o 127.0.0.1) se permite la interfaz.

Las reglas de ENTRADA 4, 5 y 6 se utilizan para abrir los puertos TCP 22, 80 y 443 (los puertos predeterminados para respectivamente SSH, HTTP y HTTPS) otorgando acceso a NUEVAS conexiones (las conexiones existentes ya están permitidas por la regla de ENTRADA 2).

En un cortafuegos sin estado, esas reglas aparecerían sin los atributos de estado:

4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0

o

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

La regla de ENTRADA final, #7 es una regla que bloquea todo el tráfico al que NO se le otorgó acceso en las reglas de ENTRADA 1-7. Una convención bastante común:se niega todo lo que no está permitido. En teoría, esta regla podría haberse omitido configurando la POLÍTICA predeterminada en RECHAZAR.

Investigue siempre toda la cadena.

4. Conoce tu entorno

4.1. La configuración en un firewall de software no afectará la configuración de seguridad mantenida en otra parte de la red, es decir, a pesar de abrir un servicio de red con iptables las listas de control de acceso no modificadas en los enrutadores u otros firewalls en su red aún pueden bloquear el tráfico...

4.2. Cuando no hay ningún servicio escuchando, no podrá conectarse y obtendrá un error de conexión rechazada, independientemente de la configuración del firewall. Por lo tanto:

  • Confirme que un servicio está escuchando (en la interfaz de red/dirección IP correcta) y usando los números de puerto que espera con [sudo] netstat -plnut o alternativamente use ss -tnlp .
  • Si aún no se supone que sus servicios se estén ejecutando, emule un oyente simple con, por ejemplo, netcat:[sudo] nc -l -p 123 o openssl s_server -accept 1234 [options] si necesita un agente de escucha TLS/SSL (marque man s_server para ver las opciones).
  • Verifique que pueda conectarse desde el propio servidor, es decir, telnet <IP of Server> 123 o echo "Hello" | nc <IP of Server> 123 o al probar el servicio seguro TLS/SSL openssl s_client -connect <IP of Server>:1234 , antes de intentar lo mismo desde un host remoto.

4.3. Comprenda los protocolos utilizados por sus servicios. No puede habilitar/deshabilitar adecuadamente los servicios que no comprende lo suficiente. Por ejemplo:

  • ¿Se usa TCP o UDP o ambos (como con DNS)?
  • ¿El servicio utiliza un puerto predeterminado fijo (por ejemplo, algo como el puerto TCP 80 para un servidor web)?
  • alternativamente, ¿se elige un número de puerto dinámico que puede variar (es decir, servicios RPC como NFS clásico que se registran con Portmap)?
  • el infame FTP incluso usa dos puertos , tanto un número de puerto fijo como dinámico cuando se configura para usar el modo pasivo...
  • las descripciones de servicio, puerto y protocolo en /etc/services no necesariamente coinciden con el servicio real usando un puerto.

4.4. El filtro de paquetes del núcleo no es lo único que puede restringir la conectividad de la red:

  • SELinux también podría estar restringiendo los servicios de red. getenforce confirmará si SELinux se está ejecutando.
  • Aunque se vuelven un poco oscuros, los TCP Wrappers siguen siendo una herramienta poderosa para reforzar la seguridad de la red. Verifique con ldd /path/to/service |grep libwrap y el /hosts.[allow|deny] archivos de control.

5. INPUT o FORWARD Cadenas

El concepto de cadenas se explica más detalladamente aquí, pero en pocas palabras:

El INPUT La cadena es donde abre y/o cierra los puertos de red para los servicios que se ejecutan localmente, en el host donde emite los comandos de iptables.

El FORWARD La cadena es donde aplica reglas para filtrar el tráfico que el kernel reenvía a otros sistemas, sistemas reales, pero también contenedores Docker y servidores de servidores virtuales invitados cuando su máquina Linux actúa como puente, enrutador, hipervisor y/o traducción de direcciones de red. y redirección de puertos.

Un concepto erróneo común es que, dado que un contenedor docker o un invitado KVM se ejecuta localmente, las reglas de filtro que se aplican deben estar en la cadena INPUT, pero ese no suele ser el caso.

6. Módulos del núcleo

Dado que el filtro de paquetes se ejecuta dentro del kernel de Linux, también se puede compilar como un módulo dinámico, en realidad, varios módulos. La mayoría de las distribuciones incluyen netfilter como módulos y los módulos de netfilter requeridos se cargarán en el kernel según sea necesario, pero para algunos módulos, un administrador de firewall deberá asegurarse manualmente de que se carguen. Esto se refiere principalmente a los módulos de seguimiento de conexión, como nf_conntrack_ftp que se puede cargar con insmod .

Los módulos cargados actualmente en el kernel en ejecución se pueden mostrar con lsmod .

El método para garantizar que los módulos se carguen de forma persistente durante los reinicios depende de la distribución de Linux.

Solución 2:

Iptables/Cortafuegos "introducción"

Un Firewall es básicamente un filtro de red basado en políticas. Los cortafuegos de Linux están construidos alrededor de Netfilter; el marco de procesamiento de paquetes de red del kernel que está compuesto por varios módulos del kernel que realizan tareas específicas:

  1. El módulo FILTRO (siempre cargado de forma predeterminada) nos permite principalmente ACEPTAR o DESCARTAR paquetes IP en función de ciertos criterios coincidentes.
  2. El conjunto de módulos NAT nos permite realizar traducciones de direcciones de red (SNAT, DNAT, MASQUERADE).
  3. El módulo MANGLE nos permite alterar ciertos campos de paquetes IP (TOS, TTL).

Los usuarios configuran el marco de Netfilter para satisfacer sus necesidades de firewall utilizando iptables desde la línea de comandos. Con iptables definimos reglas que indican al núcleo qué hacer con los paquetes IP cuando llegan, pasan o salen de nuestra caja de Linux. Cada proceso principal de Netfilter está representado por una TABLA (FILTRO, NAT, MANGLE) en la jerga de iptables. Tienen varios puntos de enganche específicos en el mapa de flujo de paquetes de la red donde el kernel los invoca para realizar sus funciones. y POSTROUTING. Es fácil de recordar si asociamos una TABLA con un "tipo de proceso" y una CADENA con la "ubicación" en el mapa de flujo de paquetes de red donde se invocan las instancias de esos procesos.

Dado que un paquete IP se recibe en una interfaz de red o se crea mediante un proceso local, hasta que finalmente se entrega o descarta, el motor de Netfilter probará y aplicará secuencialmente las reglas contenidas en el mapa de flujo de paquetes de red. En cada bloque identificado por un par [email protected], el usuario puede agregar una o más de estas reglas consecutivas que contienen un criterio de coincidencia de paquetes IP y un curso de acción correspondiente. Hay acciones (es decir, ACCEPT, DROP, etc.) que pueden ser realizadas por más de una TABLE y otras acciones (es decir, SNAT, DNAT, etc.) que son específicas de TABLE.

es decir, cuando un paquete IP llega desde una interfaz de red, primero es procesado por la cadena PREROUTING invocando las reglas definidas por el usuario de la tabla MANGLE, si las hay. Si no hay reglas que coincidan con el paquete actual, se aplica el curso de acción o "política" predeterminado correspondiente de [email protected]. En este punto, si el paquete no se ha descartado, el proceso continuará invocando las reglas de la tabla NAT en la cadena PREROUTING (ver el mapa) y así sucesivamente. Para facilitar el diseño de las reglas, los usuarios también pueden crear sus propias cadenas personalizadas. y "salta" hacia ellos desde diferentes puntos del mapa como desees.

Si bien las cadenas integradas pueden tener políticas definidas por el usuario de ACEPTAR o DESCARTAR paquetes, las cadenas definidas por el usuario siempre tienen una política predeterminada inmutable de RETORNO a la persona que llama para continuar con el proceso.

Comandos de Iptables

Los comandos principales de iptables completan el mapa de flujo de paquetes de red con las reglas de procesamiento requeridas.

La regla genérica de iptables se puede escribir como:

# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>

Podría leerse como:

Netfilter (kernel module) please <Add/Insert/Delete> this rule for <table> at <CHAIN> where packets matching <PKT_MATCHING_CRITERIA> have to be <ACTION>ed

<table>
  -t filter       (the filter table is assumed when omitted)
  -t nat
  -t mangle 

<Add/Insert/Delete>
  -A              (append rule at the end of the chain list)
  -I              (insert rule at the begining of the chain list)
  -D              (Delete rule)

<CHAIN>
  PREROUTING
  INPUT
  FORWARD
  OUTPUT
  POSTROUTING
  USER_DEFINED_CHAIN

<PKT_MATCHING_CRITERIA>
ISO Level-2 matching:
  -i [!] <if_name>    or --in-interface [!] <if_name>
          (OUTPUT and POSTROUTING chains cannot match on input  interfaces)
  -o [!] <if_name>    or --out-interface [!] <if_name>
          (INPUT  and PREROUTING  chains cannot match on output interfaces) 
    -mac-source [!] <xx-xx-xx-xx-xx-xx>
            (OUTPUT and POSTROUTING chains cannot match on input  interfaces)

ISO Level-3 matching:
  -s [!] <src_ip>     or --src [!] <src_ip>   or --source [!] <src_ip>
  -d [!] <dst_ip>     or --src [!] <dst_ip>   or --destination [!] <dst_ip>

ISO Level-4 matching:
  -p [!] <prot_name>    or --protocol [!] <prot_name>  (udp|tcp|icmp)

  Also available when ICMP protocol is defined
  --icmp-type [!] <icmp_type>

  Also available when UDP protocol is defined
  --source-port [!] <udp_src_port>      or --sport [!] <udp_src_port>
  --destination-port [!] <udp_dst_port> or --dport [!] <udp_dst_port>

  Also available when TCP protocol is defined
  --source-port [!] <tcp_src_port>      or --sport [!] <tcp_src_port>
  --destination-port [!] <tcp_dst_port> or --dport [!] <tcp_dst_port>
  --tcp-flags [!] <tcp_flags>   (SYN|ACK|FIN|RST|URG|PSH|ALL|NONE)
    --syn
  --tcp-option [!] <tcp_option#>

  --state [!] <state>
  -m <match> [options]

    note: [!] = negation operator

<ACTION>                (also called TARGET)
  -j ACCEPT             (process continues with rules of the next table in map)
  -j DROP               (discard current packet)
  -j REJECT             (discard current packet with ICMP notification)
      option:
      --reject-with <reject_type>
  -j USER_DEFINED_CHAIN   (start traversing USER_DEFINED_CHAIN rules)
  -j RETURN               (return from USER_DEFINED_CHAIN)
  -j LOG                  (log to syslog, then process next rule in table)
      options:
      --log-level <level>
      --log-prefix <prefix>
      --log-tcp-sequence
      --log-tcp-options
      --log-ip-options
      --log-uid

nat table specific
  -j SNAT             (rewrite the source IP address of the packet)
      option:
      --to <ip_address>
  -j SAME             (idem SNAT; used when more than one source address)
      options:
      --nodst 
      --to <a1-a2>
  -j MASQUERADE       (idem SNAT; used when the replace IP is dynamic)
  -j DNAT             (rewrite the destination IP address of the packet)
      option:
      --to <ip_address>
  -j REDIRECT         (rewrite dst IP to 127.0.0.1, PREROUTING and OUTPUT only)
      option:
      –-to-port <port#>

mangle table specific
  -j ROUTE            (explicitly route packets, valid at PREROUTING)
      options:
      --iface <iface_name>
      --ifindex <iface_idx>
  -j MARK             (set Netfilter mark values)
      options:
      --set-mark <value>
      --and-mark <value>
      --or-mark <value> 
  -j TOS              (set the IP header Type of Service field) 
      option:
      --set-tos <value>
  -j DSCP             (set the IP header Differentiated Services Field)
      options:
      --set-dscp <value>
      --set-dscp-class <class>
  -j TTL              (set the IP header Time To Live field)
      options:
      --ttl-set <value>
      --ttl-dec <value>
      --ttl-inc <value>

Los comandos auxiliares de iptables completan el escenario configurando condiciones predeterminadas, reglas de listado, reglas de vaciado, etc.

#iptables -t <table> -L             
       (Lists the <table> rules in all chains)
#iptables -t <table> -L <CHAIN>     
       (Lists the <table> rules in <CHAIN>)

#iptables -t <table> -N <CHAIN>     
       (Creates a user-defined <CHAIN> for holding <table> rules)
#iptables -t <table> -E <CHAIN> <NEWCHAIN>  
       (Renames <CHAIN> that holds <table> rules to <NEWCHAIN>)

#iptables -t <table> -X   
       (Deletes all user-defined chains created for holding <table> rules)
#iptables -t <table> -X <CHAIN>
       (Deletes user-defined <CHAIN> created for holding <table> rules)

#iptables -t <table> -P <CHAIN> <ACTION>     where <ACTION> = ACCEPT|DROP
       (Sets the default policy of <table> rules at <CHAIN> to <ACTION>)

#iptables -t <table> -F             
       (Flushes (deletes) all <table> rules in all chains)
#iptables -t <table> -F <CHAIN>
       (Flushes (deletes) all <table> rules in <CHAIN>)

#iptables -t <table> -R <CHAIN> <INDEX> <NEWRULE>
       (Replaces <table> rule at position <INDEX> in <CHAIN> with <NEWRULE>

Iptables carga nuestros comandos en el motor de Netfilter en tiempo de ejecución, Netfilter aplica de inmediato las reglas y configuraciones cargadas, pero no son persistentes. Después de reiniciar, se perderán todas las reglas y configuraciones de Netfilter cargadas previamente. Por esta razón, existen utilidades de iptables que permiten guardar el conjunto de reglas actualmente activo en un archivo y volver a cargarlo más tarde.

#iptables-save > fileName
      (Save the currently active Netfilter ruleset to fileName)

#iptables-restore < fileName
      (Restore Netfilter ruleset to the one saved in fileName)

Resumen de Iptables

Netfilter es un marco extremadamente flexible y poderoso, pero hay que pagar un precio por él; Iptables es complejo. Desde el punto de vista del usuario, ciertos términos como TABLE, CHAIN, TARGET realmente no coinciden muy bien con el concepto que representan y no tienen mucho sentido al principio. El tema es largo, los comandos parecen tener una lista interminable de parámetros. Para empeorar las cosas, no hay un solo libro que realmente domine Iptables. En su mayoría se dividen en dos categorías:"libro de recetas" o "libro de páginas de manual". Creo que esta introducción le brinda una instantánea del panorama de Netfilter/Iptables más la dosis necesaria de material de página de manual predigerido. Si es nuevo en iptables, después de leer estos párrafos un par de veces estará listo para leer ejemplos de iptables. Con un poco de práctica, pronto te encontrarás escribiendo tus propias reglas.

Cortafuegos

Un firewall está diseñado principalmente para permitir o denegar dinámicamente el tráfico de red en función de un conjunto de reglas. En este punto, es fácil entender por qué el marco Linux Netfilter/Iptables es perfecto para la construcción de cortafuegos. Mirando el mapa de flujo de paquetes de red, encontramos dos puntos particularmente interesantes en la tabla FILTER en las cadenas INPUT y FORWARD; Podemos decidir allí sobre la dirección IP de origen, el protocolo IP (UDP/TCP), el puerto de destino (80, 21, 443, etc.), etc., si ACEPTAMOS, RECHAZAMOS o simplemente ABANDONAMOS un paquete IP en particular. Esto es lo que hace un firewall el 80% del tiempo cuando, por ejemplo, protege un servidor web de solicitudes de red no autorizadas. El otro 20% del tiempo está manipulando paquetes de red (NAT, MANGLE).

Escenarios de cortafuegos

Hay cientos de diseños de firewall diferentes que abordan diferentes necesidades, pero 3 de ellos podrían considerarse los escenarios de firewall más típicos.

  1. Simple servidor web con una o más interfaces conectadas a Internet. La política incluye reglas básicas para permitir el acceso entrante restringido, el acceso saliente sin restricciones y reglas contra la suplantación de identidad. El reenvío de IP está desactivado.
  2. Este cortafuegos se conecta a Internet ya un área interna protegida. La política incluye reglas básicas para permitir el acceso entrante restringido, el acceso saliente sin restricciones y reglas contra la suplantación de identidad. Dado que el área protegida utiliza direcciones IP privadas, se necesita NAT de origen. El reenvío de IP está activado.
  3. Este firewall se conecta a Internet, área interna protegida y desmilitarizada. La política incluye reglas básicas para permitir el acceso entrante restringido, el acceso saliente sin restricciones y reglas contra la suplantación de identidad. Dado que las áreas protegidas y DMZ usan direcciones IP privadas, necesitan NAT de origen y destino. El reenvío de IP está activado.

He escrito esto para:http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html

Solución 3:

Problemas comunes con diferentes protocolos

DNS: El DNS usa el puerto 53 UDP de forma predeterminada, pero los mensajes que no caben en un único datagrama UDP se transmitirán mediante TCP (por lo general, transferencias de zona y demás), lo que requiere que también se abra el puerto 53 TCP cuando ejecuta un servidor de nombres.

Correo electrónico: Muchos ISP de consumo bloquean el tráfico SMTP (o al menos el puerto predeterminado TCP 25), lo que hace imposible recibir o enviar correos electrónicos directamente y sus clientes se ven obligados a utilizar el relé SMTP del ISP para todos los correos electrónicos salientes y, a veces, también para los correos electrónicos entrantes. §1.1.

FTP: FTP es un protocolo extraño en el sentido de que dos Se utilizan conexiones. La primera es la conexión de control, de manera predeterminada, un servidor FTP escuchará en el puerto TCP 21 para eso. La conexión de control se usa para autenticación y emisión de comandos. Las transferencias de archivos reales y cosas como la salida de una lista de directorios pasan por una segunda conexión TCP, la conexión de DATOS . En el FTP activo, esa conexión de DATOS se iniciaría desde el servidor FTP desde el puerto TCP 20 y se conectaría al cliente FTP. El FTP activo no funciona demasiado bien con usuarios detrás de firewalls y puertas de enlace NAT, por lo que en su mayoría ha caído en desuso. La mayoría de los servidores FTP admite FTP pasivo en su lugar. Con el FTP pasivo, el servidor FTP abre una escucha para la conexión de DATOS en un segundo puerto, al que luego se puede conectar el cliente FTP. El problema de un cortafuegos es que el puerto de DATOS puede ser cualquier puerto sin privilegios disponible entre 1024 y 65536.

En un cortafuegos sin estado que normalmente se resuelve restringiendo la cantidad de puertos pasivos que el servidor FTP puede asignar y luego abriendo explícitamente esos puertos. es decir,

iptables -A INPUT -p tcp --match multiport --dports 21000:21050 -j ACCEPT

En un cortafuegos con estado, no necesita abrir explícitamente el puerto de DATOS, el módulo de ayuda de netfilter reconocerá el puerto dinámico que se asigna y abrirá dinámicamente ese puerto para el cliente correcto marcando la conexión de DATOS como RELATED después de lo cual coincidirá con la regla genérica:

  iptables -I INPUT -p tcp -m state ESTABLISHED,RELATED -j ACCEPT

Esto requiere que el módulo kernel correcto se carga, en el caso de FTP manualmente ejecutando, por ejemplo, insmod nf_conntrack_ftp , hacer que la persistencia dependa del reinicio depende de la distribución.

Nota: El módulo de seguimiento de la conexión FTP fallará cuando se utilice FTP con SSL, ya que la conexión de control se cifrará y nf_conntrack_ftp ya no podrá leer la respuesta PASV.

NFS y servicios RPC similares: El problema con los servicios RPC es que, por diseño, no utilizan un puerto fijo específico. Pueden elegir cualquier puerto disponible al azar, que luego se registrará con el demonio RPC Portmap. Un cliente que intente conectarse consultará el demonio Portmap y luego se conectará directamente al puerto correcto. Eso resolvió el problema de quedarse sin puertos reservados...

Desde la perspectiva del firewall, se debe abrir el puerto TCP/UDP 111 y el puerto real que el servicio RPC está usando actualmente. El problema de abrir un puerto aleatorio en un firewall generalmente se resuelve restringiendo el servicio RPC, como NFS. servidor, para usar un puerto fijo predeterminado.


Linux
  1. Cómo agregar reglas de iptables personalizadas en CSF Firewall

  2. Bloqueo de listas negras de hosts e iptables

  3. Un simple script de firewall de iptables para bloquear todos los puertos excepto el puerto 80 y dar el puerto 22 a ciertas ip

  4. ¿Iptables y proxies transparentes?

  5. Diferencias entre cortafuegos de hardware y software

Cómo configurar el cortafuegos de iptables en Linux

Cómo instalar y configurar el cortafuegos Utangle

Solución de problemas y trampas de SELinux

Cómo configurar el firewall de Iptables en CentOS

Los 5 mejores cortafuegos de Linux

Problemas comunes del servidor y soluciones