GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Configure OpenConnect VPN Server (ocserv) en Ubuntu 20.04 con Let's Encrypt

Este tutorial le mostrará cómo ejecutar su propio servidor VPN instalando el servidor OpenConnect VPN en Ubuntu 20.04. Servidor VPN OpenConnect, también conocido como ocserv , es una implementación de código abierto del protocolo Cisco AnyConnnect VPN, que se usa ampliamente en empresas y universidades. AnyConnect es un protocolo VPN basado en SSL que permite a los usuarios individuales conectarse a una red remota.

Nota :Este tutorial también funciona en Ubuntu 20.10 y Ubuntu 21.04.

¿Por qué configurar su propio servidor VPN?

  • Tal vez usted es un proveedor de servicios VPN o un administrador de sistemas, lo que le corresponde configurar nuestro propio servidor VPN.
  • No confía en la política de no registro de los proveedores de servicios de VPN, por lo que opta por el autohospedaje.
  • Puede usar VPN para implementar la política de seguridad de la red. Por ejemplo, si ejecuta su propio servidor de correo electrónico, puede solicitar a los usuarios que inicien sesión solo desde la dirección IP del servidor VPN creando una lista blanca de direcciones IP en el firewall. Por lo tanto, su servidor de correo electrónico se fortalece para evitar actividades de piratería.
  • Quizás solo tenga curiosidad por saber cómo funciona el servidor VPN.

Características del servidor VPN de OpenConnect

  • Ligero y rápido. En mi prueba, puedo ver videos 4K de YouTube con OpenConnect VPN. YouTube está bloqueado en mi país (China).
  • Se ejecuta en Linux y la mayoría de los servidores BSD.
  • Compatible con el cliente Cisco AnyConnect
  • Hay software de cliente OpenConnect para Linux, MacOS, Windows y OpenWRT. Para Android e iOS, puede utilizar Cisco AnyConnect Client.
  • Admite autenticación de contraseña y autenticación de certificado
  • Admite contabilidad RADIUS.
  • Admite alojamiento virtual (múltiples dominios).
  • 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 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

También existe el cliente VPN OpenConnect para Fedora, RHEL, CentOS, Arch Linux y OpenSUSE. Puede instalarlo fácilmente con su administrador de paquetes.

sudo dnf install openconnect
sudo yum install openconnect
sudo pacman -S openconnect

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 20.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:Instale OpenConnect VPN Server en Ubuntu 20.04

Inicie sesión en su servidor Ubuntu 20.04. Luego usa apt para instalar el ocserv paquete del repositorio predeterminado de Ubuntu.

sudo apt update
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 Sun 2020-04-12 19:57:08 HKT; 12s ago
       Docs: man:ocserv(8)
   Main PID: 216409 (ocserv-main)
      Tasks: 2 (limit: 9451)
     Memory: 1.6M
     CGroup: /system.slice/ocserv.service
             ├─216409 ocserv-main
             └─216429 ocserv-sm

Sugerencia:si el comando anterior no se cierra de inmediato, puede presionar la tecla Q para recuperar el control de la terminal.

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, es probable que el servidor VPN no se inicie. Más adelante veremos cómo cambiar el puerto en el archivo de configuración de OpenConnect VPN.

Si hay un firewall ejecutándose en su servidor, deberá abrir los puertos 80 y 443. Por ejemplo, si usa UFW, ejecute el siguiente comando.

sudo ufw allow 80,443/tcp

Paso 2:Instale el cliente Let's Encrypt (Certbot) en el servidor Ubuntu 20.04

El gnutls-bin paquete instalado junto con ocserv 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.

Ejecute los siguientes comandos para instalar el cliente Let's Encrypt (certbot) desde el repositorio predeterminado de Ubuntu.

sudo apt install certbot

Para comprobar el número de versión, ejecute

certbot --version

Salida de muestra:

certbot 0.40.0

Paso 3:obtenga un certificado TLS de confianza de Let's Encrypt

Recomiendo usar el standalone o webroot complemento para obtener el certificado TLS para ocserv.

Complemento independiente

Si no hay un servidor web ejecutándose en su servidor Ubuntu 20.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 [email protected] -d vpn.example.com

donde:

  • 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 utilizará el puerto 80.
  • --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 20.04 tiene un servidor web escuchando en los puertos 80 y 443, entonces es una buena idea usar el complemento webroot para obtener un certificado porque el complemento webroot funciona con casi 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/ocserv
</VirtualHost>

Guarde y cierre el archivo. Luego cree el directorio raíz web.

sudo mkdir /var/www/ocserv

