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
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
KillSignal
directiva le dice a Systemd que envíe elSIGINT
señal cuando elsystemctl 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 engroup1
conéctese a este servidor VPN, solo tráfico al10.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