¿Configura algunos puertos de firewall para que solo acepten conexiones de red local?

18

¿Cómo configuro el firewall en un sistema en una LAN para que algunos puertos solo estén abiertos a conexiones desde la red de área local y no desde el mundo exterior?

Por ejemplo, tengo una caja que ejecuta Scientific Linux 6.1 (una distribución basada en RHEL), y quiero que su servidor SSH solo acepte conexiones de localhost o LAN. ¿Cómo hago esto?

hpy
fuente

Respuestas:

24

Con las iptables del kernel completamente vacías ( iptables -F), esto hará lo que le pidas:

# iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

Esto dice que todas las direcciones LAN pueden comunicarse con el puerto TCP 22, que el host local recibe la misma consideración (sí, 127. * no solo 127.0.0.1), y los paquetes de cualquier otra dirección que no coincida con esas dos primeras reglas se dejan caer sin ceremonias El cubo de bits . Puede usar en REJECTlugar de DROPsi desea un rechazo activo (TCP RST) en lugar de convertir el puerto 22 de TCP en un agujero negro para los paquetes.

Si su LAN no usa el bloque 192.168.0. *, Naturalmente necesitará cambiar la IP y la máscara en la primera línea para que coincida con el esquema de IP de su LAN.

Es posible que estos comandos no hagan lo que desea si su firewall ya tiene algunas reglas configuradas. (Diga iptables -Lcomo root para averiguarlo). Lo que sucede con frecuencia es que una de las reglas existentes toma los paquetes que está tratando de filtrar, por lo que agregar nuevas reglas no tiene efecto. Si bien puede usar en -Ilugar de -Acon el iptablescomando para empalmar nuevas reglas en el medio de una cadena en lugar de agregarlas, generalmente es mejor averiguar cómo se llenan las cadenas en el arranque del sistema y modificar ese proceso para que sus nuevas reglas siempre se instalen en El orden correcto.

RHEL 7+

En los sistemas de tipo RHEL recientes, la mejor manera de hacerlo es usar firewall-cmdsu equivalente de GUI. Esto le dice al firewallddemonio del sistema operativo lo que desea, que es lo que realmente llena y manipula lo que ve a través de iptables -L.

RHEL 6 y anteriores

En los sistemas de tipo RHEL más antiguos, la forma más fácil de modificar las cadenas de firewall cuando se ordenan es editar /etc/sysconfig/iptables. Las herramientas de cortafuegos GUI y TUI del sistema operativo son bastante simplistas, por lo que una vez que comience a agregar reglas más complejas como esta, es mejor volver a los viejos archivos de configuración. Tenga cuidado, una vez que comience a hacer esto, corre el riesgo de perder sus cambios si alguna vez usa las herramientas de firewall del sistema operativo para modificar la configuración, ya que es posible que no sepa cómo lidiar con reglas artesanales como estas.

Agregue algo como esto a ese archivo:

-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 192.168.0.0/24 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -s 127.0.0.0/8 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport 22 -j DROP

Donde lo agregas es la parte difícil. Si encuentra una línea en ese archivo hablando --dport 22, simplemente reemplácela con las tres líneas anteriores. De lo contrario, probablemente debería ir antes de la primera línea existente que termina en -j ACCEPT. En general, necesitará familiarizarse con la forma en que funciona iptables , momento en el cual será obvio el punto de inserción correcto.

Guarde ese archivo, luego diga service iptables restartque vuelva a cargar las reglas del firewall. ¡Asegúrate de hacer esto mientras estás conectado a la consola, en caso de que aprietes las ediciones! No desea bloquear su máquina mientras está conectado a través de SSH.

La similitud con los comandos anteriores no es una coincidencia. La mayor parte de este archivo consta de argumentos para el iptablescomando. Las diferencias con respecto a lo anterior son que el iptablescomando se descarta y el INPUTnombre de la cadena se convierte en la cadena especial específica de RHEL RH-Firewall-1-INPUT. (Si desea examinar el archivo con más detalle, verá anteriormente en el archivo donde esencialmente han cambiado el nombre de la INPUTcadena. ¿Por qué? No podría decirlo).

Warren Young
fuente
4

La herramienta de bajo nivel para la configuración del firewall en Linux es iptables . También hay herramientas de nivel superior disponibles. No sé si Scientific Linux tiene una herramienta de firewall recomendada.

