Un montón de OpenVPN en Windows Server y Mikrotik con la migración de estas cosas a Linux

Bueno

Cada empresa, tarde o temprano, de repente, necesita acceso remoto.
Prácticamente todos los especialistas de TI se enfrentan a la necesidad de organizar el acceso remoto a sus redes en la empresa.
Yo, como muchos, esta necesidad cubierta con el sello "ayer". Después de analizar todos los pros y los contras, además de recoger toneladas de información y excavar un poco en teoría, decidí continuar con la instalación.

Por razones de seguridad, elegí OpenVPN en la siguiente implementación: se instaló una máquina virtual en un servidor que ejecuta Windows Server 2012, también se instaló Windows Server 2012 y, a su vez, un servidor OpenVPN que emitió y firmó certificados.

Por conveniencia, lo llamaremos un "servidor de certificación". Además, tomó un certificado de servidor, lo introdujo en Mikrotik y, en el enrutador, Mikrotik levantó OpenVPN con cuentas y perfiles. También utilicé un servidor de certificación para emitir un certificado de cliente.

La implementación, por supuesto, es horrible, y aunque en ese momento mi experiencia en tales cosas era, por ejemplo, insuficiente, en materia de seguridad, esta no fue una mala decisión.

Este paquete funcionó durante un tiempo y me dieron una nueva introducción: transferir el servidor de certificación a Linux, manteniendo la conexión con Mikrotik, los clientes no deberían sufrir.

Mi conocimiento de Linux en ese momento terminó en Ubuntu 16.04LTS con una interfaz gráfica que se utilizó como terminal para conectarse a través de RDP a un servidor de Windows. Es decir, sudo apt-get -f install -y, y no un centímetro más.

Después de estudiar la pregunta de qué sistema operativo de la familia Linux es más estable y prometedor para mi organización, me decidí por CentOS 7 Minimal.

Para empezar, decidí profundizar un poco en la teoría, para entender cómo funciona y funciona en general. Vi los videos tutoriales en el canal www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Generalmente no es un anuncio, solo me atraparon primero). La chica con una voz agradable me presentó los conceptos básicos para trabajar en el sistema operativo seleccionado.

Para comenzar, inicié Hyper-V en mi computadora, instalé CentOS 7 Minimal allí, durante la instalación creé el usuario Administrador y cerré completamente ssh para root. Despidiéndose de una hermosa pantalla multicolor, sumergida en el mundo blanco y negro de la terminal.

Creo que no tiene sentido describir el proceso de instalación del software, es mejor enfocarse en los problemas que surgieron durante el proceso y resolver que tuve que escribir un pequeño script (está bajo un gato. La descripción de cada una de las utilidades se puede encontrar en Internet, pero en ese momento cuando estoy todo lo hice, este script aún no estaba allí, todo se hizo por primera vez, al tacto y al azar).

En el script, traté de automatizar la instalación de las utilidades mínimas necesarias para el servidor, deshabilitar Selinux, conectar el repositorio de Epel, instalar OpenVPN, etc. A continuación se encuentra el script en sí, es simple, pero se puede usar. No lo desmontaré, pero si alguien lo necesita, escriba una respuesta.

Después de usar el script, aparecerá un servidor OpenVPN ya configurado, parpadeando con un ojo verde.

UPD: Hizo algunos ajustes al guión, sacando conclusiones de los comentarios. No comenzó a eliminar sus errores, sino que simplemente comentó para que el hilo de comentarios no se perdiera. Se agregaron líneas empujadas hacia atrás para mayor visibilidad.

