Este artículo explica detalladamente cómo instalar y configurar el cliente OpenVPN en Ubuntu 16.04 para conectarse a un servidor de VPN.
Luego de haber instalado y configurado un servidor OpenVPN en Debian 9, llegó la hora de instalar y configurar el cliente en un sistema ARM corriendo Ubuntu 16.04:
luser@ubuntu1604:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.4 LTS Release: 16.04 Codename: xenial
Instalación de OpenVPN
El primer paso consiste en actualizar el sistema e instalar OpenVPN:
$ sudo apt update $ sudo apt upgrade $ sudo apt-get install openvpn
Ubuntu 16.04 incluye la versión 2.3.10 de OpenVPN:
root@ubuntu1604:/etc/openvpn# openvpn --version OpenVPN 2.3.10 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jun 22 2017 library versions: OpenSSL 1.0.2g 1 Mar 2016, LZO 2.08 Originally developed by James Yonan Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net> Compile time defines: enable_crypto=yes enable_crypto_ofb_cfb=yes enable_debug=yes enable_def_auth=yes enable_dependency_tracking=no enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown enable_fast_install=yes enable_fragment=yes enable_http_proxy=yes enable_iproute2=yes enable_libtool_lock=yes enable_lzo=yes enable_lzo_stub=no enable_maintainer_mode=no enable_management=yes enable_multi=yes enable_multihome=yes enable_pam_dlopen=no enable_password_save=yes enable_pedantic=no enable_pf=yes enable_pkcs11=yes enable_plugin_auth_pam=yes enable_plugin_down_root=yes enable_plugins=yes enable_port_share=yes enable_selinux=no enable_server=yes enable_shared=yes enable_shared_with_static_runtimes=no enable_silent_rules=no enable_small=no enable_socks=yes enable_ssl=yes enable_static=yes enable_strict=no enable_strict_options=no enable_systemd=yes enable_win32_dll=yes enable_x509_alt_username=yes with_crypto_library=openssl with_gnu_ld=yes with_mem_check=no with_plugindir='${prefix}/lib/openvpn' with_sysroot=no
Configuración del cliente
En este sistema se debe configurar OpenVPN en modo cliente, el cual se conectará al servidor OpenVPN para tener acceso a la red privada.
Cambiar al directorio de configuración de OpenVPN:
luser@ubuntu1604:~$ cd /etc/openvpn/
Crear el archivo de configuración a partir del ejemplo:
luser@ubuntu1604:/etc/openvpn$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf . luser@ubuntu1604:/etc/openvpn$ sudo nano client.conf
Configurar el cliente para que se conecte a nuestro servidor de VPN accesible a través del nonmbre de host "vpn.linuxito.com":
proto tcp ;proto udp remote vpn.linuxito.com 1194
Copiar el certificado de la CA y el certificado y clave del cliente desde el servidor de VPN, por ejemplo utilizando scp
:
luser@ubuntu1604:/etc/openvpn$ sudo scp -P 2222 root@vpn.linuxito.com:/etc/openvpn/easy-rsa/keys/ca.crt . luser@ubuntu1604:/etc/openvpn$ sudo scp -P 2222 root@vpn.linuxito.com:/etc/openvpn/easy-rsa/keys/cliente1* . luser@ubuntu1604:/etc/openvpn$ sudo mv cliente1.crt client.crt luser@ubuntu1604:/etc/openvpn$ sudo mv cliente1.key client.key
Verificación de la conexión y debugging
Configurado el cliente, es posible verificar la conexión con el servidor y acceso a la VPN:
luser@ubuntu1604:/etc/openvpn$ sudo openvpn client.conf
Tener en cuenta que la configuración de cifrado del cliente debe coincidir con la del servidor, de lo contrario no se podrán comunicar con éxito. Por ejemplo, es común que ocurra la siguiente advertencia, seguida de error en la comunicación:
Wed Jun 20 14:44:24 2018 WARNING: 'cipher' is used inconsistently, local='cipher BF-CBC', remote='cipher AES-256-CBC'
Se observa que el cliente (local=
) y servidor (remote=
) utilizan diferentes suites de cifrado.
Configurar al cliente para que use la misma suite de cifrado que el servidor:
luser@ubuntu1604:/etc/openvpn$ sudo nano client.conf
En este caso se debe agregar la siguiente línea:
cipher AES-256-CBC
En Ubuntu 16.04 la versión de OpenVPN 2.3.10 incluye un archivo de configuración de ejemplo de cliente con compresión LZO habilitada:
comp-lzo
Por lo tanto es necesario asegurarse de que el servidor tenga habilitada la compresión LZO:
root@vpn:/etc/openvpn# nano server.conf
Agregar o eliminar el comentario en la misma línea que en el cliente:
# For compression compatible with older clients use comp-lzo # If you enable it here, you must also # enable it in the client config file. comp-lzo
Si no es posible habilitar la compresión LZO en el servidor, deshabilitarla en el cliente comentando dicha línea.
Solucionando todos los inconvenientes es posible conectarse con éxito al servidor de VPN:
luser@ubuntu1604:/etc/openvpn$ sudo su root@ubuntu1604:/etc/openvpn# openvpn client.conf Wed Jun 20 14:51:08 2018 OpenVPN 2.3.10 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jun 22 2017 Wed Jun 20 14:51:08 2018 library versions: OpenSSL 1.0.2g 1 Mar 2016, LZO 2.08 Wed Jun 20 14:51:08 2018 Socket Buffers: R=[87380->87380] S=[16384->16384] Wed Jun 20 14:51:08 2018 Attempting to establish TCP connection with [AF_INET]192.168.1.1:1194 [nonblock] Wed Jun 20 14:51:09 2018 TCP connection established with [AF_INET]192.168.1.1:1194 Wed Jun 20 14:51:09 2018 TCPv4_CLIENT link local: [undef] Wed Jun 20 14:51:09 2018 TCPv4_CLIENT link remote: [AF_INET]192.168.1.1:1194 Wed Jun 20 14:51:09 2018 TLS: Initial packet from [AF_INET]192.168.1.1:1194, sid=4b7edfd1 b4fd0139 Wed Jun 20 14:51:10 2018 VERIFY OK: depth=1, C=AR, ST=Buenos Aires, L=BahÃa Blanca, O=Linuxito.com, OU=VPN, CN=Linuxito.com CA, name=EasyRSA, emailAddress=emiliano@linuxito.com Wed Jun 20 14:51:10 2018 Validating certificate key usage Wed Jun 20 14:51:10 2018 ++ Certificate has key usage 00a0, expects 00a0 Wed Jun 20 14:51:10 2018 VERIFY KU OK Wed Jun 20 14:51:10 2018 Validating certificate extended key usage Wed Jun 20 14:51:10 2018 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication Wed Jun 20 14:51:10 2018 VERIFY EKU OK Wed Jun 20 14:51:10 2018 VERIFY OK: depth=0, C=AR, ST=Buenos Aires, L=BahÃa Blanca, O=Linuxito.com, OU=VPN, CN=server, name=EasyRSA, emailAddress=emiliano@linuxito.com Wed Jun 20 14:51:10 2018 Data Channel Encrypt: Cipher 'AES-256-CBC' initialized with 256 bit key Wed Jun 20 14:51:10 2018 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication Wed Jun 20 14:51:10 2018 Data Channel Decrypt: Cipher 'AES-256-CBC' initialized with 256 bit key Wed Jun 20 14:51:10 2018 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication Wed Jun 20 14:51:10 2018 Control Channel: TLSv1.2, cipher TLSv1/SSLv3 ECDHE-RSA-AES256-GCM-SHA384, 2048 bit RSA Wed Jun 20 14:51:10 2018 [server] Peer Connection Initiated with [AF_INET]192.168.1.1:1194 Wed Jun 20 14:51:13 2018 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1) Wed Jun 20 14:51:13 2018 PUSH: Received control message: 'PUSH_REPLY,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0' Wed Jun 20 14:51:13 2018 OPTIONS IMPORT: timers and/or timeouts modified Wed Jun 20 14:51:13 2018 OPTIONS IMPORT: --ifconfig/up options modified Wed Jun 20 14:51:13 2018 OPTIONS IMPORT: route options modified Wed Jun 20 14:51:13 2018 OPTIONS IMPORT: peer-id set Wed Jun 20 14:51:13 2018 OPTIONS IMPORT: adjusting link_mtu to 1563 Wed Jun 20 14:51:13 2018 ROUTE_GATEWAY 192.168.0.1/255.255.255.0 IFACE=eth0 HWADDR=00:11:22:33:44:55 Wed Jun 20 14:51:13 2018 TUN/TAP device tun0 opened Wed Jun 20 14:51:13 2018 TUN/TAP TX queue length set to 100 Wed Jun 20 14:51:13 2018 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0 Wed Jun 20 14:51:13 2018 /sbin/ip link set dev tun0 up mtu 1500 Wed Jun 20 14:51:13 2018 /sbin/ip addr add dev tun0 local 10.8.0.6 peer 10.8.0.5 Wed Jun 20 14:51:13 2018 /sbin/ip route add 10.8.0.1/32 via 10.8.0.5 Wed Jun 20 14:51:13 2018 Initialization Sequence Completed
Se observa que la conexión procede con éxito y el servidor de VPN asigna la direccion IP 10.8.0.6
al cliente.
Habilitar el servicio con systemd
Sólo resta habilitar el servicio para que systemd inicie el cliente automáticamente al iniciar el sistema (valga la redundancia).
Habilitar el servicio "openvpn" en el archivo /etc/default/openvpn
:
root@ubuntu1604:/etc/openvpn# nano /etc/default/openvpn
Descomentar y configurar la variable AUTOSTART
:
AUTOSTART="client"
Luego es necesario hacer que systemd regenere el árbol de dependencias del servicio:
root@ubuntu1604:/etc/openvpn# systemctl daemon-reload
Es posible comprobar que el servicio ha quedado habilitado recurriendo al siguiente comando:
luser@ubuntu1604:~$ systemctl list-unit-files | grep vpn openvpn.service enabled openvpn@.service disabled
Finalmente, iniciar el servicio y verificar que la interfaz TUN sea correctamente creada y configurada:
root@ubuntu1604:/etc/openvpn# systemctl start openvpn
root@ubuntu1604:/etc/openvpn# ifconfig tun0 tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.6 P-t-P:10.8.0.5 Mask:255.255.255.255 inet6 addr: fe80::saraza/64 Scope:Link UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:192 (192.0 B)
Prueba de funcionamiento
Por último se comprueba el funcionamiento de la VPN con ping
u otra herramienta de diagnóstico desde el servidor:
root@vpn:/etc/openvpn# ping -c 3 10.8.0.6 PING 10.8.0.6 (10.8.0.6) 56(84) bytes of data. 64 bytes from 10.8.0.6: icmp_seq=1 ttl=64 time=171 ms 64 bytes from 10.8.0.6: icmp_seq=2 ttl=64 time=174 ms 64 bytes from 10.8.0.6: icmp_seq=3 ttl=64 time=172 ms --- 10.8.0.6 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 171.175/172.765/174.614/1.494 ms
Esta prueba de funcionamiento se hace desde el servidor, pues (en este caso) el cliente está detrás de una red NAT, lo cual haría imposible el acceso desde el exterior (Internet) sin la VPN.