
Hola habrozhiteli! En el libro, David Clinton describe 12 proyectos del mundo real, incluida la automatización de un sistema de copia de seguridad y recuperación, la configuración de una nube de archivos personal de estilo Dropbox y la creación de su propio servidor MediaWiki. Con ejemplos interesantes, aprenderá sobre virtualización, recuperación ante desastres, seguridad, respaldo, implementación de DevOps y resolución de problemas del sistema. Cada capítulo termina con una revisión de recomendaciones prácticas, un glosario de nuevos términos y ejercicios.
Extracto "10.1. Crear un túnel OpenVPN »
En este libro, ya he hablado mucho sobre el cifrado. SSH y SCP pueden proteger los datos transmitidos a través de conexiones remotas (capítulo 3), el cifrado de archivos le permite proteger los datos cuando se almacenan en el servidor (capítulo 8), y los certificados TLS / SSL pueden proteger los datos durante la transmisión entre sitios y navegadores de clientes (capítulo 9). Pero a veces sus datos requieren protección en una gama más amplia de conexiones. Por ejemplo, es posible que algunos miembros de su equipo tengan que trabajar en la carretera, conectándose a la red a través de Wi-Fi a través de puntos de acceso público. Definitivamente no debe suponer que todos estos puntos de acceso son seguros, pero su gente realmente necesita una forma de conectarse a los recursos de la compañía, en cuyo caso una VPN ayudará.
Un túnel VPN correctamente diseñado proporciona una conexión directa entre clientes remotos y el servidor de tal manera que oculta datos cuando se transmiten a través de una red insegura. ¿Y qué? Ya has visto muchas herramientas que pueden hacer esto con el cifrado. El valor real de las VPN es que al abrir el túnel, puede conectar redes remotas, como si todas fueran locales. En cierto sentido, está utilizando una solución alternativa.
Usando una red tan extendida, los administradores pueden hacer su trabajo en sus servidores desde cualquier lugar. Pero, lo que es más importante, una empresa con recursos distribuidos en varias sucursales puede hacerlos visibles y accesibles para todos los grupos que los necesitan, donde sea que estén (Fig. 10.1).
El túnel en sí no garantiza la seguridad. Pero uno de los estándares de cifrado se puede incluir en la estructura de la red, lo que aumenta significativamente el nivel de seguridad. Los túneles creados con el paquete OpenVPN de código abierto usan el mismo cifrado TLS / SSL del que ya leíste. OpenVPN no es la única opción disponible para hacer túneles, sino una de las más famosas. Se cree que es un poco más rápido y más seguro que un protocolo de túnel de capa 2 alternativo que utiliza encriptación IPsec.
¿Desea que todos en su equipo se comuniquen de manera segura entre ellos mientras están en la carretera o trabajando en diferentes edificios? Para hacer esto, debe 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 iniciar dos máquinas virtuales o dos contenedores: uno para actuar como servidor / host y el otro para el cliente. Crear una VPN no es un proceso fácil, por lo que probablemente valga la pena tomarse unos minutos para tener una idea general.
10.1.1. Configurar el servidor OpenVPN
Antes de comenzar, te daré consejos útiles. Si va a hacer todo usted mismo (y lo recomiendo encarecidamente), probablemente encontrará que está trabajando con varias ventanas de terminal abiertas en el Escritorio, cada una de las cuales está conectada a su máquina. Existe el riesgo de que en algún momento ingrese el comando incorrecto en la ventana. Para evitar esto, puede usar el comando hostname para cambiar el nombre de la máquina que se muestra en la línea de comando a algo que le diga claramente dónde se encuentra. Tan pronto como haga esto, deberá salir del servidor e iniciar sesión nuevamente para que la nueva configuración surta efecto. Así es como se ve:
Adhiriéndose a este enfoque y asignando los nombres correspondientes a cada una de las máquinas con las que trabaja, puede rastrear fácilmente dónde se encuentra.
Después de usar el nombre de host, puede encontrar molestos mensajes de No se puede resolver Host OpenVPN-Server cuando ejecuta los siguientes comandos. La actualización del archivo / etc / hosts con el nuevo nombre de host correspondiente debería solucionar el problema.
Preparando su servidor para OpenVPN
La instalación de OpenVPN en su servidor requiere dos paquetes: openvpn y easy-rsa (para controlar el proceso de generación de la clave de cifrado). Si es necesario, los usuarios de CentOS deben instalar primero el repositorio de epel-release, como lo hizo 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 un firewall que bloquee todos los puertos excepto el 22 (SSH) y el 1194 (el puerto predeterminado de OpenVPN). Este ejemplo ilustra cómo funcionará ufw en Ubuntu, pero estoy seguro de que aún recuerda el programa CentOS del firewall del capítulo 9:
# ufw enable # ufw allow 22 # ufw allow 1194
Para permitir el enrutamiento interno 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 le permitirá redirigir clientes remotos según sea necesario después de que se conecten. Para que el nuevo parámetro funcione, ejecute sysctl -p:
# nano /etc/sysctl.conf # sysctl -p
Ahora el entorno del servidor está completamente configurado, pero hay algo más que hacer antes de que esté listo: deberá completar los siguientes pasos (los consideraremos con más detalle a continuación).
- Cree un conjunto de claves en el servidor para cifrar 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 de certificación (CA).
- Prepare las claves apropiadas para el cliente.
- Configure el archivo server.conf para el servidor
- Configure su cliente OpenVPN
- Verifica tu VPN
Generación de clave de cifrado
Para no complicar su vida, puede configurar su infraestructura clave en la misma máquina donde se ejecuta el servidor OpenVPN. Sin embargo, las recomendaciones de seguridad generalmente sugieren el uso de un servidor de CA separado para implementaciones en un entorno de producción. El proceso de generación y asignación de recursos clave de cifrado para su uso en OpenVPN se ilustra en la Fig. 10.2
Cuando instaló OpenVPN, el directorio / etc / openvpn / se creó automáticamente, pero todavía no hay nada en él. Los paquetes openvpn y easy-rsa vienen con archivos de plantilla de muestra 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 / to / etc / openvpn y cambie al directorio easy-rsa /:
# cp -r /usr/share/easy-rsa/ /etc/openvpn $ cd /etc/openvpn/easy-rsa
El directorio easy-rsa ahora contendrá bastantes scripts. En la mesa 10.1 enumera las herramientas que usará para crear claves.
Estas operaciones requieren privilegios de root, por lo que a través de sudo su debe convertirse en root.
El primer archivo con el que trabajará se llama vars y contiene las variables de entorno que easy-rsa usa al generar claves. Debe editar el archivo para usar sus propios valores en lugar de los valores predeterminados que ya existen. Así es como se verá mi archivo (Listado 10.1).
Listado 10.1. Los 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"
La ejecución del archivo vars le permitirá transferir sus valores al entorno de shell, desde donde se incluirán en el contenido de sus nuevas claves. ¿Por qué no funciona solo el comando sudo? Porque en la primera etapa, editamos el script llamado vars y luego lo aplicamos. Aplicación y significa que el archivo vars transfiere sus valores al entorno de shell, desde donde se incluirán en el contenido de sus nuevas claves.
Asegúrese de volver a ejecutar el archivo utilizando el nuevo shell para completar el proceso inacabado. Cuando se hace esto, el script le pedirá que ejecute otro script, clean-all, para eliminar cualquier contenido en el directorio / etc / openvpn / easy-rsa / keys /:
Naturalmente, el siguiente paso es 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 autenticación proporcionada por vars:
# ./clean-all # ./build-ca Generating a 2048 bit RSA private key
Luego viene la secuencia de comandos del servidor build-key. Como usa el mismo script pkitool junto con el nuevo certificado raíz, verá las mismas preguntas para confirmar la creación del par de claves. Las claves recibirán nombres en función de los argumentos que pase, que, a menos que inicie varias VPN en esta computadora, generalmente serán servidores, 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 Updated
OpenVPN usa los parámetros generados por el algoritmo Diffie-Hellman (usando build-dh) para negociar la autenticación de nuevas conexiones. El archivo creado aquí no debe ser secreto, sino que debe generarse utilizando el script build-dh para las claves RSA que están activas actualmente. Si crea nuevas claves RSA en el futuro, también necesitará actualizar el archivo basado en el algoritmo Diffie-Hellman:
# ./build-dh
Sus claves del lado del servidor ahora 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/openvpn
Preparación de claves de cifrado del cliente
Como ya ha visto, el cifrado TLS utiliza pares de claves correspondientes: una está instalada en el servidor y la otra en el cliente remoto. Esto significa que necesitará claves de cliente. Nuestro viejo amigo pkitool es exactamente lo que necesitas para esto. En este ejemplo, ejecutando el programa en el directorio / etc / openvpn / easy-rsa /, le pasamos el argumento del cliente para generar archivos llamados client.crt y client.key:
# ./pkitool client
Los dos archivos del cliente, junto con el archivo ca.crt original, que todavía está en el directorio keys /, ahora deben transferirse de manera segura a su cliente. Debido a sus derechos de afiliación y acceso, esto puede no ser tan fácil. El enfoque más fácil es copiar manualmente el contenido del archivo fuente (y nada más que este contenido) al terminal que se ejecuta en el escritorio de su PC (seleccione el texto, haga clic derecho sobre él y seleccione Copiar en el menú). Luego pegue esto en un nuevo archivo con el mismo nombre que creó en el segundo terminal conectado a su cliente.
Pero cualquiera puede cortar y pegar. En cambio, piense como administrador, porque no siempre tendrá acceso a la GUI, donde es posible una operación de cortar / pegar. Copie los archivos en el directorio de inicio de su usuario (para que la operación scp remota pueda acceder a ellos), y luego use chown para cambiar el propietario de los archivos de root a un usuario regular no root para que se pueda realizar la acción scp remota. Asegúrese de que todos sus archivos estén actualmente instalados y accesibles. 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.crt
Con un conjunto completo de claves de cifrado listas para la acción, debe decirle al servidor cómo desea crear una VPN. Esto se hace usando el archivo server.conf.
Reduce la cantidad de pulsaciones de teclas
¿Demasiado para imprimir? Una extensión con paréntesis ayudará a reducir estos seis comandos a dos. Estoy seguro de que puede estudiar estos dos ejemplos y comprender lo que está sucediendo. Más importante aún, puede comprender cómo aplicar estos principios a las operaciones que involucran docenas 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}}
Configurar el archivo server.conf
¿Cómo puede saber cómo debería ser el archivo server.conf? ¿Recuerda la plantilla de directorio easy-rsa que copió de / usr / share /? Durante la instalación de OpenVPN, quedó un archivo de plantilla de configuración comprimido, que puede copiar a / etc / openvpn /. Construiré sobre el hecho de que la plantilla ha sido archivada y te presentaré una herramienta útil: zcat.
Ya sabe cómo mostrar el contenido de texto de un archivo con el comando cat, pero ¿qué sucede si el archivo se comprime con gzip? Siempre puede descomprimir el archivo y luego cat lo mostrará con gusto, pero este es uno o dos pasos más de lo necesario. En cambio, como probablemente ya haya adivinado, puede ingresar el comando zcat para cargar el texto desempaquetado en la memoria en un solo paso. En el siguiente ejemplo, en lugar de imprimir texto en la pantalla, lo redirige 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/openvpn
Dejamos de lado la extensa y útil documentación que vino con el archivo y vemos cómo podría verse cuando termine de editar. Tenga en cuenta que el punto y coma (;) le dice a OpenVPN que no lea ni ejecute la siguiente línea (Listado 10.2).
Veamos algunas de estas configuraciones.
- De forma predeterminada, OpenVPN funciona a través del puerto 1194. Puede cambiar esto, por ejemplo, para ocultar sus acciones aún más o para evitar conflictos con otros túneles activos. Como 1194 requiere una coordinación mínima con los clientes, es mejor hacerlo.
- OpenVPN utiliza el Protocolo de control de transmisión (TCP) o el Protocolo de datagramas de usuario (UDP) para la transferencia de datos. TCP puede ser un poco más lento, pero es más confiable y es más probable que las aplicaciones que se ejecutan en ambos extremos del túnel lo entiendan.
- Puede decirle a dev tun cuándo desea crear un túnel IP más simple y eficiente que transmita el contenido de los datos y nada más. Si, por otro lado, necesita conectar varias interfaces de red (y las redes que representan) creando un puente Ethernet, deberá seleccionar dev tap. Si no comprende lo que significa todo esto, use el argumento tun.
- Las siguientes cuatro líneas pasan los nombres OpenVPN de los tres archivos de autenticación en el servidor y el archivo de configuración dh2048 que creó anteriormente.
- La línea del servidor 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 push opcional "ruta 10.0.3.0 255.255.255.0" permite a los clientes remotos acceder a subredes privadas detrás del servidor. Para realizar este trabajo, también debe configurar la red en el servidor, de modo que la subred privada conozca la subred OpenVPN (10.8.0.0).
- La línea localhost 80 de puerto compartido le permite redirigir el tráfico del cliente que llega a través del puerto 1194 al servidor web local que escucha en el puerto 80. (Esto será útil si tiene la intención de utilizar el servidor web para probar su VPN). Esto solo funciona si cuando se selecciona el protocolo tcp.
- El usuario nobody y el grupo nogroup lines deben estar activos; para hacer esto, elimine los puntos y comas (;). Al obligar a los clientes remotos a trabajar con nobody y nogroup, se garantiza que las sesiones en el servidor no tengan privilegios.
- log indica que las entradas de registro actuales sobrescribirán las entradas antiguas cada vez que se inicie OpenVPN, mientras que log-append agrega nuevas entradas a un archivo de registro existente. El archivo openvpn.log se escribe en el directorio / etc / openvpn /.
Además, el valor de cliente a cliente también se agrega a menudo al archivo de configuración para que varios clientes puedan verse entre sí además del servidor OpenVPN. Si está satisfecho con su configuración, puede iniciar el servidor OpenVPN:
# systemctl start openvpn
Debido a la naturaleza cambiante de la relación entre OpenVPN y systemd, a veces puede ser necesaria la siguiente sintaxis para iniciar un servicio: systemctl start openvpn @ server.
Ejecutar ip addr para mostrar la lista de interfaces de red de su servidor ahora debería mostrar un enlace a una nueva interfaz llamada tun0. OpenVPN lo creará para servir a 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 forever
Es posible que deba reiniciar el servidor antes de que todo comience a funcionar por completo. La siguiente parada es la computadora 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 configurado correctamente en el servidor dirige el tráfico hacia y desde el túnel, por un lado. Pero también necesita algún tipo de software del lado del cliente, es decir, en el otro extremo del túnel.
En esta sección, me enfocaré en configurar manualmente una computadora Linux de un tipo u otro para que funcione como un cliente OpenVPN. Pero esta no es la única forma en que esta oportunidad está disponible. OpenVPN admite aplicaciones cliente que se pueden instalar y utilizar en computadoras de escritorio y portátiles con Windows o macOS, así como en teléfonos inteligentes y tabletas basados en Android e iOS. Ver openvpn.net para más detalles.
El paquete OpenVPN deberá instalarse en la computadora del cliente, tal como se instaló en el servidor, aunque no hay necesidad de easy-rsa, ya que las claves que usa ya existen. Debe copiar el archivo de plantilla client.conf en el directorio / etc / openvpn / que acaba de crear. Esta vez, el archivo no se archivará, por lo que el comando cp normal hará esta tarea 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 sencillas: deben coincidir con los valores en el servidor. Como puede ver en el siguiente ejemplo de archivo, el parámetro único es remoto 192.168.1.23 1194, que le indica al cliente la dirección IP del servidor. Nuevamente, asegúrese de que esta sea la dirección de su servidor. También debe obligar a la computadora cliente a autenticar el certificado del servidor para evitar un posible ataque de intermediario. Una forma de hacerlo es agregar la línea de servidor remote-cert-tls (Listado 10.3).
Ahora puede ir al directorio / etc / openvpn / y extraer las claves de certificación del servidor. Reemplace la dirección IP del servidor o el nombre de dominio en el ejemplo con sus valores:
Es probable que no ocurra nada emocionante hasta que ejecute OpenVPN en el cliente. Como necesita pasar un par de argumentos, lo hará desde la línea de comandos. El argumento --tls-client le dice a OpenVPN que actuará como cliente y se conectará usando el cifrado TLS, y --config señala su archivo de configuración:
# openvpn --tls-client --config /etc/openvpn/client.conf
Lea la salida del comando cuidadosamente para asegurarse de que está conectado correctamente. Si por primera vez algo sale mal, esto puede deberse a una falta de coincidencia entre la configuración entre el servidor y los archivos de configuración del cliente o un problema de conexión de red / firewall. Aquí hay algunos consejos para la solución de problemas.
- Lea atentamente el resultado de la operación OpenVPN en el cliente. A menudo contiene valiosos consejos sobre qué no se puede realizar exactamente y por qué.
- Verifique los mensajes de error en los archivos openvpn.log y openvpn-status.log en el directorio / etc / openvpn / en el servidor.
- Verifique los mensajes relacionados con OpenVPN y los tiempos apropiados en los registros del sistema en el servidor y el cliente. (journalctl -ce mostrará las entradas más recientes).
- Asegúrese de tener una conexión de red activa entre el servidor y el cliente (para más detalles, consulte el capítulo 14).
Sobre el autor
David Clinton es administrador del sistema, maestro y escritor. Administró, escribió sobre él y creó materiales de capacitación para muchas disciplinas técnicas importantes, incluidos los sistemas Linux, la computación en la nube (en particular AWS) y las tecnologías de contenedores como Docker. Escribió el libro Learn Amazon Web Services en un mes de almuerzos (Manning, 2017). Muchos de sus videos tutoriales se pueden encontrar en Pluralsight.com, y los enlaces a sus otros libros (sobre administración de Linux y virtualización de servidores) están disponibles en
bootstrap-it.com .
»Se puede encontrar más información sobre el libro en
el sitio web del editor»
Contenidos»
ExtractoCupón de 25% de descuento para vendedores ambulantes -
LinuxTras el pago de la versión en papel del libro, se envía un libro electrónico por correo electrónico.