¡Hola, Habravitantes! En este libro, David Clinton describe 12 proyectos reales, incluyendo la automatización del sistema de copias de seguridad y recuperación, la configuración de un cloud personal al estilo de Dropbox y la creación de su propio servidor MediaWiki. A través de ejemplos interesantes, aprenderás sobre virtualización, recuperación ante desastres, seguridad, copias de seguridad, implementación de DevOps y resolución de problemas del sistema. Cada capítulo termina con un resumen de recomendaciones prácticas, un glosario de nuevos términos y ejercicios.
Fragmento "10.1. Creación de un túnel OpenVPN"
En este libro ya he hablado bastante sobre cifrado. SSH y SCP pueden proteger los datos transmitidos a través de conexiones remotas (capítulo 3), el cifrado de archivos permite proteger los datos almacenados en el servidor (capítulo 8), y los certificados TLS/SSL pueden proteger los datos durante la transmisión entre sitios y los navegadores de los clientes (capítulo 9). Pero a veces, tus datos requieren protección en un espectro más amplio de conexiones. Por ejemplo, es posible que algunos miembros de tu equipo necesiten trabajar en la carretera, conectándose a la red a través de Wi-Fi en puntos de acceso públicos. Definitivamente no deberías asumir que todos esos puntos de acceso son seguros, pero tus personas realmente necesitan una forma de conectarse a los recursos de la empresa, y en este caso un VPN puede ayudar.
Un túnel VPN bien diseñado proporciona una conexión directa entre clientes remotos y el servidor de manera que oculta los datos durante su transmisión a través de una red no segura. ¿Y qué? Ya has visto muchas herramientas que pueden hacer esto a través del cifrado. El verdadero valor de un VPN radica en que, al abrir un túnel, puedes conectar redes remotas como si todas fueran locales. En cierto sentido, estás utilizando un bypass.
Usando una red así de extendida, los administradores pueden realizar su trabajo en sus servidores desde cualquier lugar. Pero, más importante aún, una empresa con recursos distribuidos en varias sucursales puede hacer que todos ellos sean visibles y accesibles para todos los grupos que los necesiten, dondequiera que se encuentren (fig. 10.1).
Un túnel por sí solo no garantiza la seguridad. Pero uno de los estándares de encriptación puede incluirse en la estructura de la red, lo que aumenta considerablemente el nivel de seguridad. Los túneles creados utilizando el paquete OpenVPN de código abierto emplean la misma encriptación TLS/SSL de la que ya has leído. OpenVPN no es la única opción disponible para el tunelado, pero es una de las más conocidas. Se considera que es un poco más rápido y seguro que el protocolo de túnel alternativo de nivel 2 que utiliza encriptación IPsec.
¿Quieres que tu equipo se comunique de manera segura entre sí mientras están de viaje o trabajando en diferentes edificios? Para esto, es necesario crear un servidor OpenVPN para permitir el uso compartido de aplicaciones y el acceso al entorno de red local del servidor. Para que esto funcione, es suficiente con ejecutar dos máquinas virtuales o dos contenedores: uno para desempeñar el papel de servidor/anfitrión y el otro para el cliente. Crear una VPN no es un proceso sencillo, por lo que probablemente valga la pena dedicar unos minutos para visualizar el panorama general.

10.1.1. Configuración del servidor OpenVPN
Antes de comenzar, te daré un consejo útil. Si planeas hacerlo todo tú mismo (y te lo recomiendo encarecidamente), probablemente descubrirás que estás trabajando con varias ventanas de terminal abiertas en el escritorio, cada una conectada a su propia máquina. Existe el riesgo de que en algún momento ingreses un comando en la ventana equivocada. Para evitar esto, puedes usar el comando hostname para cambiar el nombre de la máquina que se muestra en la línea de comandos a algo que te indique claramente dónde te encuentras. Una vez que lo hagas, necesitarás salir del servidor e ingresar nuevamente para que se apliquen las nuevas configuraciones. Así es como se ve:

