Tag: GNU-Linux

Problemas de acceso a una IP o dominio público desde una red LAN

En ocasiones más de uno se habrá encontrado con el problema de que tiene una dirección IP pública (fija o dinámica) o un dominio público (mediante DNS fijo o dinámico) que apunta al router que tenemos dispuesto, permitiendo acceder a un servicio de una máquina que corre en nuestra red de área local (LAN) desde fuera de ella, pero desde la red local es imposible acceder con dicha dirección o dominio. Si alguna vez te ha pasado esto, te explico las causas y las posible soluciones.

La causa de este comportamiento está sujeta habitualmente a medidas de seguridad que evitan las conexiones loopback como característica de seguridad. La dirección lookback es una dirección especial que los host utilizan para dirigir el tráfico hacia ellos mismos. Esta característica suele ser una extensión de la NAT llamada NAT loopback.

NAT loopback es una extensión de NAT que te permite acceder a tu dirección pública de Internet (WAN) desde dentro de tu propia red (LAN). Esto es práctico cuando tenemos algún servidor dentro de nuestra propia red, ya que nos permite acceder a ese servidor usando la misma IP pública (y por lo tanto también dominio) tanto desde dentro de la LAN, como desde el exterior.

Esta característica desgraciadamente no está presente en la mayoría de los routers que nos proporcionan nuestros proveedores de Internet. Con lo cual lo único que puedes hacer es comprobar si es posible activar esta característica en la zona de administración del router o contactando a tu proveedor de acceso a Internet para que te lo solucione.

La ausencia de esta característica provoca que por ejemplo si te haces con un NAS, dispositivos de almacenamiento en la red que últimamente están teniendo una gran aceptación, no se pueda acceder desde el dominio a tu NAS si estás en la misma red local que el NAS. Es decir, terminas usando la IP local de la LAN (ejemplo: 192.168.1.177) cuando estás en la misma red y el dominio (mi_nas.com) para acceder desde fuera de la red LAN. Dos formas de acceder que vuelven complicado configurar aplicaciones, como por ejemplo un cliente de sincronización del estilo Dropbox, debido a que no tienes una única forma de acceder al NAS, la cual debería ser el dominio.

Si el equipo con el que accedes al NAS, es de sobremesa aún puedes solucionarlo editando el archivo "hosts" del sistema, pero en caso contrario tendrás que o bien cambiar el router o funcionar con IP local y dominio dependiendo si estás dentro o fuera de la red local del NAS.

Paso a explicar como solucionar la resolución de dominio tanto para Windows como para GNU/Linux mediante la edición del archivo "hosts" de tu ordenador.

 

Windows


  1. Abrir un editor de texto en "modo administrador"
  2. Abrir el fichero ubicado en la siguiente ruta C:\Windows\System32\Drivers\etc\hosts
  3. Añadir el host mediante la adición de una línea al final del fichero. Usando el ejemplo anterior del NAS sería:
    192.168.1.177 mi_nas.com
  4. Guardar y a partir de ahora mi_nas.com resolverá directamente como 192.168.1.177

 

GNU/Linux


  1. Abrir un terminal y escribir el siguiente comando:
    sudo nano /etc/hosts
  2. Añadir el host mediante la adición de una línea al final del fichero. Usando el ejemplo anterior del NAS sería:
    192.168.1.177 mi_nas.com
  3. Guardar y a partir de ahora mi_nas.com resolverá directamente como 192.168.1.177

 

Espero que este artículo sirva para arrojar un poco de luz en toda esta problemática.

Resetear contraseña olvidada de tu Raspberry Pi

La semana pasada me encontré con el problema de tener que acceder vía SSH a una Raspberry Pi (rpi), para poder gobernar una serie de maquinas accesibles desde la red local a la que se conectaba dicha rpi, y no poder hacerlo porque no recordaba la contraseña...

Al ver que no recordaba la contraseña me puse a buscar la mejor solución para poder volver a tener acceso a la rpi. Alguno puede pensar que con volver a poner el sistema operativo Raspbian, queda todo solucionado, y tiene razón. El problema, es que toda la configuración y software específico se borra, teniendo que volver a cargar el sistema operativo, instalar el software y generar de nuevo las configuraciones... vamos un peñazo XD .

Alguno se le ocurriría montar un script en el que ir probando las posibles combinaciones por fuerza bruta. En mi caso no era una opción, ni suele serlo en general. Con que cumplas los criterios básicos de una contraseña decente la combinatoria se dispara... Los tiempos en los que las claves eran de hasta 6 caracteres normalmente sólo letras y/o números han quedado atrás.