Establezca www-data (usuario de Apache) como propietario de la raíz web.

sudo chown www-data:www-data /var/www/ocserv -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 [email protected] -d vpn.example.com -w /var/www/ocserv

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/ocserv/;

      location ~ /.well-known/acme-challenge {
         allow all;
      }
}

Guarde y cierre el archivo. Luego cree el directorio raíz web.

sudo mkdir -p /var/www/ocserv

Establezca www-data (usuario de Nginx) como propietario de la raíz web.

sudo chown www-data:www-data /var/www/ocserv -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 [email protected] -d vpn.example.com -w /var/www/ocserv

Paso 4:Edite el archivo de configuración del servidor VPN de OpenConnect

Edite el archivo de configuración principal de ocserv.

sudo nano /etc/ocserv/ocserv.conf

Primero, necesitamos configurar 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 128. Establecer en cero para ilimitado.

max-clients = 128

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

De forma predeterminada, los paquetes keepalive se envían cada 300 segundos (5 minutos). Prefiero usar un tiempo corto (30 segundos) para reducir la posibilidad de que se corte la conexión VPN.

keepalive = 30

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

Puede establecer el tiempo que un cliente puede permanecer inactivo antes de desconectarse a través de los siguientes dos parámetros. Si prefiere que el cliente permanezca conectado indefinidamente, comente estos dos parámetros.

idle-timeout=1200
mobile-idle-timeout=1800

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 muchos 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

Las direcciones de resolución de DNS predeterminadas son las siguientes, lo cual está bien.

dns = 8.8.8.8
dns = 1.1.1.1

