Este tutorial le mostrará cómo instalar el servidor OpenConnect VPN en Ubuntu 16.04/18.04 . Servidor VPN OpenConnect, también conocido como ocserv , es una implementación de código abierto del protocolo Cisco AnyConnect VPN, que es popular entre empresas y universidades. AnyConnect es un protocolo VPN basado en SSL que permite a los usuarios individuales conectarse a una red remota.
Características del servidor OpenConnect VPN:
- Ligero y rápido. En mi prueba, puedo ver YouTube en 4k con OpenConnect VPN. YouTube está bloqueado en mi país.
- Compatible con el cliente Cisco AnyConnect
- Admite autenticación de contraseña y autenticación de certificado
- Fácil de configurar
Me gusta especialmente el hecho de que, en comparación con otras tecnologías VPN, es muy fácil y conveniente para el usuario final usar OpenConnect VPN. Cada vez que instalo una distribución de Linux basada en Debian en mi computadora y quiero desbloquear sitios web rápidamente u ocultar mi dirección IP, instalo el cliente OpenConnect y me conecto al servidor con solo dos líneas de comandos:
sudo apt install openconnect sudo openconnect -b vpn.mydomain.com
El gnutls-bin
El paquete de software proporciona herramientas para crear su propia CA y certificado de servidor, pero obtendremos e instalaremos el certificado Let's Encrypt. La ventaja de usar el certificado Let's Encrypt es que es gratis, más fácil de configurar y confiable para el software del cliente VPN.
Requisitos
Para seguir este tutorial, necesitará un VPS (servidor privado virtual) que pueda acceder libremente a sitios web bloqueados (fuera de su país o sistema de filtrado de Internet). Recomiendo Kamatera VPS, que incluye:
- Prueba gratuita de 30 días.
- Desde $4/mes (1 GB de RAM)
- VPS basado en KVM de alto rendimiento
- 9 centros de datos en todo el mundo, incluidos Estados Unidos, Canadá, Reino Unido, Alemania, Países Bajos, Hong Kong e Israel.
Siga el tutorial vinculado a continuación para crear su servidor Linux VPS en Kamatera.
- Cómo crear un servidor VPS Linux en Kamatera
Una vez que tenga un VPS con Ubuntu 18.04, siga las instrucciones a continuación.
También necesita un nombre de dominio para habilitar HTTPS para OpenConnect VPN. Registré mi nombre de dominio de NameCheap porque el precio es bajo y ofrecen protección de privacidad whois gratis de por vida.
Paso 1:Instalación del servidor VPN de OpenConnect en Ubuntu 16.04/18.04
Inicie sesión en su servidor Ubuntu 16.04/18.04. Luego usa apt
para instalar el ocserv
paquete, que está incluido en el repositorio de Ubuntu desde 16.04.
sudo apt install ocserv
Una vez instalado, el servidor OpenConnect VPN se inicia automáticamente. Puede comprobar su estado con:
systemctl status ocserv
Salida de muestra:
● ocserv.service - OpenConnect SSL VPN server Loaded: loaded (/lib/systemd/system/ocserv.service; enabled; vendor preset: enabled Active: active (running) since Thu 2017-11-30 05:45:07 UTC; 11s ago Docs: man:ocserv(8) Main PID: 19235 (ocserv-main) CGroup: /system.slice/ocserv.service ├─19235 ocserv-main └─19242 ocserv-secm
Si no se está ejecutando, puede iniciarlo con:
sudo systemctl start ocserv
De manera predeterminada, el servidor OpenConnect VPN escucha en el puerto TCP y UDP 443. Si lo está utilizando el servidor web, entonces el servidor VPN no se puede iniciar. Más adelante veremos cómo cambiar el puerto en el archivo de configuración de OpenConnect VPN.
Paso 2:Instalación del cliente Let's Encrypt (Certbot) en el servidor Ubuntu 16.04/18.04
Ejecute los siguientes comandos para instalar la última versión de certbot desde el PPA oficial. software-propiedades-comunes es necesario si desea instalar paquetes desde PPA. Es posible que falte en su servidor Ubuntu.
sudo apt install software-properties-common sudo add-apt-repository ppa:certbot/certbot sudo apt update sudo apt install certbot
Para verificar el número de versión, ejecute
certbot --version
Salida de muestra:
certbot 0.31.0
Paso 3:Obtener un certificado TLS de Let's Encrypt
Complemento independiente
Si no hay un servidor web ejecutándose en su servidor Ubuntu 16.04/18.04 y desea que el servidor OpenConnect VPN use el puerto 443, puede usar el complemento independiente para obtener el certificado TLS de Let's Encrypt. Ejecute el siguiente comando. No olvide establecer un registro A para su nombre de dominio.
sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email your-email-address -d vpn.example.com
Explicación:
certonly
:Obtenga un certificado pero no lo instale.--standalone
:use el complemento independiente para obtener un certificado--preferred-challenges http
:Realice el desafío http-01 para validar nuestro dominio, que usará el puerto 80. De manera predeterminada, el complemento independiente realizará el desafío tls-sni, que usa el puerto 443. Dado que el servidor OpenConnect VPN ya usa el puerto 443, debemos cambiar el comportamiento predeterminado.--agree-tos
:Acepte los términos de servicio de Let's Encrypt.--email
:la dirección de correo electrónico se utiliza para el registro y la recuperación de la cuenta.-d
:Especifique su nombre de dominio.
Como puede ver en la siguiente captura de pantalla, obtuve el certificado con éxito.
Uso del complemento webroot
Si su servidor Ubuntu 16.04/18.04 tiene un servidor web escuchando en los puertos 80 y 443, y desea que el servidor OpenConnect VPN use un puerto diferente, entonces es una buena idea usar el complemento webroot para obtener un certificado porque el complemento webroot funciona con prácticamente todos los servidores web y no necesitamos instalar el certificado en el servidor web.
Primero, debe crear un host virtual para vpn.example.com.
Apache
Si está utilizando Apache, entonces
sudo nano /etc/apache2/sites-available/vpn.example.com.conf
Y pegue las siguientes líneas en el archivo.
<VirtualHost *:80> ServerName vpn.example.com DocumentRoot /var/www/vpn.example.com </VirtualHost>
Guarde y cierre el archivo. Luego cree el directorio raíz web.
sudo mkdir /var/www/vpn.example.com
Establezca www-data (usuario de Apache) como propietario de la raíz web.
sudo chown www-data:www-data /var/www/vpn.example.com -R
Habilite este servidor virtual.
sudo a2ensite vpn.example.com
Vuelva a cargar Apache para que los cambios surtan efecto.
sudo systemctl reload apache2
Una vez que se crea y habilita el host virtual, ejecute el siguiente comando para obtener el certificado Let's Encrypt usando el complemento webroot.
sudo certbot certonly --webroot --agree-tos --email your-email-address -d vpn.example.com -w /var/www/vpn.example.com
Nginx
Si está utilizando Nginx, entonces
sudo nano /etc/nginx/conf.d/vpn.example.com.conf
Pegue las siguientes líneas en el archivo.
server { listen 80; server_name vpn.example.com; root /var/www/vpn.example.com/; location ~ /.well-known/acme-challenge { allow all; } }
Guarde y cierre el archivo. Luego cree el directorio raíz web.
sudo mkdir -p /var/www/vpn.example.com
Establezca www-data (usuario de Nginx) como propietario de la raíz web.
sudo chown www-data:www-data /var/www/vpn.example.com -R
Vuelva a cargar Nginx para que los cambios surtan efecto.
sudo systemctl reload nginx
Una vez que se crea y habilita el host virtual, ejecute el siguiente comando para obtener el certificado Let's Encrypt usando el complemento webroot.
sudo certbot certonly --webroot --agree-tos --email your-email-address -d vpn.example.com -w /var/www/vpn.example.com
Paso 4:Edición del archivo de configuración del servidor VPN de OpenConnect
Edite el archivo de configuración de ocserv.
sudo nano /etc/ocserv/ocserv.conf
Primero, configure la autenticación de contraseña. De manera predeterminada, la autenticación de contraseña a través de PAM (Módulos de autenticación conectables) está habilitada, lo que le permite usar cuentas del sistema Ubuntu para iniciar sesión desde clientes VPN. Este comportamiento se puede desactivar comentando la siguiente línea.
auth = "pam[gid-min=1000]"
Si queremos que los usuarios usen cuentas VPN separadas en lugar de cuentas del sistema para iniciar sesión, debemos agregar la siguiente línea para habilitar la autenticación de contraseña con un archivo de contraseña.
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
Después de terminar de editar este archivo de configuración, veremos cómo usar ocpasswd
herramienta para generar el /etc/ocserv/ocpasswd
archivo, que contiene una lista de nombres de usuario y contraseñas codificadas.
Nota :Ocserv admite la autenticación de certificados de clientes, pero Let's Encrypt no emite certificados de clientes. Debe configurar su propia CA para emitir un certificado de cliente.
A continuación, si no desea que ocserv use el puerto TCP y UDP 443, busque las siguientes dos líneas y cambie el número de puerto. De lo contrario, déjalos en paz.
tcp-port = 443 udp-port = 443
Luego encuentra las siguientes dos líneas. Tenemos que cambiarlos.
server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem server-key = /etc/ssl/private/ssl-cert-snakeoil.key
Reemplace la configuración predeterminada con la ruta del certificado del servidor Let's Encrypt y el archivo de clave del servidor.
server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pem server-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem
Luego, establezca el número máximo de clientes. El valor predeterminado es 16. Establecer en cero para ilimitado.
max-clients = 16
Establezca la cantidad de dispositivos desde los que un usuario puede iniciar sesión al mismo tiempo. El valor predeterminado es 2. Establecer en cero para ilimitado.
max-same-clients = 2
A continuación, busque la siguiente línea. Cambiar false
a true
para habilitar el descubrimiento de MTU, que puede optimizar el rendimiento de VPN.
try-mtu-discovery = false
Después de eso, establezca el dominio predeterminado en vpn.example.com.
default-domain = vpn.example.com
La configuración de la red IPv4 es la siguiente por defecto. Esto causará problemas porque la mayoría de los enrutadores domésticos también establecen el rango de red IPv4 en 192.168.1.0/24
.
ipv4-network = 192.168.1.0 ipv4-netmask = 255.255.255.0
Podemos usar otro rango de direcciones IP privadas (10.10.10.0/24) para evitar la colisión de direcciones IP, así que cambie el valor de ipv4-network
a
ipv4-network = 10.10.10.0
Ahora elimine el comentario de la siguiente línea para tunelizar todas las consultas de DNS a través de la VPN.
tunnel-all-dns = true
Cambiar la dirección de resolución de DNS. Puede utilizar el servidor DNS público de Google.
dns = 8.8.8.8
Nota :Es una buena práctica ejecutar su propia resolución de DNS en el mismo servidor, especialmente si es un proveedor de VPN. Si hay una resolución de DNS ejecutándose en el mismo servidor, especifique el DNS como
dns = 10.10.10.1
10.10.10.1 es la dirección IP del servidor VPN OpenConnect en la LAN VPN. Esto acelerará un poco las búsquedas de DNS para los clientes porque se elimina la latencia de la red entre el servidor VPN y la resolución de DNS.
Luego comente todos los parámetros de la ruta (agregue el símbolo # al principio de las siguientes cuatro líneas), lo que configurará el servidor como la puerta de enlace predeterminada para los clientes.
route = 10.10.10.0/255.255.255.0 route = 192.168.0.0/255.255.0.0 route = fef4:db8:1000:1001::/64 no-route = 192.168.5.0/255.255.255.0
Guarde y cierre el archivo. A continuación, reinicie el servidor VPN para que se apliquen los cambios.
sudo systemctl restart ocserv
Paso 5:Corrección de la falla de protocolo de enlace DTLS
En Ubuntu 16.04 y Ubuntu 18.04, ocserv daemon ocserv.socket
no respeta el valor "escuchar-host" del archivo de configuración, lo que provocará el siguiente error cuando los clientes se conecten al servidor VPN.
DTLS handshake failed: Resource temporarily unavailable, try again.
Para corregir este error, necesitamos editar el archivo ocserv.service. Primero copiamos el archivo original en /lib/systemd/system/
directorio a /etc/systemd/system/
directorio, luego edítelo, porque no queremos que la nueva versión del paquete ocserv anule nuestras modificaciones. (Para obtener más información sobre los archivos unitarios de systemd, ejecute man systemd.unit
.)
sudo cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv.service sudo nano /etc/systemd/system/ocserv.service
Comente las siguientes dos líneas.
Requires=ocserv.socket Also=ocserv.socket
Guarde y cierre el archivo. Luego recarga systemd
sudo systemctl daemon-reload
Detenga ocserv.socket y desactívelo.
sudo systemctl stop ocserv.socket sudo systemctl disable ocserv.socket
Reinicie el servicio ocserv.
sudo systemctl restart ocserv.service
El servicio ocserv systemd no generará ningún mensaje si no se reinicia, por lo que debemos verificar el estado para asegurarnos de que realmente se está ejecutando.
systemctl status ocserv
Paso 6:Creación de cuentas VPN
Ahora use la herramienta ocpasswd para generar cuentas VPN.
sudo ocpasswd -c /etc/ocserv/ocpasswd username
Se le pedirá que establezca una contraseña para el usuario y la información se guardará en /etc/ocserv/ocpasswd
expediente. Para restablecer la contraseña, simplemente ejecute el comando anterior nuevamente.
Paso 7:habilite el reenvío de IP
Para que el servidor VPN enrute paquetes entre el cliente VPN y el mundo exterior, debemos habilitar el reenvío de IP. Editar sysctl.conf
archivo.
sudo nano /etc/sysctl.conf
Agregue la siguiente línea al final de este archivo.
net.ipv4.ip_forward = 1
Guarde y cierre el archivo. Luego aplique los cambios con el siguiente comando. La -p La opción cargará la configuración de sysctl desde /etc/sysctl.conf expediente. Este comando conservará nuestros cambios en los reinicios del sistema.
sudo sysctl -p
Paso 8:Configure el cortafuegos para el enmascaramiento de IP
Necesitamos configurar el enmascaramiento de IP en el firewall del servidor, de modo que el servidor se convierta en un enrutador virtual para clientes VPN. Usaré UFW, que es una parte frontal del firewall de iptables. Instale UFW en Ubuntu con:
sudo apt install ufw
Primero, debe permitir el tráfico SSH.
sudo ufw allow 22/tcp
A continuación, busque el nombre de la interfaz de red principal de su servidor.
ip addr
Como puede ver, se llama ens3
en mi servidor Ubuntu.
Para configurar el enmascaramiento de IP, debemos agregar el comando iptables en un archivo de configuración de UFW.
sudo nano /etc/ufw/before.rules
Por defecto, hay algunas reglas para el filter
mesa. Agregue las siguientes líneas al final de este archivo. Reemplazar ens3
con su propio nombre de interfaz de red.
# NAT table rules *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.10.10.0/24 -o ens3 -j MASQUERADE # End each table with the 'COMMIT' line or these rules won't be processed COMMIT
En el editor de texto Nano, puede ir al final del archivo presionando Ctrl+W
, luego presionando Ctrl+V
.
Las líneas anteriores agregarán (-A ) una regla al final de POSROUTING cadena de nat mesa. Conectará su red privada virtual con Internet. Y también oculte su red del mundo exterior. Por lo tanto, Internet solo puede ver la IP de su servidor VPN, pero no puede ver la IP de su cliente VPN, al igual que su enrutador doméstico oculta su red doméstica privada.
De forma predeterminada, UFW prohíbe el reenvío de paquetes. Podemos permitir el reenvío para nuestra red privada. Encuentra el ufw-before-forward
cadena en este archivo y agregue las siguientes 3 líneas, que aceptarán el reenvío de paquetes si la IP de origen o la IP de destino están en 10.10.10.0/24
rango.
# allow forwarding for trusted network -A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT -A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT
Guarde y cierre el archivo. Luego habilite UFW.
sudo ufw enable
Si ha habilitado UFW anteriormente, puede usar systemctl para reiniciar UFW.
sudo systemctl restart ufw
Ahora, si lista las reglas en la cadena POSTROUTING de la tabla NAT usando el siguiente comando:
sudo iptables -t nat -L POSTROUTING
Puedes ver la regla Masquerade.
Paso 9:Abra el puerto 443 en el cortafuegos
Ejecute el siguiente comando para abrir el puerto TCP y UDP 443. Si configuró un puerto diferente para ocserv, cambie 443 a su puerto configurado.
sudo ufw allow 443/tcp sudo ufw allow 443/udp
Ahora el servidor OpenConnect VPN está listo para aceptar conexiones de clientes.
Si especificó 10.10.10.1 como servidor DNS para clientes VPN, debe permitir que los clientes VPN se conecten al puerto 53 con la siguiente regla UFW.
sudo ufw insert 1 allow in from 10.10.10.0/24
También debe editar la configuración del servidor BIND DNS para permitir que los clientes VPN envíen consultas de DNS recursivas como se muestra a continuación.
allow-recursion { 127.0.0.1; 10.10.10.0/24; };
Cómo instalar y usar el cliente VPN OpenConnect en el escritorio Ubuntu 16.04/18.04
Ejecute el siguiente comando para instalar el cliente de línea de comandos OpenConnect VPN en el escritorio de Ubuntu.
sudo apt install openconnect
Puede conectarse a VPN desde la línea de comando como se muestra a continuación. -b
hará que se ejecute en segundo plano después de que se establezca la conexión.
sudo openconnect -b vpn.example.com:port-number
Se le pedirá que ingrese el nombre de usuario y la contraseña de VPN. Si la conexión se establece con éxito, verá el siguiente mensaje.
Got CONNECT response: HTTP/1.1 200 CONNECTED CSTP connected. DPD 90, Keepalive 32400 Connected tun0 as 192.168.1.139, using SSL Established DTLS connection (using GnuTLS). Ciphersuite (DTLS1.2)-(RSA)-(AES-256-GCM).
Para detener la conexión, ejecute:
sudo pkill openconnect
Para ejecutar el cliente de forma no interactiva, utilice la siguiente sintaxis.
echo -n password | sudo openconnect -b vpn.example.com -u username --passwd-on-stdin
Si desea utilizar Network Manager para administrar la conexión VPN, también debe instalar estos paquetes.
sudo apt install network-manager-openconnect network-manager-openconnect-gnome
Si se conectó con éxito al servidor VPN, pero su dirección IP pública no cambia, eso se debe a que el reenvío de IP o el enmascaramiento de IP no funcionan. Una vez tuve un error tipográfico en mi comando iptables, lo que provocó que mi computadora no pudiera navegar por Internet.
Conexión automática al iniciar el sistema
Para permitir que el cliente OpenConnect VPN se conecte automáticamente al servidor en el momento del arranque, podemos crear una unidad de servicio systemd.
sudo nano /etc/systemd/system/openconnect.service
Ponga las siguientes líneas en el archivo. Reemplace el texto rojo.
[Unit] Description=OpenConnect VPN Client After=network-online.target systemd-resolved.service Wants=network-online.target [Service] Type=simple ExecStart=/bin/bash -c '/bin/echo -n password | /usr/sbin/openconnect vpn.example.com -u username --passwd-on-stdin' ExecStop=/bin/bash -c '/sbin/resolvconf -d tun0 && /usr/bin/pkill -SIGINT openconnect && /sbin/ip route flush 12.34.56.78' Restart=always RestartSec=2 [Install] WantedBy=multi-user.target
Guarde y cierre el archivo. Luego habilite este servicio para que se inicie en el momento del arranque.
sudo systemctl enable openconnect.service
Explicación del contenido del archivo:
After=network-online.target systemd-resolved.service
yWants=network-online.target
hacer que este servicio se ejecute después de que la red esté activa. Queremos elopenconnect.service
comenzar después delsystemd-resolved.service
porque eso garantizará que la dirección del servidor DNS establecida por OpenConnect no sea anulada porsystemd-resolved.service
.- En realidad, este servicio aún puede ejecutarse antes de que la red esté activa. Agregamos
Restart=always
yRestartSec=2
para reiniciar este servicio después de 2 segundos si este servicio falla. - Systemd no reconoce la redirección de tuberías, por lo que en
ExecStart
directiva, envolvemos el comando entre comillas simples y lo ejecutamos con el shell Bash. - Dado que el cliente OpenConnect VPN se ejecutará como un servicio systemd, que se ejecuta en segundo plano, no es necesario agregar
-b
marca alopenconnect
comando. - La parada ejecutiva La directiva es para detener la conexión VPN. Primero, usamos
resolvconf
Comando para revertir la configuración del servidor DNS. tun0 es el nombre predeterminado para el dispositivo TUN, que puede ver conip link
dominio. Luego usamospkill
comando para deteneropenconenct
proceso. Por último, restauramos la tabla de enrutamiento del kernel de Linux conip route flush
dominio. Reemplazar12.34.56.78
con la dirección IP de su servidor VPN.
Para iniciar este servicio de Systemd inmediatamente, ejecute
sudo systemctl start openconnect
Para detener este servicio de Systemd, ejecute
sudo systemctl stop openconnect
Reinicio automático cuando se cae la conexión VPN
A veces, la conexión VPN se interrumpía por varios motivos. Para que el cliente VPN se reinicie automáticamente, edite el archivo crontab del usuario raíz.
sudo crontab -e
Agregue la siguiente línea al final de este archivo.
* * * * * ping -c 10 10.10.10.1 > /dev/null || systemctl restart openconnect
Este trabajo de Cron se ejecutará cada minuto para verificar si el cliente VPN puede hacer ping a la dirección IP privada del servidor VPN (10.10.10.1). Si el ping no tiene éxito, se ejecutará el comando de la derecha para reiniciar el cliente VPN. ||
es el operador OR en Bash. Ejecuta el comando de la derecha solo si el comando de la izquierda devolvió un error.
Guarde y cierre el archivo.
Cliente de GUI OpenConnect para Windows y MacOS
Se pueden descargar desde la página Github de OpenConnect GUI.
Velocidad
OpenConnect VPN es bastante rápido. Puedo usarlo para ver videos 4k en YouTube. Como puedes ver, la velocidad de conexión es 63356 Kbps , que se traduce en 61 Mbit/s .
Y aquí están los resultados de la prueba en speedtest.net.
Optimización de velocidad
OpenConnect usa de forma predeterminada TLS sobre el protocolo UDP (DTLS) para lograr una velocidad más rápida, pero UDP no puede proporcionar una transmisión confiable. TCP es más lento que UDP pero puede proporcionar una transmisión confiable. Un consejo de optimización que puedo darle es deshabilitar DTLS, usar TLS estándar (sobre TCP) y luego habilitar TCP BBR para aumentar la velocidad de TCP.
Para deshabilitar DTLS, comente (agregue el símbolo # al principio) la siguiente línea en el archivo de configuración de ocserv.
udp-port = 443
Guarde y cierre el archivo. Luego reinicie el servicio ocserv.
sudo systemctl restart ocserv.service
Para habilitar TCP BBR, consulte el siguiente tutorial.
- Cómo aumentar fácilmente el rendimiento de la red de Ubuntu habilitando TCP BBR
En mi prueba, TLS estándar con TCP BBR habilitado es dos veces más rápido que DTLS.
Renovación automática del certificado Let's Encrypt
Edite el archivo crontab del usuario root.
sudo crontab -e
Agregue la siguiente línea al final del archivo. Es necesario reiniciar el servicio ocserv para que el servidor VPN obtenga un nuevo certificado y archivo de clave.
@daily certbot renew --quiet && systemctl restart ocserv
Consejos para solucionar problemas
Tenga en cuenta que si está utilizando OpenVZ VPS, asegúrese de habilitar el dispositivo de red virtual TUN en el panel de control de VPS.
Si encuentra algún problema, verifique el registro del servidor OpenConnect VPN.
sudo journalctl -xe -u ocserv.service
Descubrí que si cambio el puerto 443 a un puerto diferente, el gran firewall de China bloqueará esta conexión VPN.
Si ocserv le dice que no puede cargar el /etc/ocserv/ocserv.conf
archivo, puede detener ocserv.
sudo systemctl stop ocserv
Luego, ejecútelo en primer plano con la depuración habilitada.
sudo /usr/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf --debug=10
Entonces la salida podría darle algunas pistas de por qué ocserv no funciona.
Permita que el servidor OpenConnect VPN y el servidor web usen el puerto 443 al mismo tiempo
Lea el siguiente artículo:
- Ejecute OpenConnect VPN Server y Apache/Nginx en la misma caja con HAProxy
Cómo deshabilitar TLS 1.0 y TLS 1.1 en ocserv
El consejo PCI desechó TLS 1.0 el 30 de junio de 2018 y los principales navegadores web deshabilitarán TLS 1.0 y TLS 1.1 en 2020. Deberíamos hacer lo mismo con el servidor VPN. Edite el archivo de configuración principal.
sudo nano /etc/ocserv/ocserv.conf
Busque la siguiente línea:
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0"
Para deshabilitar TLS 1.0 y TLS 1.1 en el servidor OpenConnect VPN, simplemente agregue -VERS-TLS1.0
y -VERS-TLS1.1
en la fila.
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0:-VERS-TLS1.0:-VERS-TLS1.1"
Guarde y cierre el archivo. Luego reinicie ocserv.
sudo systemctl restart ocserv
Ahora ocserv solo aceptará TLS 1.2. Para obtener más información sobre la configuración del parámetro TLS en ocserv, consulte Cadenas de prioridad GnuTLS.
Para verificar si TLS 1.0 es compatible con su servidor OpenConnect VPN, ejecute el siguiente comando.
openssl s_client -connect vpn.your-domain.com:443 -tls1
Y comprueba TLS 1.1
openssl s_client -connect vpn.your-domain.com:443 -tls1_1
Si ve el siguiente mensaje en el resultado, eso significa que la versión TLS no es compatible.
New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported
Traté de habilitar TLS 1.3, pero aún no es compatible con el paquete ocserv en Ubuntu.
Configuración por usuario o por grupo
Ocserv permite configuraciones por usuario y por grupo. Para habilitar esta característica, descomente las siguientes dos líneas en /etc/ocserv/ocserv.conf
archivo.
config-per-user = /etc/ocserv/config-per-user/ config-per-group = /etc/ocserv/config-per-group/
Guarde y cierre el archivo. Luego cree el directorio de configuración por usuario y por grupo.
sudo mkdir /etc/ocserv/config-per-user/ sudo mkdir /etc/ocserv/config-per-group/
A continuación, puede crear un archivo en estos dos directorios. Por ejemplo, cree el user1
archivo para permitir la configuración personalizada para user1
.
sudo nano /etc/ocserv/config-per-user/user1
También puede crear el group1
archivo para permitir la configuración personalizada para el grupo llamado group1
.
sudo nano /etc/ocserv/config-per-group/group1
Puede agregar algo como a continuación en el archivo.
route = 10.10.10.0/255.255.255.0
Esto significa que después de user1
conéctese a este servidor VPN, solo tráfico al 10.10.10.0/24
la red se enrutará a través del servidor VPN. El tráfico a otras direcciones IP se enruta a través de la puerta de enlace original. Uso este truco para permitir que mi otro VPS (servidor privado virtual) se conecte a este servidor VPN sin interrumpir el tráfico normal, por lo que el dispositivo sintonizador (vpns0) de mi servidor VPN siempre está encendido, lo que significa que mi servidor VPN siempre tendrá la dirección IP privada 10.10.10.1.
Guarde y cierre el archivo. Reinicie ocserv para que los cambios surtan efecto.
sudo systemctl restart ocserv
Alojamiento virtual
Para agregar un nuevo host virtual en ocserv, primero debe usar el método del paso 3 para obtener un certificado TLS para el nuevo host virtual. Luego edite el archivo de configuración de ocserv.
sudo nano /etc/ocserv/ocserv.conf
Vaya al final de este archivo. En el editor de texto Nano, puede presionar Ctrl+W
, luego Ctrl+V
para saltar al final de un archivo. Agregue las siguientes líneas. Reemplace vpn2.example.com
con el nombre de host del segundo host virtual.
[vhost:vpn2.example.com] #Allow password authentication and certificate authentication enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]" auth = "certificate" tcp-port = 443 #uncomment the two lines if ocserv runs behind HAProxy. #listen-host = 127.0.0.1 #listen-proxy-proto = true # SSL/TLS configuration ca-cert = /etc/ocserv/ssl/ca-cert.pem server-cert = /etc/letsencrypt/live/vpn2.example.com/fullchain.pem server-key = /etc/letsencrypt/live/vpn2.example.com/privkey.pem cert-user-oid = 0.9.2342.19200300.100.1.1 #Networking configuration. Use a different network range for this virtual host. device = vpns ipv4-network = 10.10.20.0 ipv4-netmask = 255.255.255.0 route = default dns = 8.8.8.8 tunnel-all-dns = true compression = true max-clients = 0 max-same-clients = 0 try-mtu-discovery = true idle-timeout=1200 mobile-idle-timeout=2400 config-per-user = /etc/ocserv/config-per-user/ config-per-group = /etc/ocserv/config-per-group/
Guarde y cierre el archivo. Luego reinicie ocserv.
sudo systemctl restart ocserv
Edite el archivo de configuración de UFW.
sudo nano /etc/ufw/before.rules
Encuentra el ufw-before-forward
cadena en este archivo y agregue las siguientes 2 líneas, que aceptarán el reenvío de paquetes si la IP de origen o la IP de destino están en 10.10.20.0/24
rango.
-A ufw-before-forward -s 10.10.20.0/24 -j ACCEPT -A ufw-before-forward -d 10.10.20.0/24 -j ACCEPT
Guarde y cierre el archivo. Luego reinicie UFW.
sudo systemctl restart ufw
Tenga en cuenta que el demonio ocserv podría indicarle que se ignorarán algunos parámetros para el host virtual. Sin embargo, descubrí que algunos de los parámetros ignorados son realmente necesarios. Por ejemplo, si elimina el device = vpns
desde el host virtual, es posible que encuentre el siguiente error al establecer una conexión VPN con el host virtual.
VPN service unavailable; reason: Server configuration error
Y el servidor VPN generaría el siguiente mensaje de error en el registro.
no networks are configured; rejecting client
Tenga en cuenta también que el cliente AnyConnect VPN en iOS no es compatible con TLS SNI, por lo que los usuarios de iOS se conectarán al host virtual predeterminado.
Cómo ejecutar varias instancias de ocserv
Un proceso ocserv puede vincularse a un solo puerto TCP o UDP en su servidor. Si desea permitir que ocserv se vincule a varios puertos TCP o UDP, debe ejecutar varios procesos de ocserv. Es muy sencillo. Copie el /lib/systemd/system/ocserv.service
a un archivo nuevo.
sudo cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv2.service
Luego edite el nuevo archivo.
sudo nano /etc/systemd/system/ocserv2.service
Cambiar
/etc/ocserv/ocserv.conf
a
/etc/ocserv/ocserv2.conf
Guarde y cierre el archivo. A continuación, puede editar el /etc/ocserv/ocserv2.conf
y agregue sus configuraciones personalizadas. Una vez que haya terminado, inicie el segundo servicio ocserv.
sudo systemctl start ocserv2