Con todo ello en mente le di alguna vuelta más al asunto...

Me puse a pensar cuál es nivel de seguridad que me podría permitir resetear la clave, y pronto caí que en el físico. Tenía acceso físico al hardware de la rpi, con lo que cogí la tarjeta SD y la introduje en mi ordenador. En su interior enseguida encontré un archivo, que mirando un poco en Internet, entendí que me podía dar la clave para poder acceder al sistema antes de que completamente se cargase y me obligase a idetificarme con las credenciales de acceeso, de la cual había perdido la contraseña.

El fichero en cuestión es el "cmdline.txt" y contiene parámetros específicos para la carga del kernel de Raspbian:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Según la documentación es posible cargar la ejecución de cualquier binario con el parámetro "init", y en este caso nos interesa cargar la shell. Para ello añadimos "init=/bin/sh" al final de la línea precedido por un espacio:

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait init=/bin/sh

Hecha esta modificación en el fichero lo guardamos, volvemos a introducir la SD en la rpi y la arrancamos. Esta vez durante el arranque, se parará en cierto momento la carga del sistema y nos aparecerá un prompt en el que podremos escribir comandos.

Antes de escribir cualquier comando debemos remontar el volumen para que efectivamente guarde los cambios. Para ello vamos a volver a montar el sistema de ficheros como lectura y escritura con el siguiente comando.

mount -rw -o remount /

Una vez hecho, vamos a invocar al comando que nos permite resetear la contraseña de nuestro usuario (normalmente pi si no los has cambiado):

passwd pi

Te pedirá que introduzcas la contraseña y otra vez más para confirmarla. Si todo ha ido bien verás un mensaje de este tipo:

passwd: password updated successfully

Ahora sincronizaremos los cambios que hemos hecho que están en memoria, para que queden persistentes en la memoria de la SD. Después reanudaremos el boot del sistema:

sync
exec /sbin/init

Una vez se haya cargado el sistema comprueba que puedes acceder con la clave que intruduciste y apaga la rpi con:

sudo poweroff

Una vez apagada la rpi volvemos a cargar la SD en el ordenador y editamos de nuevo el fichero "cmdline.txt" y lo volvemos a dejar como al inicio sin el parámetro "init":

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Ahora ya podemos volver a poner la tarjeta SD en la Raspberry Pi y podremos volver a tener el sistema Raspbian como si nunca hubiéramos perdido la contraseña.

Recordad que esto ha sido posible gracias a tener acceso físico al hardware que ejecuta el software. El nivel físico siempre es el nivel más débil a nivel técnico y de infraestructura, por eso en Seguridad Informática hay que cuidar no sólo a quién damos acceso mediante credenciales, sino también quién tiene acceso físicamente al hardware donde se corre el software.

Averiguar dominio final de un nombre de dominio alternativo

Recientemente me he encontrado en la situación de tener que usar un SMTP para mandar emails. En estos casos el servicio suele estar vinculado a un dominio que apunta a la maquina donde se encuentra corriendo el servidor SMTP corriendo el servicio. Suele ser cada vez más muy habitual que además estos  servicios estén securizados con SSL para proteger las conexiones.

Por otro lado, puede darse que para un dominio se tengan dominios alternativos que aseguren el acceso a la máquina, que en mi caso, es la que corre el servidor SMTP. Esto asegura que se pueda acceder a la máquina usando distintos dominios que se proveen desde distintos proveedores de dominio. Esta no es la única situación que lo justifica, sino que también puede hacerse porque un proveedor de servicios ofrezca personalización de los servicios con el dominio del cliente, permitiendo que una empresa o un usuario particular, tenga dichos servicios usando su propio dominio.

Aquí  es donde ocurre el problema, porque los certificados SSL para cifrar las conesxiones se asocian a un dominio y la redirección de dominios alternativos  provoca que no coincida el certificado del dominio final con el dominio alternativo con el que se accede, dando como resultado un error del tipo:

Error: Hostname/IP doesn't match certificate's altnames: "Host: smtp.mascandobits.es. is not in the cert's altnames: DNS:*.servidoresdns.net, DNS:servidoresdns.net"

Los certificados SSL se asocian a un único demonio por normal general, aunque es posible generar certificados que abarquen varios dominios (dominio + dominios alternativos).

Si tienes este problema y quieres seguir usando la conexión segura con SSL, tu única opción (si has contratado con el proveedor de servicios) es averiguar el dominio principal para el que es válido el certificado. Normalmente va a ser el del dominio final.