Nota :si es un proveedor de servicios VPN, es una buena práctica ejecutar su propio sistema de resolución de DNS en el mismo servidor. 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 ruta (agregue el símbolo # al comienzo de las siguientes líneas), lo que configurará el servidor como la puerta de enlace predeterminada para los clientes.

#route = 10.0.0.0/8
#route = 172.16.0.0/12
#route = 192.168.0.0/16
#route = fd00::/8
#route = default

#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:Crear 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 6:habilite el reenvío de IP

Para que el servidor VPN enrute paquetes entre clientes VPN e Internet, 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 7:Configure el enmascaramiento de IP en el cortafuegos

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

Luego 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.

UFW puede tardar algún tiempo en procesar las reglas del cortafuegos. Si la regla de enmascaramiento no aparece, reinicie UFW nuevamente (sudo systemctl restart ufw ).

Paso 8: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 ejecuta un solucionador de DNS local

Para aquellos de ustedes que ejecutan una resolución de DNS local, si especificaron 10.10.10.1 como servidor DNS para clientes VPN, entonces deben 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 necesita editar el archivo de configuración del servidor BIND DNS (/etc/bind/named.conf.options ) para permitir que los clientes de VPN envíen consultas de DNS recursivas como se muestra a continuación.

allow-recursion { 127.0.0.1; 10.10.10.0/24; };

Luego reinicie BIND.

sudo systemctl restart named

Cómo instalar y usar el cliente OpenConnect VPN en el escritorio Ubuntu 20.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 (usando un rango de direcciones IP incorrecto), lo que hizo que mi computadora no pudiera navegar por Internet.

Si encuentra el siguiente error, debe deshabilitar el puerto UDP en ocserv, que se explica más adelante en la optimización de velocidad sección.

DTLS handshake failed: Resource temporarily unavailable, try again

Si tiene el siguiente error, es probable que la contraseña de su cuenta VPN sea incorrecta.

fgets (stdin): Inappropriate ioctl for device

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'
  KillSignal=SIGINT
  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 y Wants=network-online.target hacer que este servicio se ejecute después de que la red esté activa. Queremos el openconnect.service comenzar después del systemd-resolved.service porque eso garantizará que la dirección del servidor DNS establecida por OpenConnect no sea anulada por systemd-resolved.service .
  • En realidad, este servicio aún puede ejecutarse antes de que la red esté activa. Agregamos Restart=always y RestartSec=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 al openconnect comando.
  • La KillSignal directiva le dice a Systemd que envíe el SIGINT señal cuando el systemctl stop openconnect se emite el comando. Esto realizará un apagado limpio al cerrar la sesión y restaurar la configuración del servidor DNS y la tabla de enrutamiento del kernel de Linux.

Para iniciar este servicio de Systemd inmediatamente, ejecute

sudo systemctl start openconnect

Para detener este servicio de Systemd, ejecute

sudo systemctl stop openconnect

Cómo reiniciar automáticamente OpenConnect Client al reanudar desde la suspensión

Si su escritorio Ubuntu entra en estado de suspensión, el cliente OpenConnect perdería la conexión con el servidor VPN. Para que se reinicie automáticamente al reanudar desde la suspensión, debemos crear otra unidad de servicio systemd.

sudo nano /etc/systemd/system/openconnect-restart.service

Agregue las siguientes líneas en el archivo.

[Unit]
Description=Restart OpenConnect client when resuming from suspend
After=suspend.target

[Service]
Type=simple
ExecStart=/bin/systemctl --no-block restart openconnect.service

[Install]
WantedBy=suspend.target
>

Guarde y cierre el archivo. Luego habilite este servicio.

sudo systemctl enable openconnect-restart.service

Reinicio automático cuando se cae la conexión VPN

A veces, la conexión VPN se interrumpía por otros motivos. Puede ejecutar el siguiente comando 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.

ping -c9 10.10.10.1 || systemctl restart openconnect

El ping se hará 9 veces, es decir, 9 segundos. Puedes usar un bucle infinito en el shell Bash para que todo el comando se ejecute para siempre. Presiona Ctrl+C para detenerlo.

for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done

Ahora podemos crear un servicio systemd para esta tarea.

sudo nano /etc/systemd/system/openconnect-check.service

Agregue las siguientes líneas a este archivo. Especificamos que este servicio debe ejecutarse después del openconnect.service .

[Unit]
Description=OpenConnect VPN Connectivity Checker
After=openconnect.service

[Service]
Type=simple
ExecStart=/bin/bash -c 'for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done'

[Install]
WantedBy=multi-user.target

Guarde y cierre el archivo. Entonces inicia este servicio.

sudo systemctl start openconnect-check

Habilite el inicio automático en el momento del arranque.

sudo systemctl enable openconnect-check

Una vez que se inicia este servicio, el comando ping se ejecutará para siempre. Si se cae la conexión VPN, se reiniciará automáticamente openconnect.service .

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, mi 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 # símbolo al principio) la siguiente línea en el archivo de configuración 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. Tenga en cuenta que debe deshabilitar DTLS en ocserv o TCP BBR no funcionará.

  • 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.

Otro factor muy importante que afecta la velocidad es qué tan buena es la conexión entre su computadora local y el servidor VPN. Si vive en el Medio Oriente y el servidor VPN está ubicado en los EE. UU., la velocidad sería lenta. Elija un centro de datos que esté cerca de donde vive.

Además, verifique el promedio de carga de su CPU. (htop puede ser instalado por sudo apt install htop ).

htop

Asegúrate de que el promedio de carga de la CPU esté por debajo de 1 . Una vez tuve un promedio de carga de CPU de 3 , lo que provocó una alta latencia entre el cliente VPN y el servidor VPN.

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 recargar el servicio ocserv para que el servidor VPN obtenga un nuevo certificado y archivo de clave.

@daily certbot renew --quiet && systemctl reload ocserv

Consejos para solucionar problemas

Abrir VZ

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 usa Vultr VPS, entonces tiene VPS basado en KVM, por lo que no tiene que preocuparse por esto).

Archivo de registro

Si encuentra algún problema, verifique el registro del servidor OpenConnect VPN.

sudo journalctl -eu ocserv.service

Descubrí que si cambio el puerto 443 a un puerto diferente, el gran firewall de China bloqueará esta conexión VPN.

Modo de depuración

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.

No puedo navegar por Internet

Si se conectó con éxito al servidor VPN, pero no puede navegar por Internet, eso se debe a que el reenvío de IP o el enmascaramiento de IP no funcionan. Recuerdo que mi proveedor de VPS una vez hizo una actualización de la plataforma, que cambió el nombre de la interfaz de red principal de ens3 a enp3s0 , por lo que tuve que actualizar el nombre en el archivo UFW (/etc/ufw/before.rules ).

Error de sintaxis

Si ve el siguiente error cuando intenta establecer una conexión VPN, probablemente se deba a que hay un error de sintaxis en su archivo de configuración ocserv. Compruebe el diario (sudo journalctl -eu ocserv ) para averiguarlo.

Got inappropriate HTTP CONNECT response: HTTP/1.1 401 Cookie is not acceptable

Reinicia tu computadora

Si ve el siguiente error al intentar establecer una conexión VPN, es probable que sea un problema de la computadora local. Intenta reiniciar tu computadora.

Server 'vpn.your-domain.com' requested Basic authentication which is disabled by default

La conexión TLS no se terminó correctamente

