Trabajo remoto en la oficina. RDP, Port Knocking, Mikrotik: fácil y seguro

Debido a la pandemia de COVID-19 y el confinamiento generalizado en muchos países, la única salida para muchas empresas para continuar operando ha sido el acceso remoto a los puestos de trabajo a través de internet. Existen muchos métodos relativamente seguros para el trabajo remoto, pero considerando la magnitud del problema, se necesita un método sencillo para cualquier usuario que permita la conexión remota a la oficina sin requerir configuraciones adicionales, explicaciones, consultas exhaustivas ni instrucciones largas. Uno de estos métodos es el RDP (Remote Desktop Protocol), muy apreciado por muchos administradores. Conectarse directamente al puesto de trabajo por RDP resuelve perfectamente nuestra necesidad, salvo por un gran defecto: mantener abierto el puerto RDP para internet es muy inseguro. Por lo tanto, a continuación propongo un método simple pero eficaz de protección.Trabajo remoto en la oficina. RDP, Port Knocking, Mikrotik: fácil y seguro

Como a menudo me encuentro con pequeñas organizaciones que utilizan dispositivos Mikrotik como salida a internet, a continuación se mostrará cómo implementarlo en Mikrotik, pero el método de protección Port Knocking se puede implementar fácilmente en otros dispositivos de mayor calidad con configuraciones similares en el enrutador de entrada y el firewall.

Resumen sobre Port Knocking. La protección externa ideal de una red conectada a internet es cuando todos los recursos y puertos están cerrados al exterior por un firewall. Aunque el router con un firewall configurado de esta manera no reacciona a los paquetes que llegan desde fuera, los escucha. Por lo tanto, se puede configurar el router de manera que al recibir una secuencia determinada (código) de paquetes de red en diferentes puertos, éste (el router) permita el acceso a ciertos recursos (puertos, protocolos, etc.) para la IP de donde provienen los paquetes.

Ahora al grano. No haré una descripción detallada de la configuración del firewall en Mikrotik, ya que hay muchas fuentes de calidad en internet para ello. Idealmente, el firewall bloquea todos los paquetes entrantes, pero

/ip firewall filter
add action=accept chain=input comment="established and related accept" connection-state=established,related

Permite el tráfico entrante de las conexiones ya establecidas (established, related).
Ahora configuramos Port Knocking en Mikrotik:

/ip firewall filter
add action=drop chain=input dst-port=19000 protocol=tcp src-address-list="Black_scanners" comment=RemoteRules
add action=drop chain=input dst-port=16000 protocol=tcp src-address-list="Black_scanners" comment=RemoteRules
add action=add-src-to-address-list address-list="remote_port_1" address-list-timeout=1m chain=input dst-port=19000 protocol=tcp comment=RemoteRules
add action=add-src-to-address-list address-list="Black_scanners" address-list-timeout=60m chain=input dst-port=19001 protocol=tcp src-address-list="remote_port_1" comment=RemoteRules
add action=add-src-to-address-list address-list="Black_scanners" address-list-timeout=60m chain=input dst-port=18999 protocol=tcp src-address-list="remote_port_1" comment=RemoteRules
add action=add-src-to-address-list address-list="Black_scanners" address-list-timeout=60m chain=input dst-port=16001 protocol=tcp src-address-list="remote_port_1" comment=RemoteRules
add action=add-src-to-address-list address-list="Black_scanners" address-list-timeout=60m chain=input dst-port=15999 protocol=tcp src-address-list="remote_port_1" comment=RemoteRules
add action=add-src-to-address-list address-list="allow_remote_users" address-list-timeout=1m chain=input dst-port=16000 protocol=tcp src-address-list="remote_port_1" comment=RemoteRules
move [/ip firewall filter find comment=RemoteRules] 1
/ip firewall nat
add action=dst-nat chain=dstnat comment="remote_rdp" src-address-list="allow_remote_users" dst-port=33890 in-interface-list=WAN protocol=tcp to-addresses=192.168.1.33 to-ports=3389

Ahora más en detalle:

las dos primeras reglas

