Depuración remota de microservicios a través de SSH bajo VPN en 4 turnos

Hay una situación en la que necesita arreglar un caso complejo en una máquina remota, pero el acceso al servidor solo está bajo VPN con restricciones en los puertos abiertos. En el artículo quiero compartir con mis colegas una pequeña "discusión" sobre el tema de la depuración remota a través de SSH bajo VPN para ahorrar tiempo valioso en la configuración. Considero la misión cumplida si este hombre es útil para alguien.

Spoiler
El servidor se implementó en Ubuntu, respectivamente, además, todas las configuraciones del servidor estarán en Ubuntu. En la máquina local, Mac, pero aquí solo necesitamos el cliente SSH e IDE con un depurador para xdebug, por lo que la configuración es relativamente universal.

Introductorio


Entonces, hay un servidor remoto detrás de un circuito protegido. En el servidor en la ventana acoplable, un microservicio con xdebug activado. Hay acceso desde el exterior solo a través de SSH y a través de VPN.

Propósito


Propósito: iniciar la depuración remota de un microservicio localmente a través de xdebug.

Vamos ...

1. Configure sshd en un servidor remoto


Lo primero a lo que debe prestar atención es que necesita configurar sshd en el servidor para que le permita aceptar conexiones desde cualquier IP, no solo 127.0.0.1. Por defecto, esta opción está deshabilitada.

Aquí es donde se necesita root. Asumiremos que lo tienes :-)

sudo echo "GatewayPorts yes" >> /etc/ssh/sshd_config sudo service ssh restart 

2. Encuentre la dirección de la máquina host en la red acoplable


Dado que xdebug se ejecuta en la ventana acoplable y se conecta a la máquina local (y, en mi caso, esta IP no se resuelve porque es una conexión VPN), es útil conocer la IP de la máquina host en la red de la ventana acoplable. Esto se puede hacer usando el comando (ejecutar en el servidor):

 ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+' 

Supongamos que el equipo emitió "172.17.0.1"

3. Registramos la IP del host remoto en la configuración de xdebug en el contenedor


Un ejemplo de reemplazo a través de sed, pero también puede usar bolígrafos en el editor, como prefiera:

 sed -i 's/xdebug.remote_host=.*/xdebug.remote_host=172.17.0.1/' /usr/local/etc/php/conf.d/xdebug.ini 

Sin salir de la caja registradora, prescribimos el puerto "correcto" para la depuración. En mi caso, el microservicio se genera en un montón de nginx y php-fpm y, por lo general, el puerto 9000 está ocupado en php-fpm , y por lo tanto utilizo el puerto 9001 para la depuración.

 sed -i 's/xdebug.remote_port=.*/xdebug.remote_port=9001/' /usr/local/etc/php/conf.d/xdebug.ini 

Vale la pena verificar aquí que la depuración remota está, en principio, habilitada: "xdebug.remote_enable = 1"

 grep xdebug.remote_enable /usr/local/etc/php/conf.d/xdebug.ini 

Por lo general, esta configuración está conectada al Dockerfile o montada a través del volumen.

Todo está listo en el servidor. Ahora somos transferidos a la máquina local para construir un túnel.

4. Reenvíe el túnel SSH al servidor remoto


El túnel eleva el comando (ejecutar en la máquina local):

 SSH -R 9001:0.0.0.0:9001 user@remote_server 

En este lugar suena música mágica. La configuración principal se realiza, luego solo el entorno de depuración.

Configuración IDE


Por lo general, uso vscode, por lo que el depurador a través de la escucha del puerto comienza sin problemas. Daré un ejemplo de una configuración para vscode (solo agregue un nodo a launch.json):

  { "name": "Listen for XDebug", "type": "php", "request": "launch", "port": 9001, "cwd": "${workspaceFolder}", "pathMappings": { "/repo": "${workspaceRoot}" } }, 

"PathMappings" es la regla para asignar directorios de las máquinas locales y remotas, donde "/ repo" es el directorio con el código depurado en la ventana acoplable. El depurador debe poder navegar por los archivos y puntos de interrupción.

PD: Bueno, potest?


Ejecute netcat en la máquina local y escuche:

 nc -l 9001 

Ejecute el script de una sola línea en la ventana acoplable e imprima:

 php -r 'print("Hi!" . PHP_EOL);' 

En la máquina local, deberíamos ver los distintivos de llamada xdebug:

 <?xml version="1.0" encoding="iso-8859-1"?> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug"... 

¡Hurra! Todo esta listo.

Ahora puede depurar su código favorito en la máquina remota en el IDE. Hay un inconveniente obvio en el método descrito: reconfiguración de sshd en el servidor. Quizás haya una forma más "tranquila". En cualquier caso, agradeceré sus comentarios y sugerencias.

Gracias por su atencion!

Source: https://habr.com/ru/post/454640/


All Articles