Si ve el siguiente error en el cliente al intentar establecer una conexión VPN,

SSL connection failure: The TLS connection was non-properly terminated.

probablemente debería reiniciar el ocserv servicio en el servidor VPN.

sudo systemctl restart ocserv

Puede crear un trabajo cron para reiniciar automáticamente ocserv una vez al día a las 4 a. m.

sudo crontab -e

Agregue la siguiente línea.

0 4 * * * systemctl restart ocserv

Guarde y cierre el archivo.

Haga 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:-RSA:-VERS-SSL3.0:-ARCFOUR-128"

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:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1"

Guarde y cierre el archivo. Luego reinicie ocserv.

sudo systemctl restart ocserv

Ahora ocserv solo aceptará TLS 1.3 y 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

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 para habilitar la tunelización dividida.

route = 10.10.10.0/255.255.255.0
tunnel-all-dns = false
dns = 8.8.8.8
dns = 1.1.1.1

donde:

  • La primera línea significa que después de user1 o usuarios en group1 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.
  • La segunda línea deshabilita las consultas DNS de tunelización.
  • La tercera y cuarta línea establecen servidores DNS para clientes VPN.

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 TUN (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. Reiniciar ocserv para que los cambios surtan efecto.

sudo systemctl restart ocserv

Tenga en cuenta que si habilita IPv6 en ocserv, también debe agregar el rango de red IPv6 para poder usar el túnel dividido.

route = 10.10.10.0/255.255.255.0
route = fda9:4efe:7e3b:03ea::/48
tunnel-all-dns = false
dns = 8.8.8.8
dns = 1.1.1.1

Si desea excluir una dirección IP de la ruta predeterminada, utilice no-route .

no-route = 12.34.56.78/32

Esto significa que el resto del tráfico pasará por el túnel VPN excepto el tráfico a la IP 12.34.56.78. Los parámetros route y no-route aceptan notación de máscara de red (10.10.10.0/255.255.255.0) y notación CIDR (12.34.56.78/32)

Si ve el siguiente error después de habilitar el túnel dividido, probablemente se deba a que no usó la máscara de red o la notación CIDR.

could not parse proxy protocol header; discarding connection

Túneles divididos por país

Supongamos que solo desea que la VPN canalice el tráfico a países extranjeros. El tráfico a su propio país debe utilizar la ruta normal. Puedes usar el no-route directiva en el archivo de configuración ocserv para lograr esto.

Primero, debe descargar el rango de direcciones IP de su país desde esta página web:https://www.ip2location.com/free/visitor-blocker, que le permite descargar el rango de direcciones IP en formato CIDR.

Guarde el rango de IP en un archivo de texto ip2location.txt y ejecute el siguiente comando en su terminal de Linux para agregar no-route = directiva al principio de cada línea.

sed 's/^/no-route = /' -i ip2localtion.txt

Ahora abra el archivo en un editor de texto y copie todas las líneas en él. Necesitamos agregar estas líneas en el archivo de configuración ocserv. Si hay demasiadas líneas, puede agregar estas líneas al archivo de configuración por usuario.

sudo nano /etc/ocserv/config-per-user/user1

También puede agregarlos al archivo de configuración por grupo y luego agregar usuarios al grupo.

Reinicie ocserv para que los cambios surtan efecto.

sudo systemctl restart ocserv

Cómo habilitar IPv6 en OpenConnect VPN

Si su servidor VPN tiene una dirección IPv6 pública, puede habilitar IPv6 en OpenConnect VPN. Edite el archivo de configuración de ocserv.

sudo nano /etc/ocserv/ocserv.conf

Busque las siguientes dos líneas y elimínelas.

ipv6-network = fda9:4efe:7e3b:03ea::/48
ipv6-subnet-prefix = 64

Guarde y cierre el archivo. Reinicie ocserv para que el cambio surta efecto.

sudo systemctl restart ocserv

Luego, debemos habilitar el reenvío de IP para IPv6. Editar sysctl.conf archivo.

sudo nano /etc/sysctl.conf

Agregue la siguiente línea al final de este archivo.

net.ipv6.conf.all.forwarding=1

Guarde y cierre el archivo. Luego aplique los cambios con el siguiente comando.

sudo sysctl -p

A continuación, debemos configurar el enmascaramiento de IPv6 en el firewall del servidor, de modo que el servidor se convierta en un enrutador virtual para clientes VPN.

sudo nano /etc/ufw/before6.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 -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 .

De forma predeterminada, UFW prohíbe el reenvío de paquetes. Podemos permitir el reenvío para nuestra red privada IPv6. Encuentra el ufw6-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 fda9:4efe:7e3b:03ea::/48 rango.

Guarde y cierre el archivo. Reinicie UFW para que el cambio surta efecto.

sudo systemctl restart ufw

Ahora, si lista las reglas en la cadena POSTROUTING de la tabla NAT usando el siguiente comando:

sudo ip6tables -t nat -L POSTROUTING

Puedes ver la regla Masquerade.

Desconecte la conexión VPN actual, agregue un registro AAAA para vpn.example.com y restablecer la conexión VPN. Luego vaya a https://test-ipv6.com/ para verificar su conectividad IPv6.

Si ejecuta su propio sistema de resolución de DNS BIND en el servidor VPN, puede agregar la siguiente línea en /etc/ocserv/ocserv.conf archivo para configurar el servidor VPN como el solucionador de DNS para clientes VPN.

dns = fda9:4efe:7e3b::1

Guarde y cierre el archivo. Para consultar nombres DNS en IPv6, debemos configurar BIND para permitir clientes VPN IPv6.

sudo nano /etc/bind/named.conf.options

Busque el parámetro allow-recursion y cámbielo a:

allow-recursion { 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; };

Guarde y cierre el archivo. Reinicie BIND9.

sudo systemctl restart named

También debemos permitir el cliente VPN IPv6 en el cortafuegos.

sudo ufw allow in from fda9:4efe:7e3b:03ea::/48

Virtual Hosting

Nota :If you just want to have the ability to use multiple hostnames for the VPN server, you can use certbot to obtain a multi-domain certificate. Then restart ocserv and you are done.

To add a new virtual host in ocserv, first you need to use the method in step 3 to obtain a TLS certificate for the new virtual host. Then edit ocserv configuration file.

sudo nano /etc/ocserv/ocserv.conf

Go to the bottom of this file. In Nano text editor, you can press Ctrl+W , luego Ctrl+V to jump to the bottom of a file. Agregue las siguientes líneas. Replace vpn2.example.com with the hostname of the second virtual host.

[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. Then restart ocserv.

sudo systemctl restart ocserv

Edit the UFW configuration file.

sudo nano /etc/ufw/before.rules

Encuentra el ufw-before-forward chain in this file and add the following 2 lines, which will accept packet forwarding if the source IP or destination IP is in the 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. Then restart UFW.

sudo systemctl restart ufw

Note that the ocserv daemon might tell you some parameters will be ignored for virtual host. However, I found that some of the ignored parameters are actually needed. For example, if you delete the device = vpns line from the virtual host, you might encounter the following error when establishing VPN connection to the virtual host.

VPN service unavailable; reason: Server configuration error

And the VPN server would produce the following error message in the log.

no networks are configured; rejecting client

Also Note that the AnyConnect VPN client on iOS doesn’t support TLS SNI, so iOS users will connect to the default virtual host.

How to Run Multiple Instances of ocserv

One ocserv process can bind to only one TCP or UDP port on your server. If you want to allow ocserv to bind to multiple TCP or UDP ports, then you need to run multiple ocserv processes. Es muy sencillo. Copy the /lib/systemd/system/ocserv.service to a new file.

sudo cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv2.service

Then edit the new file.

sudo nano /etc/systemd/system/ocserv2.service

Cambiar

/etc/ocserv/ocserv.conf

a

/etc/ocserv/ocserv2.conf

Guarde y cierre el archivo. Next, you can edit the /etc/ocserv/ocserv2.conf file and add your custom configurations. Once you are done, start the second ocserv service.

sudo systemctl start ocserv2

Ubuntu
  1. Cómo configurar WireGuard VPN en Ubuntu (una guía paso a paso)

  2. Cómo configurar un servidor VPN IKEv2 con StrongSwan en Ubuntu 22.04

  3. Configurar OpenConnect VPN Server (ocserv) en Debian 11 Bullseye

  4. Configurar OpenConnect VPN Server (ocserv) en Debian 10 Buster

  5. Cómo instalar Let's Encrypt SSL en Ubuntu 18.04 con Nginx

¿Cómo configurar un Pptp Vpn en el propio servidor Ubuntu?

Cómo configurar un servidor Seafile con Nginx en Ubuntu 18.04

Cómo configurar un servidor FTP con ProFTPD en Ubuntu 18.04

Cómo configurar un servidor de correo con Modoboa en Ubuntu 20.04

Cómo proteger Nginx con Let's Encrypt en Ubuntu 20.04

Cómo proteger su sitio web con Let's Encrypt en Ubuntu 20.04