¡Hola, habreros! ¿Alguna vez se han encontrado en una situación en la que desearían poder trasladarse virtualmente a otra ciudad, país o continente? Esta necesidad me surge con bastante frecuencia, por lo que la posibilidad de tener mi propio servidor VPN, que se pueda poner en marcha en cualquier lugar en un par de segundos, era bastante urgente. En este artículo quiero contarles sobre mi proyecto, que ideé mientras buscaba una solución lista para usar, en este caso una imagen de Docker, que me permitiera levantar un servidor OpenVPN rápidamente, con un mínimo de configuración y un nivel aceptable de seguridad.
Antecedentes
La posibilidad de ejecutar el servicio en cualquier máquina: ya sea un servidor físico, un servidor privado virtual, o incluso un espacio de contenedor dentro de otro sistema de gestión de contenedores, era críticamente importante. Mi atención se centró inmediatamente en Docker. En primer lugar, este servicio está ganando popularidad, y por lo tanto, cada vez más proveedores ofrecen soluciones listas con su preinstalación; en segundo lugar, hay un repositorio centralizado de imágenes, desde donde se puede descargar y ejecutar el servicio con un solo comando en la terminal. La idea de que un proyecto similar ya debería existir me asaltaba, y busqué insistentemente. Pero, la mayoría de los proyectos que encontraba eran o demasiado pesados (se necesitaba crear un contenedor para el almacenamiento permanente de datos y varias veces lanzar el contenedor con la aplicación con diferentes parámetros), o carecían de documentación decente, o estaban completamente abandonados. No encontrando nada aceptable, comencé a trabajar en mi propio proyecto. Se avecinaban noches sin dormir estudiando documentación, escribiendo código y depurando, pero al final mi servicio vio la luz y comenzó a brillar con todos los colores de un panel LED monocromático del router. Así que, les presento con gusto — . He incluso creado un logotipo (arriba, antes del corte), pero no lo juzguen demasiado severamente, porque no soy diseñador (todavía). Cuando implementé este proyecto, prioricé la velocidad de despliegue, un mínimo de configuraciones y un nivel aceptable de seguridad. A través de prueba y error, encontré el equilibrio óptimo entre estos criterios, aunque en algunos casos tuve que sacrificar la velocidad de despliegue por la seguridad, y a cambio de un mínimo de configuraciones, pagué con portabilidad: en la configuración actual, un contenedor creado en un servidor no se puede trasladar y ejecutar en otro. Por ejemplo, todos los certificados de cliente y servidor se generan al iniciar el servicio y esto toma aproximadamente 2 segundos. Sin embargo, la generación del archivo Diffie-Hellman tuvo que realizarse en el tiempo de construcción: se crea durante la construcción de la imagen de Docker y puede tardar hasta 10 minutos. Me gustaría recibir una auditoría de seguridad sobre esta solución de parte de la muy respetada comunidad.
Lanzamiento
Para iniciar el servicio necesitamos algunas cosas:
- Servidor: físico o virtual. Teóricamente, se puede ejecutar en modo Docker-en-Docker, pero no he realizado pruebas a gran escala de esta opción;
- Docker en sí. Muchos proveedores de hosting ofrecen soluciones listas con Docker 'a bordo';
- Dirección IP pública.
Si todos los requisitos están en su lugar, solo 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/openvpnEl lector atento puede haber notado que la dirección IP del servidor se determina automáticamente mediante ipify.org. Si por alguna razón esto no funciona, se puede especificar la dirección manualmente. Si todos los pasos anteriores se han realizado correctamente, deberíamos ver en la consola algo similar a esto:
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 your client config, http server will be shut down!Estamos cerca de la meta: ahora necesitamos copiar (en su caso será la dirección de su servidor) y pegar en la barra de direcciones del navegador. Después de presionar Enter, se descargará el archivo client.ovpn y el servidor http desaparecerá. Si esta solución genera dudas, puede utilizar el siguiente truco: ejecutar el comando anterior y agregar las flags zp y la contraseña. Ahora, si pega el enlace generado en la ventana del navegador, obtendrá un archivo zip con la contraseña. Cuando tenga el archivo de configuración del cliente, puede usar cualquier cliente adecuado. Yo uso Tunnelblick para Mac.
Tutorial en video
Este tutorial en video contiene instrucciones detalladas sobre cómo desplegar el servicio en DigitalOcean.

EDIT1:
- He corregido errores en la publicación,
- Respondiendo a los comentarios decidí trasladar esta información aquí: la flag —privileged es necesaria para trabajar con iptables
EDIT2:
- Mejoré el comando para ejecutar la imagen: ahora no requiere la flag —privileged
- Agregué el enlace a la guía en video en ruso:
Fuente: habr.com