#!/bin/bash cd /etc/sysconfig/ sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' selinux sudo setenforce 0 cd /home/Admin sudo yum update -y sudo yum install epel-release -y sudo yum install mc -y sudo yum install nano -y sudo cp /usr/share/mc/syntax/sh.syntax /usr/share/mc/syntax/unknown.syntax sudo yum install chrony -y sudo systemctl start chronyd sudo systemctl enable chronyd sudo yum install net-tools -y sudo yum install iftop -y sudo yum install htop -y sudo yum install lsof -y sudo yum install dos2unix -y sudo yum install wget -y sudo yum install tcpdump -y sudo yum install openvpn -y wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.tgz sudo tar -xvzf EasyRSA-3.0.3.tgz #sudo chown -R Admin:Admin /var/log #sudo chmod 755 /var/log sudo mkdir /var/log/openvpn sudo mkdir /etc/openvpn/ccd sudo chown -R Admin:Admin /etc/openvpn/ccd sudo chown -R Admin:Admin /var/log/openvpn chmod 755 /etc/openvpn/ccd chmod 755 /var/log/openvpn echo >/var/log/openvpn/openvpn-status.log echo >/var/log/openvpn/openvpn.log #sudo chown -R Admin:Admin /etc/resolv.conf sudo chmod 777 /etc/resolv.conf echo nameserver 8.8.8.8 >>/etc/resolv.conf chmod 755 /etc/resolv.conf cd /etc/openvpn/ sudo /home/Admin/EasyRSA-3.0.3/easyrsa init-pki sudo chown -R Admin:Admin /etc/openvpn chmod 755 /etc/openvpn echo set_var EASYRSA_DN "org" >/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_COUNTRY "RU" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_KEY_SIZE 4096 >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_PROVINCE "LIP" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_CITY "Lipetsk" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_ORG "Cool-Admin" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_EMAIL "xxx.ru" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_OU "Our_ORG" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_REQ_CN "changeme" >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_CERT_EXPIRE 3650 >>/home/Admin/EasyRSA-3.0.3/test echo set_var EASYRSA_DH_KEY_SIZE=2048 >>/home/Admin/EasyRSA-3.0.3/test sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-ca nopass sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-server-full Serv nopass sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-client-full Client1 nopass sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-dh sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-crl mkdir keys sudo chown -R Admin:Admin /etc/openvpn/keys chmod 755 /etc/openvpn/keys sudo cp /etc/openvpn/pki/ca.crt /etc/openvpn/keys sudo cp /etc/openvpn/pki/dh.pem /etc/openvpn/keys sudo cp /etc/openvpn/pki/crl.pem /etc/openvpn/keys sudo cp /etc/openvpn/pki/issued/Serv.crt /etc/openvpn/keys sudo cp /etc/openvpn/pki/private/Serv.key /etc/openvpn/keys echo port 443 >/etc/openvpn/server.conf echo proto udp >>/etc/openvpn/server.conf echo dev tun >>/etc/openvpn/server.conf echo ca /etc/openvpn/keys/ca.crt >>/etc/openvpn/server.conf echo cert /etc/openvpn/keys/Serv.crt >>/etc/openvpn/server.conf echo key /etc/openvpn/keys/Serv.key >>/etc/openvpn/server.conf echo dh /etc/openvpn/keys/dh.pem >>/etc/openvpn/server.conf echo crl-verify /etc/openvpn/keys/crl.pem >>/etc/openvpn/server.conf echo client-config-dir /etc/openvpn/ccd >>/etc/openvpn/server.conf echo topology subnet >>/etc/openvpn/server.conf echo server 172.21.0.0 255.255.255.0 >>/etc/openvpn/server.conf echo route 172.21.0.0 255.255.255.0 >>/etc/openvpn/server.conf echo push \"dhcp-option DNS 8.8.8.8\" >>/etc/openvpn/server.conf echo push \"dhcp-option DNS 8.8.4.4\" >>/etc/openvpn/server.conf echo keepalive 10 120 >>/etc/openvpn/server.conf echo persist-key >>/etc/openvpn/server.conf echo persist-tun >>/etc/openvpn/server.conf echo status /var/log/openvpn/openvpn-status.log >>/etc/openvpn/server.conf echo log-append /var/log/openvpn/openvpn.log >>/etc/openvpn/server.conf echo verb 2 >>/etc/openvpn/server.conf echo mute 20 >>/etc/openvpn/server.conf echo daemon >>/etc/openvpn/server.conf echo mode server >>/etc/openvpn/server.conf echo user nobody >>/etc/openvpn/server.conf echo group nobody >>/etc/openvpn/server.conf #sudo chown -R Admin:Admin /etc/sysctl.conf chmod 777 /etc/sysctl.conf echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf chmod 755 /etc/sysctl.conf sudo sysctl -p /etc/sysctl.conf sudo systemctl enable openvpn@server sudo systemctl start openvpn@server sudo systemctl status openvpn@server 

La instalación de OpenVPN no fue completamente exitosa.

Sin conocer las características de la política de derechos en los sistemas Linux, pasé mucho tiempo estudiando registros y asignando a todos los archivos los derechos requeridos.

Cuando el botón OpenVPN se puso verde, quedé muy contento, pero resultó que esto era solo el comienzo. En aras de la simplicidad, esperaba reemplazar los certificados raíz y el archivo crl.pem, esperando que todo funcionara. Como resultado, necesitaba transferir los siguientes archivos del servidor a Windows:

