Product SiteDocumentation Site

10.3. Red virtual privada

Una red virtual privada (VPN: «Virtual Private Network») es una forma de enlazar dos redes locales diferentes a través de Internet utilizando un túnel; el túnel generalmente está cifrado para confidencialidad. Usualmente se utilizan VPNs para integrar una máquina remota a la red local de una empresa.
Muchas herramientas proporcionan esta funcionalidad. OpenVPN es una solución eficiente, fácil de desplegar y mantener, basada en SSL/TLS. Otra posibilidad es utilizar IPsec para cifrar el tráfico IP entre dos máquinas; este cifrado es transparente, lo que significa que no necesita modificar las aplicaciones ejecutando en estos equipos para tener en cuenta la VPN. También puede utilizar SSH, además de para sus funcionalidades más convencionales, para proveer una VPN. Finalmente, puede establecer una VPN utilizando el protocolo PPTP de Microsoft. Existen otras soluciones, pero están más allá del alcance de este libro.

10.3.1. OpenVPN

OpenVPN es un pedazo de software dedicado a crear redes privadas virtuales. Su configuración involucra crear interfaces de red virtuales en el servidor VPN y en los clientes; es compatible con interfaces tun (para túneles a nivel de IP) y tap (para túneles a nivel Ethernet). En la práctica, usualmente utilizará interfaces tun excepto cuando los clientes VPN deban intengrarse a la red local del servidor a través de un puente Ethernet.
OpenVPN se basa en OpenSSL para toda la criptografía SSL/TLS y funcionalidades asociadas (confidencialidad, autenticación, integridad, falta de repudio). Puede configurarlo con una llave privada compartida o con un certificado X.509 basado en la infraestructura de llave pública. Se prefiere fuertemente esta última configuración ya que permite más flexibilidad cuando se enfrenta a un número creciente de usuarios itinerantes que acceden a la VPN.

10.3.1.1. Configuración del servidor OpenVPN