Siguiendo este enfoque y asignando nombres apropiados a cada una de las máquinas con las que trabajas, podrás rastrear fácilmente dónde te encuentras.
Después de usar hostname, es posible que te encuentres con mensajes molestos de Unable to Resolve Host OpenVPN-Server al ejecutar comandos posteriores. Actualizar el archivo /etc/hosts con el nuevo nombre de host correspondiente debería solucionar el problema.
Preparando tu servidor para OpenVPN
Para instalar OpenVPN en su servidor, se requieren dos paquetes: openvpn y easy-rsa (para gestionar el proceso de generación de la clave de cifrado). Los usuarios de CentOS deben instalar el repositorio epel-release si es necesario, como lo hicieron en el capítulo 2. Para poder verificar el acceso a la aplicación del servidor, también puede instalar el servidor web Apache (apache2 para Ubuntu y httpd en CentOS).
Mientras configura el servidor, le aconsejo que active el cortafuegos que bloquea todos los puertos, excepto el 22 (SSH) y el 1194 (puerto OpenVPN por defecto). Este ejemplo ilustra cómo funcionará ufw en Ubuntu, pero estoy seguro de que aún recuerda el programa firewalld de CentOS del capítulo 9:
# ufw enable
# ufw allow 22
# ufw allow 1194Para permitir la ruta interna entre las interfaces de red en el servidor, debe descomentar una línea (net.ipv4.ip_forward = 1) en el archivo /etc/sysctl.conf. Esto permitirá redirigir a los clientes remotos según sea necesario después de que se conecten. Para que el nuevo parámetro entre en funcionamiento, ejecute sysctl -p:
# nano /etc/sysctl.conf
# sysctl -pAhora el entorno del servidor está completamente configurado, pero hay algo más que hacer antes de que esté listo: deberá realizar los siguientes pasos (los discutiremos en detalle más adelante).
- Cree en el servidor un conjunto de claves para la infraestructura de clave pública (PKI) utilizando los scripts que vienen con el paquete easy-rsa. En esencia, el servidor OpenVPN también actúa como su propia autoridad certificadora (AC).
- Prepare las claves correspondientes para el cliente
- Configure el archivo server.conf para el servidor
- Configure su cliente OpenVPN
- Verifique su VPN
Generación de claves de cifrado
Para no complicar las cosas, puede configurar su infraestructura de claves en la misma máquina donde funciona el servidor OpenVPN. Sin embargo, en las recomendaciones de seguridad, generalmente se sugiere utilizar un servidor AC separado para implementaciones en un entorno de producción. El proceso de generación y distribución de recursos de la clave de cifrado para su uso en OpenVPN se ilustra en la figura 10.2.

Cuando instaló OpenVPN, se creó automáticamente el directorio /etc/openvpn/, pero actualmente está vacío. Los paquetes openvpn y easy-rsa vienen con ejemplos de archivos plantilla que puede usar como base para su configuración. Para iniciar el proceso de certificación, copie el directorio de plantilla easy-rsa de /usr/share/ a /etc/openvpn y vaya al directorio easy-rsa/:
# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsaEl catálogo de easy-rsa ahora contará con una buena cantidad de scripts. En la tabla 10.1 se enumeran las herramientas que utilizará para crear claves.

Las operaciones enumeradas requieren privilegios de root, por lo que debe convertirse en root usando sudo su.
El primer archivo con el que trabajará se llama vars y contiene las variables de entorno que easy-rsa utiliza al generar claves. Necesita editar el archivo para usar sus propios valores en lugar de los valores predeterminados que ya tiene. Así es como se verá mi archivo (listado 10.1).
Listado 10.1. Fragmentos principales del archivo /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="info@bootstrap-it.com"
export KEY_OU="IT"Ejecutar el archivo vars permitirá transferir sus valores al entorno de la shell, desde donde se incluirán en el contenido de sus nuevas claves. ¿Por qué el comando sudo por sí solo no funciona? Porque en la primera etapa estamos editando un script llamado vars y luego lo aplicamos. Aplicar significa que el archivo vars transmite sus valores al entorno de la shell, donde se incluirán en el contenido de sus nuevas claves.
Asegúrese de ejecutar el archivo nuevamente, usando una nueva shell, para completar el proceso inacabado. Una vez hecho esto, el script le sugerirá ejecutar otro script, clean-all, para eliminar cualquier contenido en el directorio /etc/openvpn/easy-rsa/keys/:

Naturalmente, el siguiente paso será ejecutar el script clean-all, seguido de build-ca, que utiliza el script pkitool para crear el certificado raíz. Se le pedirá que confirme la configuración de identificación proporcionada por vars:
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private keyA continuación, viene el script build-key-server. Dado que utiliza el mismo script pkitool junto con el nuevo certificado raíz, verá las mismas preguntas para confirmar la creación del par de claves. Los nombres de las claves se asignarán en función de los argumentos que pase, que, a menos que esté ejecutando varias VPN en esta computadora, generalmente serán server, como en el ejemplo:
# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base UpdatedOpenVPN utiliza parámetros generados mediante el algoritmo de Diffie-Hellman (usando build-dh) para establecer la autenticación de nuevas conexiones. El archivo creado aquí no debe ser secreto, pero debe generarse utilizando el script build-dh para las claves RSA que están activas en este momento. Si genera nuevas claves RSA en el futuro, también será necesario actualizar el archivo basado en el algoritmo de Diffie-Hellman:
# ./build-dhAhora, sus claves en el lado del servidor estarán en el directorio /etc/openvpn/easy-rsa/keys/, pero OpenVPN no lo sabe. Por defecto, OpenVPN buscará claves en /etc/openvpn/, así que cópielas:
# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpnPreparación de claves de cifrado del cliente
Como ya ha visto, en el cifrado TLS se utilizan pares de claves correspondientes: una establecida en el servidor y la otra en el cliente remoto. Esto significa que necesitará las claves del cliente. Nuestro viejo amigo pkitool es justo lo que se necesita para esto. En este ejemplo, al ejecutar el programa en el directorio /etc/openvpn/easy-rsa/, le pasamos el argumento client para generar archivos llamados client.crt y client.key:
# ./pkitool clientLos dos archivos del cliente junto con el archivo original ca.crt, que todavía se encuentra en el directorio keys/, ahora deben ser enviados de forma segura a su cliente. Debido a su pertenencia y permisos, esto puede no ser una tarea fácil. El enfoque más sencillo es copiar manualmente el contenido del archivo original (y nada más que ese contenido) en un terminal que esté funcionando en el escritorio de su PC (resalte el texto, haga clic derecho sobre él y seleccione en el menú la opción Copiar). Luego, pegue esto en un nuevo archivo con el mismo nombre que está creando en el segundo terminal conectado a su cliente.
Pero cualquiera puede cortar y pegar. Usted debe pensar como un administrador, porque no siempre tendrá acceso a una GUI donde sea posible la operación de cortar/pegar. Copie los archivos en el directorio de inicio de su usuario (para que la operación remota scp pueda acceder a ellos) y luego use chown para cambiar el propietario de los archivos de root a un usuario normal sin privilegios de root, de modo que se pueda realizar la acción remota scp. Asegúrese de que todos sus archivos estén instalados y accesibles en este momento. Los moverá al cliente un poco más tarde:
# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crtCon un conjunto completo de claves de encriptación listas para usar, debe indicar al servidor cómo desea crear la VPN. Esto se hace con el archivo server.conf.
Reduciendo la cantidad de pulsaciones de teclas
¿Tienes que escribir demasiado? La extensión con paréntesis ayudará a reducir esos seis comandos a dos. Estoy seguro de que podrás estudiar estos dos ejemplos y entender qué está pasando. Más importante aún, podrás comprender cómo aplicar estos principios a operaciones que incluyen decenas o incluso cientos de elementos:
# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}
Configuración del archivo server.conf
¿De dónde puede saber cómo debería verse el archivo server.conf? Recuerde la plantilla del directorio easy-rsa que copió de /usr/share/? Al instalar OpenVPN quedó un archivo comprimido de plantilla de configuración que puede copiar en /etc/openvpn/. Me basaré en el hecho de que la plantilla está archivada y le presentaré una herramienta útil: zcat.
Ya sabe cómo mostrar el contenido de texto de un archivo en la pantalla usando el comando cat, pero ¿qué sucede si el archivo está comprimido con gzip? Siempre puede descomprimir el archivo y entonces cat lo mostrará encantado, pero eso es un paso o dos más de lo necesario. En cambio, como ya se habrá dado cuenta, puede usar el comando zcat para cargar el texto descomprimido en la memoria de un solo paso. En el siguiente ejemplo, en lugar de imprimir el texto en la pantalla, lo redirigirá a un nuevo archivo llamado server.conf:
# zcat
/usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
> /etc/openvpn/server.conf
$ cd /etc/openvpnDejemos de lado la extensa y útil documentación adjunta al archivo y veamos cómo podría verse cuando haya terminado de editar. Tenga en cuenta que el punto y coma (;) indica a OpenVPN que no lea ni ejecute la siguiente línea (listado 10.2).

