Port Knocking: La mejor seguridad que puedes tener en tu ordenador o servidor (Implementación + Configuración)

Golpeo de puertos (en inglés port knocking) es sin lugar a dudas una práctica que bien todos los que administramos servidores deberíamos conocer, aquí les explico detalladamente qué es esto y cómo implementar y configurar esto 😉

Ahora mismo los que administramos algún servidor tenemos acceso SSH a ese servidor, algunos cambiamos el puerto por defecto de SSH y ya no usa el puerto 22 y otros simplemente lo dejan así (algo no recomendado), no obstante el servidor tiene habilitado el acceso por SSH mediante algún puerto y esto ya es una ‘vulnerabilidad’.

Con Port Knocking podemos lograr lo siguiente:

1. El acceso SSH no está habilitado por ningún puerto. Si tenemos SSH configurado por el puerto 9191 (por ejemplo) ese puerto (9191) estará cerrado para todos.
2. Si alguien desea acceder por SSH al servidor no podrá obviamente, pues el puerto 9191 está cerrado… pero, si usamos una combinación ‘mágica’ o secreta se nos abrirá ese puerto, por ejemplo:

1. Hago un telnet al puerto 7000 del servidor
2. Hago otro telnet  al puerto 8000 del servidor
3. Hago otro telnet al puerto 9000 del servidor
4. El servidor detecta que alguien ha efectuado la combinación secreta (tocar los puertos 7000, 8000 y 9000 en ese orden) y abrirá el puerto 9191 para que se solicite el login por SSH (lo abrirá solo para la IP desde la cual se hizo la combinación de puertos satisfactoria).
5. Ahora para cerrar SSH simplemente hago un telnet al puerto 3500
6. Haré otro telnet al puerto 4500
7. Y finalmente otro telnet al puerto 5500
8. Al efectuar esta otra combinación secreta que el servidor detecta, se cerrará el puerto 9191 de nuevo.

O sea, explicando de forma aún más simple esto…

Con Port Knocking el servidor nuestro podrá tener determinados puertos cerrados, pero cuando el server detecte que desde X IP se efectuó la combinación de puertos correcta (configuración previamente definida en un archivo de configuración) ejecutará determinado comando en él mismo obviamente (comando también definido en el archivo de configuración).

¿Se entiende no? 🙂

¿Cómo instalar un daemon para Port Knocking?

Yo lo hago con el paquete kockd, que nos permitirá de forma muy pero muy simple y rápida poder implementar y configurar Port Knocking.

Instalen el paquete: knockd

¿Cómo configurar Port Knocking con knockd?

Una vez instalado pasamos a configurarlo, para ello editamos (como root) el archivo /etc/knockd.conf:

nano /etc/knockd.conf

Como podrán ver en ese archivo ya viene una configuración por defecto:

 Explicar la configuración por defecto es realmente simple.

– Primero, UseSyslog significa que para registrar actividad (log) se usará /var/log/syslog.
– Segundo, en la sección [openSSH] es donde obviamente irán las instrucciones para abrir SSH, primeramente tenemos la secuencia de puertos (la combinación secreta) que está configurada por defecto (puerto 7000, puerto 8000 y finalmente puerto 9000). Obviamente los puertos se pueden cambiar (de hecho lo recomiendo) así como no tienen que ser 3 obligatoriamente, pueden ser más o menos, depende de ustedes.
– Tercero, seq_timeout = 5 significa el tiempo que se esperará para que se efectúe la combinación secreta de puertos. Por defecto está puesto 5 segundos, esto significa que una vez empecemos a efectuar el port knocking (o sea, que cuando hagamos un telnet al puerto 7000) tenemos máximo 5 segundos para terminar la secuencia correcta, si pasan 5 segundos y no hemos culminado el port knocking entonces simplemente será como si la secuencia no hubiese sido válida.
– Cuarto, command no necesita de mucha explicación. Este será simplemente el comando que el servidor ejecutará cuando detecte la combinación antes definida. El comando que está puesto por defecto lo que hace es abrir el puerto 22 (cambien este puerto por el de su SSH) solo a la IP que efectuó la combinación correcta de puertos.
– Quinto, tcpflags = syn con esta línea especificamos el tipo de paquetes que reconocerá el servidor como válidos para el port knocking.

Luego está la sección para cerrar el SSH, que la configuración por defecto no es más que la misma secuencia de puertos anterior pero en orden contrario.

Aquí les dejo una configuración con algunas modificaciones:

 ¿Cómo iniciar el daemon knockd?

Para iniciarlo primero debemos modificar (como root) el archivo /etc/default/knockd:

nano /etc/default/knockd

Ahí cambiamos la línea número 12 que dice: “START_KNOCKD=0” y cambiar ese 0 por un 1, nos quedaría: “START_KNOCKD=1

Una vez hecho esto ahora simplemente lo iniciamos:

service knockd start

Y listo, ya está configurado y funcionando.

Port Knocking con knockd en funcionamiento!

Como pueden ver en la configuración anterior, si se hace un port knock al puerto 1000, luego al 2000 y finalmente al 3000 entonces se abrirá el puerto 2222 (mi SSH), pues bien aquí otro ordenador ejecutando el port knock:

Una vez presione [Enter] en el Knock No.1, en el No.2 y finalmente en el No.3 se abrirá el puerto, aquí les dejo el log:

Como pueden ver al hacer el knock al puerto 1000 se registró el stage (paso) 1, luego al 2000 será el stage 2 y finalmente al 3 con el 3000, al hacer esto se ejecuta el comando que le declaré en el .conf y listo.

Luego para cerrar el puerto solo sería hacer un knock al 9000, 8000 y finalmente al 7000, aquí les dejo el log:

Y bueno aquí termina la explicación de uso 😀

Como pueden ver, el Port Knocking es verdaderamente interesante y útil, pues si bien no queremos simplemente abrir un puerto luego de determinada combinación de puertos, el comando u orden que el servidor ejecutará puede variar, o sea… en vez de abrir un puerto podemos declarar que mate un proceso, detenga un servicio como apache o mysql, etc … el límite es su imaginación.

El Port Knocking solo funciona cuando se tiene un servidor físico o cuando el servidor virtual es tecnología KVM. Si tu VPS (servidor virtual) es OpenVZ entonces el Port Knocking no creo que te funcione pues no puedes manipular directamente iptables

Bueno y hasta aquí el artículo… no soy ni de lejos un experto en esta materia pero quería compartir con ustedes este tan interesante proceso.

Saludos 😀

Comparte para difundir

Si te ha gustado nuestro contenido ahora puedes ayudar a difundirlo en las redes sociales de manera sencilla usando los siguientes botones:

Envía
Pinea
Print