De acuerdo con esta página web (no he verificado que se aplica a 6.1), service iptables saveguardará las reglas de firewall actuales, y estas reglas guardadas se cargan en el momento del arranque. Por lo tanto, debe configurar las reglas que desee a través de iptablescomandos (o cualquier otro medio), luego ejecutar service iptables savepara que su configuración sea persistente.

La publicación de blog de Scott Pack es un comienzo para descartar paquetes "extraños" que generalmente no son necesarios y tienen un alto riesgo de ser parte de un ataque. Más allá de eso, querrás cerrar todos los puertos entrantes y abrir solo los que necesites. Algo como esto:

# Accept everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# Accept ICMP
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# Drop oddball packets
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept packets that are part of established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Accept selected incoming connections, e.g. ssh from 10.0.42.x
iptables -A INPUT -p tcp --dport 22 -s 10.0.42.0/24 -j ACCEPT
# Reject incoming connections that aren't explicitly accepted
iptables -A INPUT -j REJECT
Gilles 'SO- deja de ser malvado'
fuente
1
Gilles, ¿no leíste mal la pregunta un poco? Entiendo que la caja Scientific Linux es una de las computadoras en LAN, pero no el firewall.
rozcietrzewiacz
@Gilles Sí, la caja es una de las computadoras en la LAN.
hpy
@rozcietrzewiacz Entiendo que el firewall está en la misma máquina que el servidor. Estoy de acuerdo en que la pregunta es ambigua hasta cierto punto, pero dado que Penyuan solo mencionó el sistema operativo de una máquina, supongo que todo está sucediendo en esa máquina. De lo contrario, esta no sería una pregunta de Unix, sería una pregunta de administrador de red poco especificada.
Gilles 'SO- deja de ser malvado'
1

La forma preferida de hacerlo es con iptables. Parece que otros lo han cubierto adecuadamente, por lo que, solo para completar, señalaré un método de control de acceso alternativo que está disponible para muchos demonios en la mayoría de las distribuciones de Linux. Ese método de control de acceso es proporcionado por la libwrapbiblioteca.

Para verificar si su demonio favorito tiene libwrapsoporte, intente ejecutar lo siguiente:

ldd `which sshd` | grep libwrap

Si obtiene un resultado no vacío, como

libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f84e7b0e000)

entonces definitivamente eres bueno para ir.

Es casi seguro que su sshddemonio tiene libwrapsoporte, por lo que debe consultar los archivos /etc/hosts.allowy /etc/hosts.denypara el control de acceso. Suponiendo que su red LAN local es 192.168.100.0/24, puede denegar el acceso a sshdtodos los clientes, excepto a aquellos en el host local o en la LAN local, poniendo lo siguiente en su /etc/hosts.denyarchivo:

sshd: ALL EXCEPT 127.0.0.0/255.0.0.0, [::1]/128, 192.168.100.0/255.255.255.0

Tenga en cuenta que este método en realidad no abre ni cierra puertos, per se. Simplemente le dice a los demonios que usan este método de control de acceso si aceptar o rechazar los intentos de conexión de clientes que coinciden con los patrones dados.

Para obtener detalles completos, consulte las páginas de manual, comenzando con hosts_access(5).

Steven Monday
fuente
1

Si tiene su propio firewall basado en Linux, será mejor que lo configure iptables, como lo describen otros aquí. Si no es así y el firewall es su enrutador, lo más probable es que la configuración predeterminada ya impida el acceso desde el exterior, a menos que habilite explícitamente el reenvío de puertos (como describí recientemente en respuesta a esta pregunta ).

Para una seguridad adicional por encima de eso, puede usar una subred separada para las conexiones en la LAN. Para hacerlo, agregue una segunda dirección IP para cada computadora que se usaría solo dentro de la LAN y no por el enrutador. Digamos que toda la LAN ahora usa 192.168.0.xxxdirecciones y el enrutador (puerta de enlace, firewall) 192.168.0.1. Agregue una segunda dirección para cada computadora, por ejemplo:

ifconfig eth0:0 192.168.5.1/24

A continuación, edite la sshdconfiguración para usar solo esta dirección (de modo que no permita que se conecten conexiones 192.168.0.xxx): edite /etc/ssh/sshd_configy modifique ListenAddressla de su nueva subred ( 192.168.5.1en el ejemplo anterior). ¡Eso es! Si no configura la puerta de enlace para enrutar la comunicación de esa subred, debe estar separada del exterior.

rozcietrzewiacz
fuente