Vamos a repasar algunas de estas configuraciones.
- Por defecto, OpenVPN funciona a través del puerto 1194. Puede cambiar esto, por ejemplo, para ocultar aún más sus acciones o evitar conflictos con otros túneles activos. Dado que 1194 requiere una coordinación mínima con los clientes, lo mejor es hacerlo así.
- OpenVPN utiliza el protocolo de control de transmisión (TCP) o el protocolo de datagramas de usuario (UDP) para la transmisión de datos. TCP puede ser un poco más lento, pero es más confiable y es más probable que sea comprensible para las aplicaciones que funcionan en ambos extremos del túnel.
- Puedes especificar dev tun cuando quieras crear un túnel IP más simple y eficiente que transmite el contenido de datos y nada más. Si, por otro lado, necesitas conectar varias interfaces de red (y las redes que representan), debes elegir dev tap. Si no entiendes lo que esto significa, utiliza el argumento tun.
- Las siguientes cuatro líneas pasan a OpenVPN los nombres de tres archivos de autenticación en el servidor y el archivo de parámetros dh2048 que creaste anteriormente.
- La línea server establece el rango y la máscara de subred que se utilizarán para asignar direcciones IP a los clientes al iniciar sesión.
- El parámetro opcional push "route 10.0.3.0 255.255.255.0" permite que los clientes remotos accedan a subredes privadas detrás del servidor. Para que esto funcione, también se requiere una configuración de red en el propio servidor para que la subred privada reconozca la subred de OpenVPN (10.8.0.0).
- La línea port-share localhost 80 permite redirigir el tráfico de los clientes que llega a través del puerto 1194 al servidor web local que escucha en el puerto 80. (Esto será útil si planeas utilizar un servidor web para probar tu VPN). Esto solo funciona cuando se selecciona el protocolo tcp.
- Las líneas user nobody y group nogroup deben estar activas; para ello, hay que eliminar los puntos y comas (;). Hacer que los clientes remotos se ejecuten como nobody y nogroup garantiza que las sesiones en el servidor sean no privilegiadas.
- log indica que las entradas actuales en el registro reemplazarán las antiguas en cada inicio de OpenVPN, mientras que log-append añade nuevas entradas al archivo de registro existente. El archivo mismo openvpn.log se registra en el directorio /etc/openvpn/.
Además, el valor client-to-client se agrega a menudo al archivo de configuración para que varios clientes puedan verse entre sí además del servidor OpenVPN. Si estás satisfecho con tu configuración, puedes iniciar el servidor OpenVPN:
# systemctl start openvpnDebido a la naturaleza cambiante de las relaciones entre OpenVPN y systemd, a veces puede ser necesario usar la siguiente sintaxis para iniciar el servicio: systemctl start openvpn@server.
Ejecutar ip addr para mostrar la lista de interfaces de red de tu servidor ahora debería devolver una referencia a la nueva interfaz llamada tun0. OpenVPN la creará para manejar los clientes entrantes:
$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft foreverEs posible que necesite reiniciar el servidor antes de que todo funcione completamente. La siguiente parada es el ordenador del cliente.
10.1.2. Configuración del cliente OpenVPN
Tradicionalmente, los túneles se construyen con al menos dos salidas (de lo contrario, los llamaríamos cuevas). Un OpenVPN correctamente configurado en el servidor dirige el tráfico hacia el túnel y desde él por un lado. Pero también necesitará algún software que funcione del lado del cliente, es decir, en el otro extremo del túnel.
En esta sección, me centraré en la configuración manual de un ordenador con Linux de algún tipo para que funcione como cliente OpenVPN. Pero esta no es la única forma en que se puede acceder a esta funcionalidad. OpenVPN admite aplicaciones cliente que se pueden instalar y utilizar en ordenadores de escritorio y portátiles con Windows o macOS, así como en teléfonos inteligentes y tabletas con Android e iOS. Para más detalles, consulte openvpn.net.
El paquete OpenVPN debe instalarse en el ordenador del cliente, tal como se instaló en el servidor, aunque aquí no se necesita easy-rsa, ya que las claves que está utilizando ya existen. Debe copiar el archivo de plantilla client.conf en el directorio /etc/openvpn/, que se acaba de crear. Esta vez, el archivo no estará comprimido, por lo que el comando cp funcionará perfectamente:
# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf
/etc/openvpn/La mayoría de las configuraciones en su archivo client.conf serán bastante comprensibles: deben coincidir con los valores en el servidor. Como se ve en el siguiente ejemplo de archivo, el parámetro único es remote 192.168.1.23 1194, que indica al cliente la dirección IP del servidor. Asegúrese nuevamente de que esta sea la dirección de su servidor. También debe hacer que la computadora del cliente verifique la autenticidad del certificado del servidor para prevenir posibles ataques de 'hombre en el medio'. Una forma de hacerlo es agregando la línea remote-cert-tls server (listado 10.3).