/ip firewall filter
add action=drop chain=input dst-port=19000 protocol=tcp src-address-list="Black_scanners" comment=RemoteRules
add action=drop chain=input dst-port=16000 protocol=tcp src-address-list="Black_scanners" comment=RemoteRules

prohíben los paquetes entrantes de direcciones IP que han sido bloqueadas durante el escaneo de puertos;

La tercera regla:

add action=add-src-to-address-list address-list="remote_port_1" address-list-timeout=1m chain=input dst-port=19000 protocol=tcp comment=RemoteRules

añade la IP a la lista de hosts que realizaron el primer golpe correcto en el puerto requerido (19000);
Las siguientes cuatro reglas:

add action=add-src-to-address-list address-list="Black_scanners" address-list-timeout=60m chain=input dst-port=19001 protocol=tcp src-address-list="remote_port_1" comment=RemoteRules
add action=add-src-to-address-list address-list="Black_scanners" address-list-timeout=60m chain=input dst-port=18999 protocol=tcp src-address-list="remote_port_1" comment=RemoteRules
add action=add-src-to-address-list address-list="Black_scanners" address-list-timeout=60m chain=input dst-port=16001 protocol=tcp src-address-list="remote_port_1" comment=RemoteRules
add action=add-src-to-address-list address-list="Black_scanners" address-list-timeout=60m chain=input dst-port=15999 protocol=tcp src-address-list="remote_port_1" comment=RemoteRules

crean puertos trampa para aquellos que intenten escanear sus puertos, y al detectar tales intentos, bloquean su IP en la lista negra durante 60 minutos, durante los cuales las dos primeras reglas no permitirán que esos hosts se conecten a los puertos correctos;

La siguiente regla:

add action=add-src-to-address-list address-list="allow_remote_users" address-list-timeout=1m chain=input dst-port=16000 protocol=tcp src-address-list="remote_port_1" comment=RemoteRules

coloca la IP en la lista de permitidos por 1 minuto (suficiente para establecer la conexión), ya que se realizó un segundo toque correcto en el puerto necesario (16000);

El siguiente comando:

move [\/ip firewall filter find comment=RemoteRules] 1

mueve nuestras reglas hacia arriba en la cadena de procesamiento del firewall, ya que probablemente ya tengamos diferentes reglas prohibitorias que impedirán que nuestras recién creadas funcionen. La primera regla en MikroTik comienza desde cero, pero en mi dispositivo, cero estaba ocupado por una regla incorporada y no era posible moverla, así que la moví a 1. Por lo tanto, observamos según nuestra configuración a dónde se puede mover y especificamos el número necesario.

La siguiente configuración:

/ip firewall nat
add action=dst-nat chain=dstnat comment="remote_rdp_to_33" src-address-list="allow_remote_users" dst-port=33890 in-interface-list=WAN protocol=tcp to-addresses=192.168.1.33 to-ports=3389

hace el reenvío de un puerto seleccionado arbitrariamente 33890 al puerto RDP estándar 3389 y la IP de la computadora o servidor terminal que necesitamos. Creamos tales reglas para todos los recursos internos necesarios, preferiblemente estableciendo puertos externos no estándar (y diferentes). Naturalmente, las IP de los recursos internos deben ser estáticas o asignadas a través de DHCP. servidor.

Ahora nuestro MikroTik está configurado y necesitamos un procedimiento simple para que el usuario se conecte a nuestro RDP interno. Dado que la mayoría de nuestros usuarios son de Windows, creamos un sencillo archivo bat y lo llamamos StartRDP.bat:

1.htm
1.rdp

respectivamente, 1.htm contiene el siguiente código:

<img src="http://my_router.sn.mynetname.net:19000/1.jpg">
haga clic en actualizar la página para volver a ingresar por RDP
<img src="http://my_router.sn.mynetname.net:16000/2.jpg">