Después de que se hayan creado todos los certificados (siga las intrucciones de Sección 10.2.2, “Infraestructura de llave pública: easy-rsa), necesita copiarlos donde correspondan: la llave pública del certificado raíz (pki/ca.crt) será almacenada en todas las máquinas (tanto el servidor como los clientes) como /etc/ssl/certs/Falcot_CA.crt. Solo instalará el certificado del servidor en el servidor (pki/issued/vpn.falcot.com.crt en /etc/ssl/certs/vpn.falcot.com.crt y pki/private/vpn.falcot.com.key en /etc/ssl/private/vpn.falcot.com.key con permisos restringidos para que sólo el administrador pueda leerlo), con los parámetros Diffie-Hellman correspondientes (pki/dh.pem) instalados en /etc/openvpn/dh.pem. Instale los certificados de clientes en el cliente de VPN correspondiente de forma similar.
El script de inicialización de OpenVPN intenta, de forma predeterminada, iniciar todas las redes privadas virtuales definidas en /etc/openvpn/*.conf. Configurar un servidor VPN entonces es cuestión de almacenar el archivo de configuración correspondiente en este directorio. Un buen punto de partida es /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz que lleva a un servidor bastante estándar. Por supuesto necesitará adaptar algunos parámetros: ca, cert, key y dh describirán las ubicaciones seleccionadas para cada uno (respectivamente: /etc/ssl/certs/Falcot_CA.crt, /etc/ssl/vpn.falcot.com.crt, /etc/ssl/private/vpn.falcot.com.key y /etc/openvpn/dh.pem). La directiva server 10.8.0.0 255.255.255.0 define la subred utilizada por la VPN; el servidor utilizará la primera dirección IP en el rango (10.8.0.1) y se asignarán a los clientes el resto de las direcciones.
Con esta configuración OpenVPN creará una interfaz de red virtual al iniciar, generalmente con el nombre tun0. Sin embargo, normalmente se configuran los firewalls al mismo tiempo que las interfaces de red reales, lo que ocurre antes que inicie OpenVPN. La creación de una interfaz de red virtual persistente, y configurar OpenVPN para que la utilice, es una buena práctica recomendada. Esto además permite elegir el nombre de esta interfaz. A tal efecto, openvpn -mktun -dev vpn -dev-type tun crea una interfaz de red virtual llamada vpn de tipo tun; puede integrar fácilmente esta orden en el script de configuración del firewall o en la directiva up del archivo /etc/network/interfaces, o se puede añadir para ese propósito una regla de udev. Debe actualizar también el archivo de configuración de OpenVPN de forma acorde, con las directivas dev vpn y dev-type tun.
Sin más cambios, los clientes VPN sólo pueden acceder el servidor VPN en sí a través de la dirección 10.8.0.1. Para permitir a los clientes que accedan la red local (192.168.0.0/24) necesitará agregar una directiva push route 192.168.0.0 255.255.255.0 a la configuración de OpenVPN para que los clientes VPN automáticamente obtengan una ruta de red que les indique que esta red está disponible a través de la VPN. Lo que es más, los equipos en la red local también necesitarán ser informados que la ruta a la VPN es a través del servidor de VPN (esto funciona automáticamente cuando instala el servidor VPN en la puerta de enlace). Otra alternativa es configurar el servidor VPN para realizar enmascaramiento de IPs de forma que las conexiones que provengan de los clientes VPN parezcan provenir del servidor VPN en su lugar (revise la Sección 10.1, “Puerta de enlace”).

10.3.1.2. Configuración del cliente OpenVPN

Para configurar un cliente OpenVPN también necesita crear un archivo de configuración en /etc/openvpn/. Puede conseguir una configuración estándar utilizando /usr/share/doc/openvpn/examples/sample-config-files/client.conf como punto de partida. La directiva remote vpn.falcot.com 1194 describe la dirección y puerto del servidor OpenVPN; también necesita adaptar ca, cert y key para describir la ubicación de los archivos de llave.
Si no se debe iniciar la VPN automáticamente durante el inicio, configure la directiva AUTOSTART como none en el archivo /etc/default/openvpn. Siempre es posible iniciar o detener una conexión VPN dada con los comandossystemctl start openvpn@nombre y systemctl stop openvpn@nombre (donde la conexión nombre coincide con aquella definida en /etc/openvpn/nombre.conf).
El paquete network-manager-openvpn-gnome contiene una extensión para Network Manager (ver Sección 8.2.5, “Configuración de red automática para usuarios itinerantes”) que permite administrar redes privadas virtuales OpenVPN. Esto permite a cada usuario configurar gráficamente las conexiones OpenVPN y controlarlas desde el icono de administración de red.

10.3.2. Red privada virtual con SSH

En realidad existen dos formas de crear una red privada virtual con SSH. La histórica involucra establecer una capa PPP sobre el enlace SSH. Se describe este método en el siguiente «howto»:
El segundo método es más reciente y fue introducido con OpenSSH 4.3; ahora OpenSSH puede crear interfaces de red virtuales (tun*) en ambos extremos de una conexión SSH y puede configurar estas interfaces virtuales exactamente como si fueran interfaces físicas. Primero debe activar el sistema de túneles configurando PermitTunnel como «yes» en el archivo de configuración del servidor SSH (/etc/ssh/sshd_config). Cuando se establece la conexión SSH debe solicitar explícitamente la creación del túnel con la opción -w any:any (puede reemplaza any con el número de dispositivo tun deseado). Esto necesita que el usuario tenga permisos de administrador en ambos extremos para poder crear el dispositivo de red (en otras palabras, debe establecer la conexión como root).
Ambos métodos para crear redes privadas virtuales sobre SSH son bastante directos. Sin embargo, la VPN que proveen no es la más eficiente disponible; en particular, no maneja muy bien altos niveles de tráfico.
La explicación es que cuando se encapsula TCP/IP en una conexión TCP/IP (para SSH) se utiliza el protocolo TCP dos veces, una vez para la conexión SSH y una vez dentro del túnel. Esto genera problemas, especialmente debido a la forma en la que TCP se adapta a condiciones de red modificando los tiempo de espera. El siguiente sitio describe el problema en más detalle:
Los VPNs a través de SSH deberían, por tanto, restringirse a un túnel único sin ninguna restricción de rendimiento.

10.3.3. IPsec

IPsec, despite being the standard in IP VPNs, is rather more involved in its implementation. The IPsec engine itself is integrated in the Linux kernel; the required user-space parts, the control and configuration tools, are provided by the libreswan package or the strongswan package. Here we describe briefly the first of these options.
Primero instalamos el paquete libreswan. En términos concretos, cada /etc/ipsec.conf del anfitrión contiene los parámetros para túneles IPsec (o Security Associations, asociaciones de seguridad, en la terminología de IPsec) de los que se ocupa el anfitrión. Hay muchos ejemplos de configuración en /usr/share/doc/libreswan/, pero la documentación en línea de Libreswan tiene más ejemplos con explicaciones:
Se puede controlar el servicio IPsec con systemctl; por ejemplo, systemctl start ipsec iniciará el servicio IPsec.
A pesar de su estado como referencia, la complejidad de configuración de IPsec restringe su uso en la práctica. Generalmente se preferirán soluciones basadas en OpenVPN cuando los túneles necesarios no sean muchos ni demasiado dinámicos.

10.3.4. PPTP

PPTP (protocolo de túneles punto a punto: «Point-to-Point Tunneling Protocol») utiliza dos canales de comunicación, uno para datos de control y otro para los datos; este último utiliza el protocolo GRE (encapsulación genérica de enrutamiento: «Generic Routing Encapsulation»). Luego se establece un enlace PPP estándar sobre el canal de intercambio de datos.

10.3.4.1. Configuración del cliente

El paquete pptp-linux contiene un cliente PPTP para Linux fácil de configurar. Las instrucciones a continuación están inspiradas en la documentación oficial:
Los administradores de Falcot crearon varios archivos: /etc/ppp/options.pptp, /etc/ppp/peers/falcot, /etc/ppp/ip-up.d/falcot y /etc/ppp/ip-down.d/falcot.

Ejemplo 10.2. El archivo /etc/ppp/options.pptp

# opciones PPP utilizadas en una conexión PPTP
lock
noauth
nobsdcomp
nodeflate

Ejemplo 10.3. El archivo /etc/ppp/peers/falcot

# vpn.falcot.com es el servidor PPTP
pty "pptp vpn.falcot.com --nolaunchpppd"
# el usuario «vpn» identificará a la conexión
user vpn
remotename pptp
# necesita cifrado
require-mppe-128
file /etc/ppp/options.pptp
ipparam falcot

Ejemplo 10.4. El archivo /etc/ppp/ip-up.d/falcot

# Crear la ruta a la red Falcot
if [ "$6" = "falcot" ]; then
  # 192.168.0.0/24 es la red Falcot (remota)
  ip route add 192.168.0.0/24 dev $1
fi

Ejemplo 10.5. El archivo /etc/ppp/ip-down.d/falcot

# Eliminar la ruta a la red Falcot
if [ "$6" = "falcot" ]; then
  # 192.168.0.0/24 es la red Falcot (remota)
  ip route del 192.168.0.0/24 dev $1
fi

10.3.4.2. Configuración del servidor

pptpd es el servidor PPTP para Linux. Necesitará cambiar pocas cosas de su archivo de configuración principal, /etc/pptpd.conf: localip (dirección IP local) y remoteip (dirección IP remota). En el ejemplo a continuación el servidor PPTP siempre utiliza la dirección 192.168.0.199 y los clientes PPTP reciben una dirección IP desde 192.168.0.200 a 192.168.0.250.

Ejemplo 10.6. El archivo /etc/pptpd.conf

[..]
# TAG: localip
# TAG: remoteip
#       Specifies the local and remote IP address ranges.
#
#       These options are ignored if delegate option is set.
#
#       Any addresses work as long as the local machine takes care of the
#       routing.  But if you want to use MS-Windows networking, you should
#       use IP addresses out of the LAN address space and use the proxyarp
#       option in the pppd options file, or run bcrelay.
#
#       You can specify single IP addresses seperated by commas or you can
#       specify ranges, or both. For example:
#
#               192.168.0.234,192.168.0.245-249,192.168.0.254
#
#       IMPORTANT RESTRICTIONS:
#
#       1. No spaces are permitted between commas or within addresses.
#
#       2. If you give more IP addresses than the value of connections,
#          it will start at the beginning of the list and go until it
#          gets connections IPs.  Others will be ignored.
#
#       3. No shortcuts in ranges! ie. 234-8 does not mean 234 to 238,
#          you must type 234-238 if you mean this.
#
#       4. If you give a single localIP, that's ok - all local IPs will
#          be set to the given one. You MUST still give at least one remote
#          IP for each simultaneous client.
#
# (Recommended)
#localip 192.168.0.1
#remoteip 192.168.0.234-238,192.168.0.245
# or
#localip 192.168.0.234-238,192.168.0.245
#remoteip 192.168.1.234-238,192.168.1.245
localip 192.168.0.199
remoteip 192.168.0.200-250
La configuración PPP utilizada por el servidor PPTP también necesita algunos cambios en el archivo /etc/ppp/pptpd-options. Los parámetros importantes son el nombre del servidor (pptp), el nombre del dominio (falcot.com y la dirección IP para los servidores DNS y WINS.

Ejemplo 10.7. El archivo /etc/ppp/pptpd-options

## Habilite las instalaciones de depuración de conexiones.
## (consultar la configuración de syslog para saber a dónde envíar pppd)
#debug

# Nombre del sistema local para fines de autenticación
# (debe coincidir con el segundo campo de las entradas de /etc/ppp/chap-secrets)
nombre pptpd

# Opcional: nombre de dominio que se utilizará para la autenticación
## cambiar el nombre de dominio a su dominio local
dominio falcot.com

# Autenticación
## estos son valores predeterminados razonables para los clientes WinXXXX
## para la configuración relacionada con la seguridad
auth
refuse-pap
refuse-chap
refuse-mschap
# Requerir que el par se autentique a sí mismo usando MS-CHAPv2 [Microsoft
# Challenge Handshake Authentication Protocol, Versión 2] autenticación.
require-mschap-v2
# Requiere cifrado MPPE de 128 bits
# (tenga en cuenta que MPPE requiere el uso de MSCHAP-V2 durante la autenticación)
require-mppe-128

# Red y enrutamiento
## Rellena tus direcciones
ms-dns 192.168.0.1
ms-wins 192.168.0.1
El último paso consiste en registrar el usuario vpn (y su contraseña asociada) en el archivo /etc/ppp/chap-secrets. A diferencia de otras instancias en las que un asterisco («*») funcionaría, aquí debe proveer explícitamente el nombre del servidor. Lo que es más, los clientes PPTP Windows se identifican a sí mismo en la forma DOMINIO\\USUARIO en lugar de sólo proveer un nombre de usuario. Esto explica porqué el archivo también menciona el usuario FALCOT\\vpn. También es posible especificar una dirección IP individual para los usuarios; un asterisco en este campo especifica que debe utilizar direcciones dinámicas.

Ejemplo 10.8. El archivo /etc/ppp/chap-secrets

# Secretos para autenticación utilizando CHAP
# cliente       servidor secreto     dirección IP
vpn             pptp     f@Lc3au     *
FALCOT\\vpn     pptp     f@Lc3au     *