Ahora puede acceder al directorio /etc/openvpn/ y extraer las claves de certificación desde el servidor. Reemplace la dirección IP del servidor o el nombre de dominio en el ejemplo por sus propios valores:

No ocurrirá nada emocionante hasta que inicies OpenVPN en el cliente. Como necesitas pasar un par de argumentos, lo harás desde la línea de comandos. El argumento —tls-client le indica a OpenVPN que actuarás como cliente y te conectarás a través de cifrado TLS, y —config señala tu archivo de configuración:
# openvpn --tls-client --config /etc/openvpn/client.confLee atentamente la salida del comando para asegurarte de que estás correctamente conectado. Si algo sale mal la primera vez, podría deberse a un desacuerdo entre las configuraciones de los archivos del servidor y el cliente o a un problema de conexión de red/cortafuegos. Aquí hay algunos consejos sobre cómo solucionar problemas.
- Revisa cuidadosamente la salida de la operación OpenVPN en el cliente. A menudo contiene consejos valiosos sobre lo que no se puede realizar y por qué.
- Verifica los mensajes de error en los archivos openvpn.log y openvpn-status.log en el directorio /etc/openvpn/ en el servidor.
- Revisa los mensajes relacionados con OpenVPN y los tiempos pertinentes en los registros del sistema en el servidor y el cliente. (journalctl -ce mostrará las entradas más recientes.)
- Asegúrate de que tienes una conexión de red activa entre el servidor y el cliente (más detalles en el capítulo 14).
Sobre el autor
David Clinton es administrador de sistemas, instructor y escritor. Ha administrado, escrito sobre ello y creado materiales de instrucción para muchas disciplinas técnicas importantes, incluyendo sistemas Linux, computación en la nube (especialmente AWS) y tecnologías de contenedores como Docker. Es autor del libro Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Muchos de sus cursos de video de capacitación se pueden encontrar en Pluralsight.com, y los enlaces a otros de sus libros (sobre administración de Linux y virtualización de servidores) están disponibles en .
» Para más detalles sobre el libro, puedes consultar
»
»
Para los usuarios de Habr, descuento del 25% con el cupón — Linux
Tras el pago de la versión en papel del libro, se envía el libro electrónico por correo electrónico.
Fuente: habr.com
