¡Hola, ciudadanos de Habrovsk! ¿Alguna vez ha encontrado una situación en la que realmente le gustaría viajar virtualmente a otra ciudad, país o a otro continente? Tengo tanta necesidad, por lo que la posibilidad de tener mi propio servidor VPN que se puede iniciar en cualquier lugar en un par de segundos fue bastante aguda. En este artículo quiero hablar sobre mi proyecto, que planeé cuando estaba buscando una solución preparada, en este caso, docker una imagen que le permitiría elevar rápidamente el servidor OpenVPN, con un mínimo de configuraciones y un nivel aceptable de seguridad.
Antecedentes
La capacidad de ejecutar el servicio en cualquier máquina: ya sea un servidor físico, un servidor privado virtual o, en general, el espacio del contenedor dentro de otro sistema de administración de contenedores, fue fundamental. Mi mirada cayó inmediatamente en el Docker. En primer lugar, este servicio está ganando popularidad y, por lo tanto, cada vez más proveedores ofrecen soluciones llave en mano con su preinstalación; en segundo lugar, hay un repositorio centralizado de imágenes, desde donde puede descargar e iniciar el servicio con un solo comando en el terminal. La idea de que tal proyecto ya debería existir, me visitó y busqué persistentemente. Pero, la mayoría de los proyectos que encontré eran demasiado engorrosos (era necesario crear un contenedor para el almacenamiento permanente de datos y ejecutar el contenedor varias veces con una aplicación con diferentes parámetros), ya sea sin documentación sensata o completamente abandonado. No encontré nada aceptable, comencé trabaja en tu proyecto. Más adelante había noches de insomnio estudiando documentación, escribiendo código y depurando, pero al final, mi servicio vio la luz y jugó en todos los colores del panel LED monocromático del enrutador. Entonces, por favor ama y favorece -
Docker-OpenVPN . Incluso se me ocurrió un logotipo (arriba, delante del corte), pero no lo juzgo estrictamente, porque no soy diseñador (ya). Cuando implementé este proyecto, me concentré en la velocidad de implementación, un mínimo de configuraciones y un nivel aceptable de seguridad. Por prueba y error, encontré el equilibrio óptimo de estos criterios, sin embargo, en algunos lugares tuve que sacrificar la velocidad de implementación por seguridad, y tuve que pagar la portabilidad por un mínimo de configuraciones: en la configuración actual, el contenedor una vez creado en un servidor no se puede transferir y ejecutar en otro. Por ejemplo, todos los certificados de cliente y servidor se generan cuando se inicia el servicio y esto demora aproximadamente 2 segundos. Sin embargo, la generación del archivo Defi Hellman tuvo que eliminarse en el tiempo de compilación: se crea durante la compilación de la imagen del acoplador y puede durar hasta 10 minutos. Me gustaría recibir una auditoría de seguridad de dicha solución de una comunidad respetada.
Lanzamiento
Para comenzar el servicio necesitamos algunas cosas:
- Servidor: físico o virtual. Teóricamente, puede ejecutar en modo acoplable en acoplador, pero no he realizado pruebas exhaustivas de esta opción;
- En realidad, acoplador. Muchos proveedores de hosting ofrecen soluciones listas para usar con Docker "a bordo";
- La dirección IP pública.
Si todos los detalles están en su lugar, nos queda ejecutar el siguiente comando en la consola de su servidor:
docker run --cap-add=NET_ADMIN \ -it -p 1194:1194/udp -p 80:8080/tcp \ -e HOST_ADDR=$(curl -s https://api.ipify.org) \ alekslitvinenk/openvpn
Un lector atento podría prestar atención al hecho de que la dirección IP del servidor se determina automáticamente mediante
ipify.org . Si por alguna razón esto no funciona, puede especificar la dirección manualmente. Si todos los pasos anteriores se completaron correctamente, deberíamos ver algo similar en la consola:
Sun Jun 9 08:56:11 2019 Initialization Sequence Completed Sun Jun 9 08:56:12 2019 Client.ovpn file has been generated Sun Jun 9 08:56:12 2019 Config server started, download your client.ovpn config at http://example.com/ Sun Jun 9 08:56:12 2019 NOTE: After you download you client config, http server will be shut down!
Estamos cerca del objetivo: ahora tenemos que copiar
example.com (en su caso, habrá la dirección de su servidor) y pegarla en la barra de direcciones del navegador. Después de presionar Entrar, el archivo client.ovpn se descargará y el servidor http en sí mismo quedará en el olvido. Si esta solución está en duda, puede usar el siguiente truco: ejecute el comando anterior y agregue los indicadores y la contraseña de
zp . Ahora, si pega el enlace generado en la ventana del navegador, recibirá un archivo zip con una contraseña. Cuando tenga un archivo con la configuración del cliente, puede usar cualquier cliente adecuado. Yo uso Tunnelblick para Mac.
Video tutorial
Este video tutorial contiene instrucciones detalladas para implementar el servicio en DigitalOcean.
PD: si este proyecto le resulta útil, dele un asterisco en GitHub, bifurque y dígaselo a sus amigos. Los colaboradores y las auditorías de seguridad también son ampliamente bienvenidos.
PPS Si este artículo trata sobre Habr, entonces planeo escribir lo siguiente sobre cómo lancé docker-in-docker y docker-in-docker-in-docker, por lo que hice y lo que salió de él.
EDITAR1:- Errores corregidos en la publicación,
- En respuesta a los comentarios, decidí poner esta información aquí: - se necesita una marca de privilegio para trabajar con iptables
EDIT2:- Comando de lanzamiento de imagen mejorado: ahora no requiere el indicador --privileged
- Se agregó un enlace a la guía de video en ruso: youtu.be/A8zvrHsT9A0