27 comentarios

  1.   ErunamoJAZZ dijo

    Excelente artículo, está bastante interesante y no sabía que existía… sería genial que sigas sacando artículos para sysadmin novatos y eso 😀

    Saludos y gracias ^_^

    1.    KZKG^Gaara dijo

      Gracias a tí por comentar.
      Sí… es que con los artículos sobre DNS de fico, no me quiero quedar atrás LOL!!!

      Nada en serio. Hace varios meses escuché algo sobre Port Knocking y me llamó inmediatamente la atención, pero como pensé que iba a ser muy complejo en ese momento no decidí adentrarme, justo ayer revisando unos paquetes del repo descubrí knockd y decidí intentarlo, y aquí está el tutorial.

      A mí siempre me ha gustado poner artículos técnicos, algunos tal vez no sean suficientemente interesantes pero… espero que otros sí 😉

      Saludos

    2.    Mario dijo

      Hola, se que este articulo ya tiene algo de tiempo pero lanzo mi consulta a ver si alguien me la resuelve.
      El caso es que he implementado el port knocking a mi raspberry para intentar mejorar la seguridad cuando me conecto a ella desde fuera de la red local. Para que esto funcione he tenido que abrir el rango de puertos en el router 7000-9990 direccionando hacia la maquina. ¿Es seguro abrir esos puertos en el router o por el contrario al intentar tener mas seguridad estoy haciendo lo contrario?

      Un saludo y gracias.

  2.   eVeR dijo

    Genial, soy sysadmin hace años y no lo conocía.
    Una pregunta… ¿cómo hacés los “knocks”?
    ¿Ejecutás telnet contra esos puertos? ¿Que te responde el telnet? ¿O hay algún comando onda “knock”?
    Genial genial es artículo. Espectacular. Muchas gracias

    1.    KZKG^Gaara dijo

      Hice la prueba con telnet y funcionó de maravillas todo… pero, curiosamente sí hay un comando ‘knock’, haz un man knock para que veas 😉

      El telnet no me responde en realidad nada, iptables con la política DROP hace que no responda nada y el telnet se quede ahí esperando por alguna respuesta (que nunca llegará), pero el daemon knockd sí reconocerá el knock aunque nadie lo responda 😀

      Muchas gracias a tí por tu comentario, es un placer saber que aún mis artículos gustan ^_^

  3.   st0rmt4il dijo

    Agregado a Favoritos! :D!

    Gracias!

    1.    KZKG^Gaara dijo

      Thanks 😀

  4.   dhunter dijo

    Ahh seguridad, esa sensación agradable de cuando aseguramos la pc a plomo, y entonces días/semanas más tarde tratando de conectarnos desde algún lugar remoto no podemos acceder porque el firewall está en modo “no hay pa nadie”, a esto se le llama quedarse fuera del castillo en términos de sysadmins. 😉

    Por eso este post es tan útil, con el knockd puedes acceder desde cualquier lugar que pueda enviar un paquete a tu red local, y los atacantes pierden el interés al ver que el puerto ssh está cerrado, no creo que se lancen a hacer knock a fuerza bruta para abrir el puerto.

  5.   Manuel dijo

    Oye, está genial el artículo.

    Una cosa: ¿Sirve para conectar desde fuera de la red local?

    Lo digo porque tengo el router con los puertos cerrados menos el que corresponde al ssh que está redirigido hacia el servidor.

    Imagino que para que funcione desde fuera de la red local habrá que abrir los puertos del router correspondientes al Port Knocking y hacer que estos se redirigan tambien al server.

    Mmm…

    No sé hasta que punto es seguro hacer esto.

    ¿Qué opinan?

    1.    KZKG^Gaara dijo

      No estoy muy seguro, no he hecho la prueba pero creo que sí, que deberías abrir puertos en el router pues de lo contrario no podrías llegar a hacer los knocks en el servidor.

      Haz la prueba sin abrir puertos en el router, si no te funciona es una pena, pues estoy de acuerdo contigo, no es aconsejable abrir estos puertos en el router.

      1.    Manuel dijo

        Efectivamente, hay que abrir los puertos y redireccionarlos hacia al equipo al que estamos llamando.

        Lástima.

  6.   Rabba08 dijo

    Buenisimo muchas gracias! recien empiezo a estudiar la carrera de redes y estos tutos me vienen de maravilla! gracias por tomarse el tiempo de compartir el conocimiento

    1.    KZKG^Gaara dijo

      Yo he aprendido muchísimo a lo largo de los años con la comunidad de Linux global… desde hace unos años he querido aportar yo también, precisamente por eso escribo 😀

  7.   janus981 dijo

    Muchisimas gracias, no sabes como me ayuda, estoy por montar un servidor y esto me va de lujo.

    Saludos

    1.    KZKG^Gaara dijo

      Para eso estamos, para ayudar 😉

  8.   Jean Ventura dijo

    Excelente articulo! No tenia conocimiento de esto y me sirve bastante (Estoy utilizando RackSpace que usa KVM, por lo que me cae como anillo al dedo!). Adicionado a favorito.

    1.    KZKG^Gaara dijo

      Gracias por comentar 🙂

  9.   Algabe dijo

    Como siempre DesdeLinux nos trae excelentes post con tutoriales que son realmente utiles para poner en acción, gracias por compartir!! 🙂

    1.    KZKG^Gaara dijo

      Gracias por tu comentario 🙂
      Sí, siempre intentamos satisfacer esa sed de conocimiento que tienen nuestros lectores 😀

  10.   Timbleck dijo

    Interesantísimo, no conocía la opción.
    Pasa directamente a engordar mi biblioteca de chuletas.
    Gracias!

    1.    KZKG^Gaara dijo

      Un gusto para mí 😀
      Saludos

  11.   Federico. A. Valdés Toujague dijo

    Saludos KZKG^Gaara!!! Apretaste. Tremendo artículo para asegurar servidores. Ni @%*&^ idea de que existe algo así. Ya lo probaré. Gracias

  12.   White^collar dijo

    esto esta genial…. ^-^

  13.   AprendeLinux dijo

    Hola, podrías explicarme como instalarlo en CentOS 5.x??

    Yo he descargado el rpm:
    http://pkgs.repoforge.org/knock/knock-0.5-3.el5.rf.x86_64.rpm

    Instalado:
    rpm -i knock-0.5-3.el5.rf.x86_64.rpm

    Configure el archivo de configuracion con 15 segundos de tiempo y el puerto que uso para conectar por ssh a mi vps

    Comenze el demonio:
    /usr/sbin/knockd &

    Hago el telnet y nada el puerto no se cierra, por defecto el puerto esta abierto, pero no se cierra.

    Algo estoy haciendo mal?

  14.   hola dijo

    Mmmm, las peticiones de telnet a esos puertos podrian ser aprendidas por el admin de nuestra red local, o po rnuestro proveedor de servicios no?, igual bloquearia a gente externa pero a ellos no, osea si ellos quieres activar nuestro puerto lo podrian hacer porque ven las peticiones que hacemos, mmm digamos que protege pero no al 100%

    1.    Roberto dijo

      Podría ser, pero no creo que se vallan a imaginar que determinados telnet ejecutan X acción. A no ser que vean que se siguen los mismos patrones en los telnet.

  15.   Pablo Andres Diaz Aramburo dijo

    Interesante el artículo, me surge una duda. Creo que existe un error en la imagen del archivo de configuración, pues si analisas bien, en ambas lineas del command estás usando ACCEPT en Iptables. Pienso que uno debe ser ACCEPT y otro debe ser REJECT.

    Por lo demás, excelente iniciativa. Muchas gracias por tomarte tu tiempo en explicar a otros tus conocimientos.

    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.