Desde Linux esta tarea es bien sencilla, basta con usar primero el comando "nslookup" para comprobar la dirección IP final, obteniendo cómo resuelve el DNS dicho dominio. Pongamos un ejemplo de un servicicio SMTP con dominio "smtp.mascandobits.es":

nslookup smtp.mascandobits.es
Server:         208.67.222.223
Address:        208.67.222.223#53

Non-authoritative answer:
Name:   smtp.mascandobits.es
Address: 217.76.127.101

En la parte de "Address" de la sección "Non-authoritative answer" obtenemos la dirección IP final. Con esa IP aplicamos el comando "host" que permite resolver de manera inversa el dominio. Es decir, pasar de una IP a un nombre de dominio.

host 217.76.127.101
100.128.76.218.in-addr.arpa domain name pointer smtp-13.servidoresdns.net.

En este ejemplo el comando nos resuelve que el dominio principal que apunta a esa IP es "smtp-13.servidoresdns.net". Este dominio resulta ser el que coincide con el certificado SSL, solventando el error que se presentaba al inicio de la entrada.

Alguno pensará que para qué complicarse tanto si se puede obtener la IP final de la máquina que da el servicio. La respuesta es bien sencilla. En un dominio se puede redirigir hacia donde apunta, y de manera transparente un cambio de IP en la máquina que aloja el servicio, no conlleva el cambiar el nombre de dominio hacia donde se apunta el servicio. Es decir, basta con que el dominio apunte a la nueva IP donde se encuentra la máquina.

OpenCV – Mouse Event Handler (parte 2)

Continuando la entrada "OpenCV - Mouse Event Handler (parte 1)", que ya publiqué hace un tiempo, os traigo la segunda parte que da cierre al manejo de eventos del ratón con OpenCV. Si en la primera parte me centraba en el manejo puro de los eventos del ratón, en esta entrada hablaré sobre la combinación de eventos de ratón con eventos de teclado.

opencv_mouse-event_display

La combinación de eventos de teclado con los eventos de ratón, son muy útiles por ejemplo cuando queremos asegurarnos que las acciones con el ratón no son fortuitas, y por ello se asegura la acción del ratón con la pulsación de alguna tecla. Un ejemplo común puede ser el pulsar la tecla "CRTL" o "SHIFT" cuando se hace click con el ratón. Otro ejemplo puede ser la de diferenciar dos acciones distintas desde un click de ratón, gracias a la pulsación combinada con distintas teclas.

El siguiente ejemplo toma como partida el ya expuesto en la entrada de la parte 1 y modifica la función "mouseEventHandler" de la siguiente forma:

void mouseEventHandler(int event, int x, int y, int flags, void* param)
{
     if ( flags == (EVENT_FLAG_CTRLKEY + EVENT_FLAG_LBUTTON) )
     {
          cout << "Left mouse button is clicked while pressing CTRL key - position (" << x << ", " << y << ")" << endl;
     }
     else if ( flags == (EVENT_FLAG_SHIFTKEY + EVENT_FLAG_RBUTTON) )
     {
          cout << "Right mouse button is clicked while pressing SHIFT key - position (" << x << ", " << y << ")" << endl;
     }
     else if ( event == EVENT_MOUSEMOVE && flags == EVENT_FLAG_ALTKEY)
     {
          cout << "Mouse is moved over the window while pressing ALT key - position (" << x << ", " << y << ")" << endl;
     }
}

Cada vez que se produzca alguno de los siguientes eventos:

  • EVENT_FLAG_LBUTTON
  • EVENT_FLAG_RBUTTON
  • EVENT_FLAG_MBUTTON
  • EVENT_FLAG_CTRLKEY
  • EVENT_FLAG_SHIFTKEY
  • EVENT_FLAG_ALTKEY

Se invocará a la función callback “mouseEventHandler“. En este caso, en la sucesión de los distintos “if” que permite identificar el tipo de evento, se incluye además  una condición de teclado. En el caso de los clicks izquierdo y derecho del ratón, se puede combinar las flags de pulsación del ratón con los del teclado, aplicando una suma aritmética de los valores. En el caso del movimiento del ratón, esto no es aplicable, ya que el movimiento del teclado es de tipo "EVENT" y el de la tecla es de tipo "EVENT_FLAG". A causa de ello se realiza una operación lógica entre los resultados obtenidos en las comparaciones de cada  tipo.

opencv_mouse-event_key-event_display

A continuación dejo el código completo de la arquitectura básica para el manejo de eventos con pulsaciones de teclado:

OpenCV_Mouse_Event_Handler_2.cpp