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.


Tal vez pueda interesarte


Compartí este artículo