aquí hay dos enlaces a imágenes ficticias que se encuentran en la dirección my_router.sn.mynetname.net — esta dirección la tomamos del sistema DDNS de Mikrotik, habilitándolo previamente en nuestro Mikrotik: accedemos al menú IP->Cloud — marcamos la casilla DDNS Enabled, hacemos clic en Apply y copiamos el nombre DNS de nuestro enrutador. Pero esto solo es obligatorio cuando la IP externa del enrutador es dinámica o se utiliza una configuración con varios proveedores de internet.

El puerto en el primer enlace :19000 corresponde al primer puerto al que debemos conectarnos, en el segundo enlace corresponde al segundo. Entre los enlaces hay una breve instrucción que indica qué hacer si repentinamente nuestra conexión se ha interrumpido debido a pequeños problemas en la red: actualizamos la página, el puerto RDP se reabre durante 1 minuto y nuestra sesión se restablece. Además, el texto entre las etiquetas img genera para el navegador un microretardo que reduce la probabilidad de entrega del primer paquete al segundo puerto (16000) — hasta ahora, en dos semanas de uso (30 personas) no ha habido tales casos.

A continuación viene el archivo 1.rdp, que podemos configurar uno para todos o uno por cada usuario (así lo hice — es más fácil dedicar 15 minutos adicionales que varias horas en consultas con aquellos que no lograron entenderse).

screen mode id:i:2
use multimon:i:1
.....
connection type:i:6
networkautodetect:i:0
.....
disable wallpaper:i:1
.....
full address:s:my_router.sn.mynetname.net:33890
.....
username:s:myuserlogin
domain:s:mydomain

una de las configuraciones interesantes aquí es use multimon:i:1 — esto habilita el uso de múltiples monitores — algunos lo necesitan y no se dan cuenta de cómo activarlo.

connection type:i:6 y networkautodetect:i:0 — como la mayoría de internet es superior a 10 Mbps, configuramos el tipo de conexión 6 (red local de 10 Mbps y superior) y deshabilitamos networkautodetect, porque si se deja por defecto (auto), incluso un pequeño retraso ocasional en la red establece automáticamente una velocidad reducida para nuestra sesión, lo que puede crear retrasos notables en el trabajo, especialmente en programas gráficos.

disable wallpaper:i:1 — deshabilitamos la imagen del fondo de escritorio.
username:s:myuserlogin — indicamos el inicio de sesión del usuario, ya que una parte considerable de nuestros usuarios no conoce su inicio de sesión.
domain:s:mydomain — indicamos el dominio o el nombre del ordenador.

Pero si queremos simplificarnos la tarea de crear el procedimiento de conexión, podemos utilizar PowerShell — StartRDP.ps1.

Test-NetConnection -ComputerName my_router.sn.mynetname.net -Port 19000
Test-NetConnection -ComputerName my_router.sn.mynetname.net -Port 16000
mstsc /v:my_router.sn.mynetname.net:33890

También un poco sobre el cliente RDP en Windows: Microsoft ha recorrido un largo camino optimizando tanto el protocolo como sus componentes de servidor y cliente, implementando muchas funciones útiles, como el soporte para 3D hardware, optimización de la resolución de pantalla según su monitor, múltiples pantallas, entre otros. Pero, por supuesto, todo ha sido implementado con compatibilidad hacia atrás, y si el cliente es Windows 7 y el PC remoto es Windows 10, RDP funcionará utilizando el protocolo de la versión 7.0. Sin embargo, es posible actualizar las versiones de RDP a versiones más recientes; por ejemplo, se puede elevar la versión del protocolo de 7.0 (Windows 7) a 8.1. Por lo tanto, para mayor comodidad de los clientes, es necesario actualizar al máximo las versiones de la parte del servidor, así como proporcionar enlaces para la actualización de los nuevos clientes del protocolo RDP.

Como resultado, tenemos una tecnología simple y relativamente segura para conectarse remotamente a un PC de trabajo o a un servidor terminal. Pero para una conexión más segura, nuestro método de Port Knocking se puede complicar para protegerse de ataques, añadiendo puertos de verificación; se puede aplicar la misma lógica para añadir 3, 4, 5, 6... puertos, y de este modo, una intrusión directa en su red será casi imposible.

Plantillas de archivos para crear conexiones remotas a RDP.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster