¿Cómo garantizar que el puerto SSH solo esté abierto a una dirección IP específica?

42

Este es mi /etc/sysconfig/iptables:

Tiene dos puertos abiertos: 80 apache y 22 para ssh.

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Para el puerto 22 (SSH) quiero asegurarme de que nadie pueda conectarse a este puerto, excepto una dirección IP específica.

ejemplo ip:

1.2.3.4

Haga caso omiso de cualquier supervisión / inquietud con respecto a si mi ip cambia y ya no puedo enviar SSH a mi servidor.

Comunidad
fuente

Respuestas:

47

Si recibo la pregunta de manera correcta, desea que su servidor sea accesible solo desde una dirección IP específica en el puerto 22, puede actualizar Iptables para esto:

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

En ese caso, está abriendo el puerto ssh solo a YourIP, si necesita abrir DNS para su red interna:

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT

Una vez que los haya agregado y abierto para esas IP, debe cerrar la puerta para el resto de IP

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP

(Asegúrese de establecer las reglas en la posición correcta en su conjunto de reglas. iptables -A INPUTAgregará las reglas al final de la INPUTforma actual).

o como dijo joel , puedes agregar una regla en su lugar:

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

o simplemente puede establecer la política predeterminada en el firewall con

iptables -P INPUT DROP

En resumen, como se presenta en esta pregunta sobre SO :

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
Networker
fuente
2
También vale la pena señalar que iptablesadmite la inversión con el operador de explosión en caso de que desee hacer un objetivo DROP. Ejemplo:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley
1
Además, los incondicionales DROPno son realmente necesarios, simplemente puede configurar la política predeterminada en el firewall iptables -P INPUT DROPy dejar que funcione. Probablemente también desee hacerlos como un anexo si lo hace de esta manera, de lo contrario, todo el tráfico será atrapado por el DROPy nunca alcanzará su ACCEPTregla.
Bratchley
1
Esto no funcionó para mí porque el valor predeterminado para -I (insertar) es insertar como regla n. ° 1, por lo que el DROP se inserta como regla n. ° 1 y se evalúa primero y, por lo tanto, descarta todos los paquetes ssh, sin evaluar nunca la regla ACEPTAR. Debe ejecutar iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPy iptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROPEl "3" después de INPUT significa insertar como INPUT rule # 3 (suponiendo que está insertando dos ACCEPTS, de lo contrario, si solo acepta un ACCEPT, use "2" para INPUT.
Kevin Triplett
@Networker Using -Iinsertará las nuevas reglas de iptables en la parte superior. Como tal, puede terminar insertando su caída antes de su permiso. Sugiero usar en su -Alugar
BlueCacti
1
bueno, me encerré, gj
ngwdaniel
6

Aunque recomiendo usar claves SSH, te daré una explicación.

No tiene que usar IPtables para lo que está tratando de lograr, hay varias formas. Esta es la forma de IPtables:

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

[YOUR_HOME_IP] = La IP de su casa (bastante sencilla)

[SSH_PORT] = El puerto en el que ejecuta SSH (por defecto 22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

Esto asegura que nadie, excepto su IP, pueda iniciar sesión en SSH.

Hay otra forma, que es agregar algo al sshd_config.

Agregue lo siguiente:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

Esto le permite iniciar sesión en SSH como rootusuario desde su IP sin solicitar una contraseña.

Tenga en cuenta que un cronjob con

iptables -X
iptables -F

puede ser inteligente para que no se bloquee su servidor con SSH (el cronjob restablecerá IPtables para que pueda acceder nuevamente). Si aún tiene acceso, puede eliminar el cronjob y configurar sus IPtables nuevamente.

William Edwards
fuente
Sin embargo, el trabajo temporal simplemente eliminaría el firewall. ¿Por qué configurar iptablesen primer lugar? Alguna forma de acceso fuera de banda es el método habitual. knockdes otro.
Matt
@mtm Sí, cuando está bloqueado, el cronjob restablecerá la configuración de IPtables para que pueda acceder a SSH nuevamente. Las razones por las cuales las personas usan IPtables son diferentes, mi opinión es que es un cortafuegos efectivo, simple y flexible.
William Edwards
2
oic. te refieres a ejecutar el enjuague una vez a la hora de configuración, no programado regularmente. athace eso.
Matt
44
Incluir en la lista blanca solo su IP y luego permitir un inicio de sesión raíz sin contraseña parece una idea terrible.
Alex W
1
@AlexW Sé que ha pasado un tiempo, pero aún quería comentar: Without-Passwordsignifica que la autenticación de contraseña no está permitida, por lo que tendrá que usar la autenticación de clave SSH en su lugar. De hecho, es un poco un nombre poco claro para este método de autenticación. Pero esto no significa que no necesite una contraseña para iniciar sesión como root. Sin embargo, un método más seguro es establecer PermitRootLogin noy utilizar una cuenta sudo diferente de inicio de sesión, como la raíz es un objetivo común
BlueCacti
5

Otras respuestas están usando iptables -Ien sus ejemplos, que a menudo no es lo que debe usar.

iptables ejecutará la primera regla que coincida, por lo que el orden de las reglas es muy importante. -Ies el comando "insertar", y debe usarse con un parámetro de índice para especificar a qué lugar de la lista pertenece una regla determinada. -Aes el comando "agregar", que agregará la regla al final de la lista.

En algunas distribuciones (quizás todas), el uso -Isin un parámetro de índice agregará la regla al índice, convirtiéndola en la primera regla verificada. En este escenario, si el último comando que ejecuta es iptables -I INPUT -s tcp 0.0.0.0/0 -j DROPiptables, eliminará todo el tráfico, independientemente de si tiene o no alguna ACCEPTregla más adelante en la cadena.

Aquí hay una muestra de cómo configurar una regla que solo permite SSH desde una sola IP:

Comenzando sin reglas:

#> iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Agregue una nueva regla "permitir SSH desde 1.2.3.4":

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

Bloquee SSH de todas las demás IP:

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

Ahora su cadena de ENTRADA se verá así:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Más adelante, si necesita incluir una segunda IP en la lista blanca, puede usar el -Iparámetro para colocarla antes de la regla de la lista negra.

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Observe que al usar -I INPUT 2agregó la nueva regla como regla número 2 y superó la regla DROP al número 3.

STW
fuente