Reenvío de puertos locales dependiente de IP en Linux

Reenvío de puertos locales dependiente de IP en Linux

He configurado el sshd de mi servidor para escuchar en un puerto 42 no estándar.

Sin embargo, en el trabajo estoy detrás de un firewall/proxy, que sólo permite conexiones salientes a los puertos 21, 22, 80 y 443. En consecuencia, no puedo enviar ssh a mi servidor desde el trabajo, lo cual es malo. No quiero devolver sshd al puerto 22.

La idea es esta: en mi servidor, redireccionar localmente el puerto 22 al puerto 42siLa IP de origen coincide con la IP externa de la red de mi trabajo. Para mayor claridad, supongamos que la IP de mi servidor es 169.1.1.1 (en eth1) y la IP externa de mi trabajo es 169.250.250.250. Para todas las IP diferentes a 169.250.250.250, mi servidor debería responder con una "conexión rechazada" esperada, como lo hace con un puerto que no escucha.

Soy muy nuevo en iptables. Revisé brevemente el extenso manual de iptables y estas preguntas relacionadas/relevantes:

Sin embargo, esas preguntas se refieren a escenarios más complicados de varios hosts, y no me queda claro qué tablas y cadenas debo usar para el reenvío de puertos local y si debo tener 2 reglas (para los paquetes de "pregunta" y "respuesta"). ), o sólo 1 regla para paquetes de "preguntas".

Hasta ahora sólo he habilitado el reenvío mediante sysctl. Comenzaré a probar soluciones mañana y apreciaré sugerencias o tal vez ejemplos de casos específicos para implementar mi escenario simple.

¿Es correcto el borrador de solución a continuación?

iptables -A INPUT [-m state] [-i eth1] --source 169.250.250.250 -p tcp
    --destination 169.1.1.1:42 --dport 22 --state NEW,ESTABLISHED,RELATED
    -j ACCEPT

¿Debería usar la manglemesa en lugar de filter? ¿Y/o FORWARDcadena en lugar de INPUT?

Respuesta1

Para reenviar/redireccionar cosas debes editar la tabla NAT.

Una regla como esta probablemente sea la más cercana a lo que necesita.

/sbin/iptables --table nat --append PREROUTING --protocol tcp \
               --source 169.250.250.250 --dport 22 \
               --jump REDIRECT --to-ports 42

Sería mucho más fácil y probablemente mejor dejar SSH en el puerto estándar y protegerlo adecuadamente. Usar un puerto alternativo sólo ralentizaría a un atacante motivado durante un par de segundos. Configure un sistema de prevención de intrusiones como denyhosts/fail2ban y desactive la autenticación basada en contraseña. O considere limitar la velocidad de las conexiones ssh entrantes.

Ver:

Respuesta2

Usaría Shorewall para administrar ip-tables. Configura un firewall básico decente y hacer lo que quieras es simple. Agregue una regla a /etc/shorewall/rules como:

Red DNAT: 169.250.250.250 loc: 169.250.250.250 tcp 42 22

Al igual que los demás, no estoy seguro de por qué ejecuta sshd en otro puerto. Si se trata de un puerto de Internet, es posible que desee observar el golpe del puerto para mantenerlo cerrado a menos que acceda a otro puerto primero. Shorewall maneja esto de manera simple.

información relacionada