Serv.crt - Certificado de servidor
Serv.key - Clave del servidor
Ca.crt - Certificado raíz
Ca.key - Clave de raíz
Crl.pem - Archivo de revocación de certificado
Dh.pem - Clave Diffie-Hellman
Index.txt: archivo con información sobre los certificados actuales
Serie: también es responsable de la relevancia de los certificados

También requería la carpeta certs_by_serial, el archivo vars y todas las claves y certificados del cliente.
En Mikrotik, los certificados permanecieron en su lugar, por lo que funcionó.

Los problemas aparecieron cuando intenté revocar el certificado, no funcionó de la palabra en absoluto: el archivo index.txt necesitaba convertirse al formato unix, pero no lo hice de inmediato. Usó la utilidad dos2unix.

Ahora los certificados fueron revocados, pero continuaron funcionando sin ningún problema, porque Mikrotik no sabía que fueron revocados y necesitaba informar de alguna manera al respecto.

Después de leer las instrucciones, así como de consultar con Alexander ERI (¡muchas gracias!), Tomé un simple servidor http Apache en el servidor de certificación y publiqué un archivo de certificados revocados. Acceso completamente cerrado a él, excepto el archivo publicado desde una ip.

En el terminal Mikrotik, en la pestaña / System / Certificates / CRL, indicaba la ruta a la crl.pem publicada. Aquí debe aclararse que Mikrotik acepta solo http y una dirección absoluta para la pestaña CRL, es decir Debería verse más o menos así: 127.0.0.1/crl/1.crl
Todo funcionó, al menos para las versiones 6.4.2.x de RouterOS, pero tuve que crear configuraciones de cliente con mis manos, y esto fue desafortunado para mí y me causó muchos inconvenientes. Cuando en una semana necesitaba crear configuraciones para unos 50 clientes, decidí acelerar este proceso y para esto utilicé un fragmento del script de otra persona que se encuentra en Internet.

El script funciona así: después del inicio, especifique "nombre del cliente", responda la pregunta "establecer una contraseña o no", luego recogemos el archivo de configuración "client.ovpn", con certificados y configuraciones integrados. Para usarlo, debe tener / etc / openvpn. Firmaré un centenar de líneas en las que el camino debe ser reemplazado por el tuyo. También es necesario crear un archivo con la configuración del cliente para que el script los sustituya en el proceso de creación de la configuración.

 #!/bin/bash function newClient () { echo "" echo "Tell me a name for the client." echo "Use one word only, no special characters." until [[ "$CLIENT" =~ ^[a-zA-Z0-9_]+$ ]]; do read -rp "Client name: " -e CLIENT done echo "" echo "Do you want to protect the configuration file with a password?" echo "(eg encrypt the private key with a password)" echo " 1) Add a passwordless client" echo " 2) Use a password for the client" until [[ "$PASS" =~ ^[1-2]$ ]]; do read -rp "Select an option [1-2]: " -e -i 1 PASS done #cd /etc/openvpn/easy-rsa/ || return case $PASS in 1) sudo /home/admin/EasyRSA-3.0.3/easyrsa build-client-full "$CLIENT" nopass ;; 2) echo "You will be asked for the client password below" ./easyrsa build-client-full "$CLIENT" ;; esac # Generates the custom client.ovpn cp /etc/openvpn/client-template.txt "$home/home/admin/IT/Temp/$CLIENT.ovpn" #       . #,      { echo "<ca>" cat "/etc/openvpn/pki/ca.crt" #    echo "</ca>" echo "<cert>" awk '/BEGIN/,/END/' "/etc/openvpn/pki/issued/$CLIENT.crt" #   #  echo "</cert>" echo "<key>" cat "/etc/openvpn/pki/private/$CLIENT.key" #     echo "</key>" } >> "$home/home/admin/IT/Temp/$CLIENT.ovpn" #,     # echo "" echo "Client $CLIENT added, the configuration file is available at $home/admin/IT/OVPN/Temp/$CLIENT.ovpn." echo "Download the .ovpn file and import it in your OpenVPN client." exit 0; } newClient 

Después de un tiempo, una nueva prohibición introductoria del acceso remoto obligó a matar tanto a este servidor como al paquete de trabajo con Mikrotik. Se creó un nuevo servidor OpenVPN para el departamento de TI, que ahora funciona completamente en CentOS. Pero esta es una historia completamente diferente.

Expreso mi gratitud a Ivan y Pavel por su ayuda en la edición del artículo.

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


All Articles