Product SiteDocumentation Site

10.3. Xarxa privada virtual

Una xarxa virtual privada(VPN o «Virtual Private Network» en anglès) és una manera d'enllaçar dues xarxes locals diferents a través d'Internet usant un túnel; el túnel és generalment xifrat per confidencialitat. Les VPN s'utilitzen sovint per integrar una màquina remota dins de la xarxa local d'una empresa.
Diverses eines proporcionen aquesta funcionalitat. OpenVPN és una solució eficient, fàcil de desplegar i mantenir, basada en SSL/TLS. Una altra possibilitat és utilitzar IPsec per xifrar el trànsit IP entre dues màquines; aquest xifratge és transparent, cosa que significa que les aplicacions que s'executen en aquests amfitrions no han de ser modificades per tenir en compte la VPN. SSH també es pot utilitzar per proporcionar una VPN, a més de les seves característiques més convencionals. Finalment, es pot establir una VPN mitjançant el protocol PPTP de Microsoft. Existeixen altres solucions, però estan més enllà de l'abast d'aquest llibre.

10.3.1. OpenVPN

OpenVPN és un programari dedicat a la creació de xarxes privades virtuals. La seva configuració implica la creació d'interfícies de xarxa virtuals al servidor VPN i al(s) client(s); és compatible tant amb interfícies tun (per a túnels a nivell IP) i tap (per a túnels a nivell Ethernet). A la pràctica, les interfícies tun s'utilitzaran amb més freqüència excepte quan els clients VPN estan destinats a ser integrats a la xarxa local del servidor mitjançant un pont Ethernet.
L'OpenVPN es basa en l'OpenSSL per a tota la criptografia SSL/TLS i característiques associades (confidencialitat, autenticació, integritat, no-repudiació). Es pot configurar amb una clau privada compartida o utilitzant certificats X.509 basats en una infraestructura de clau pública. Aquesta última configuració sol ser la preferida, ja que permet una major flexibilitat quan cal afrontar a un nombre creixent d'usuaris itinerants que accedeixen a la VPN.

10.3.1.1. Configuració del servidor OpenVPN

Després que s'hagin creat tots els certificats (seguint les instruccions de Secció 10.2.2, «Infraestructura de clau pública: easy-rsa»), s'han de copiar on correspongui: la clau pública del certificat arrel (pki/ca.crt) s'emmagatzemarà a totes les màquines (tant clients com servidors) com a /etc/ssl/certs/Falcot_CA.crt. El certificat del servidor només s'instal·la al servidor (pki/issued/vpn.falcot.com.crt va a /etc/ssl/certs/vpn.falcot.com.crt, i pki/private/vpn.falcot.com.key va a /etc/ssl/private/vpn.falcot.com.key amb permisos restringits perquè només l'administrador el pugui llegir), amb els paràmetres Diffie-Hellman corresponents (pki/dh.pem) instal·lats a /etc/openvpn/dh.pem. Els certificats de client s'instal·len en el corresponent client VPN de manera similar.
By default, the OpenVPN initialization script tries starting all virtual private network servers defined in /etc/openvpn/server/*.conf. Setting up a VPN server is therefore a matter of storing a corresponding configuration file in this directory. A good starting point is /usr/share/doc/openvpn/examples/sample-config-files/server.conf, which leads to a rather standard server. Of course, some parameters need to be adapted: ca, cert, key and dh need to describe the selected locations (respectively, /etc/ssl/certs/Falcot_CA.crt, /etc/ssl/vpn.falcot.com.crt, /etc/ssl/private/vpn.falcot.com.key and /etc/openvpn/dh.pem). The server 10.8.0.0 255.255.255.0 directive defines the subnet to be used by the VPN; the server uses the first IP address in that range (10.8.0.1) and the rest of the addresses are allocated to clients.
Amb aquesta configuració, a l'engegar l'OpenVPN crea la interfície de xarxa virtual, normalment amb el nom tun0. No obstant això, els tallafocs es configuren sovint al mateix temps que les interfícies de xarxa reals, que ocorre abans que comenci l'OpenVPN. Per tant, una bona pràctica recomana crear una interfície de xarxa virtual persistent, i configurar l'OpenVPN per utilitzar aquesta interfície preexistent. Això també permet triar el nom d'aquesta interfície. A aquest efecte, openvpn --mktun --dev vpn --dev-type tun crea una interfície de xarxa virtual anomenada vpn de tipus tun; aquesta ordre es pot integrar fàcilment a l'script de configuració del tallafocs, o en una directiva up del fitxer /etc/network/interfaces, o una regla udev es pot crear amb aquesta fi. El fitxer de configuració d'OpenVPN també s'ha d'actualitzar en conseqüència amb les directives dev vpn i dev-type tun.
Sense fer res més, els clients VPN només poden accedir al servidor VPN a través de l'adreça 10.8.0.1. La concessió als clients d'accés a la xarxa local (192.168.0.0/24), requereix l'addició d'una directiva push route 192.168.0.0 255.255.255.0 a la configuració de l'OpenVPN perquè els clients VPN obtinguin automàticament una ruta de xarxa que els digui que aquesta xarxa és accessible a través de la VPN. A més, les màquines de la xarxa local també han de ser informades que la ruta cap a la VPN passa pel servidor VPN (això funciona automàticament quan el servidor VPN està instal·lat a la passarel·la d'entrada). Alternativament, el servidor VPN es pot configurar per realitzar emmascaraments IP de manera que les connexions procedents de clients VPN apareguin com si vinguessin del servidor VPN (vegeu Secció 10.1, «Gateway»).

10.3.1.2. Configuració del cliente OpenVPN

Setting up an OpenVPN client requires creating a configuration file in /etc/openvpn/client/. A standard configuration can be obtained by using /usr/share/doc/openvpn/examples/sample-config-files/client.conf as a starting point. The remote vpn.falcot.com 1194 directive describes the address and port of the OpenVPN server; the ca, cert and key also need to be adapted to describe the locations of the key files.
If the VPN should not be started automatically on boot, set the AUTOSTART directive to none in the /etc/default/openvpn file. Starting or stopping a given VPN connection is always possible with the commands systemctl start openvpn-client@name and systemctl stop openvpn-client@name (where the connection name matches the one defined in /etc/openvpn/client/name.conf). The same is true for the server.
The network-manager-openvpn(-gnome) package contains an extension to Network Manager (see Secció 8.2.5, «Configuració automàtica de la xarxa per a usuaris itinerants») that allows managing OpenVPN virtual private networks. This allows every user to configure OpenVPN connections graphically and to control them from the network management icon.

10.3.2. Xarxa privada virtual amb SSH

En realitat hi ha dues maneres de crear una xarxa privada virtual amb SSH. La manera antiga consisteix en establir una capa PPP sobre l'enllaç SSH. Aquest mètode es descriu en un document HOWTO:
El segon mètode és més recent, i es va introduir amb OpenSSH 4.3; ara és possible que OpenSSH creï interfícies de xarxa virtual (tun*) a ambdós costats d'una connexió SSH, i aquestes interfícies virtuals es poden configurar exactament com si fossin interfícies físiques. El sistema de tunelització s'ha d'activar primer establint PermitTunnel a «yes» al fitxer de configuració del servidor SSH (/etc/ssh/sshd_config). En establir la connexió SSH, la creació d'un túnel ha de ser explícitament sol·licitada amb l'opció -w any:any (any pot ser substituït amb el nombre de dispositiu tun desitjat). Això requereix que l'usuari tingui privilegis d'administrador en ambdós costats, per tal de poder crear el dispositiu de xarxa (en altres paraules, la connexió s'ha d'establir com a usuari arrel).
Tots dos mètodes per crear una xarxa privada virtual a través de SSH són bastant senzills. No obstant això, la VPN que proporcionen no és la més eficient disponible; en particular, no gestiona massa bé els nivells alts de trànsit.
L'explicació és que quan una pila TCP/IP es troba encapsulada dins d'una connexió TCP/IP (per a SSH), el protocol TCP s'utilitza dues vegades, una vegada per a la connexió SSH i una vegada dins del túnel. Això comporta problemes, especialment a causa de la forma en què TCP s'adapta a les condicions de la xarxa alterant els retards de temps d'espera. El següent lloc descriu el problema amb més detall:
Per tant, les VPN sobre SSH s'han de restringir a túnels únics sense restriccions de rendiment.

10.3.3. IPsec

IPsec, malgrat ser l'estàndard en les VPNs IP, està més implicat en la seva implementació. El motor IPsec està integrat al nucli de Linux; les parts necessàries de l'espai d'usuari, les eines de control i configuració són proporcionades pel paquet libreswan o el paquet strongswan. Aquí descriurem breument la primera d'aquestes opcions.
Primer, instal·lem el paquet libreswan. En termes concrets, el /etc/ipsec.conf de cada equip conté els paràmetres per a túnels IPsec (o Security Associations, en la terminologia IPsec) de què el servidor s'ocupa. Hi ha molts exemples de configuració a /usr/share/doc/libreswan/, però la documentació en línia de Libreswan té més exemples amb explicacions:
El servei IPsec es pot controlar amb systemctl; per exemple, systemctl start ipsec iniciarà el servei IPsec.
Malgrat el seu estatus com a referència, la complexitat de la configuració d'IPsec restringeix el seu ús en la pràctica. Les solucions basades en OpenVPN es preferiran generalment quan els túnels requerits no siguin masses ni massa dinàmics.

10.3.4. PPTP

PPTP (de «Point-to-Point Tunneling Protocol» o “Protocol de túnel punt a punt”) utilitza dos canals de comunicació, un per a les dades de control i un altre per a les dades; aquest últim utilitza el protocol GRE («Generic Routing Encapsulation» o “Encapsulació d'encaminament genèric”). A continuació es crea un enllaç PPP estàndard sobre el canal d'intercanvi de dades.

10.3.4.1. Configuració del client

El paquet pptp-linux conté un client PPTP fàcilment configurable per a Linux. Les següents instruccions s'inspiren en la documentació oficial:
Els administradors de Falcot van crear diversos fitxers: /etc/ppp/options.pptp, /etc/ppp/peers/falcot, /etc/ppp/ip-up.d/falcot, i /etc/ppp/ip-down.d/falcot.

Exemple 10.2. El fitxer /etc/ppp/options.pptp

# opcions PPP usades en una connexió PPTP
lock
noauth
nobsdcomp
nodeflate

Exemple 10.3. El fitxer /etc/ppp/peers/falcot

# vpn.falcot.com és el servidor PPTP
pty "pptp vpn.falcot.com --nolaunchpppd"
# la connexió s'identificarà usant l'usuari "vpn"
user vpn
remotename pptp
# es necessita xifratge
require-mppe-128
file /etc/ppp/options.pptp
ipparam falcot

Exemple 10.4. El fitxer /etc/ppp/ip-up.d/falcot

# Crea la ruta cap a la xarxa de Falcot
if [ "$6" = "falcot" ]; then
  # 192.168.0.0/24 és la xarxa (remota) de Falcot
  ip route add 192.168.0.0/24 dev $1
fi

Exemple 10.5. El fitxer /etc/ppp/ip-down.d/falcot

# Elimina la ruta cap a la xarxa de Falcol
if [ "$6" = "falcot" ]; then
  # 192.168.0.0/24 és la xarxa (remota) de Falcot
  ip route del 192.168.0.0/24 dev $1
fi

10.3.4.2. Configuració del servidor

pptpd és el servidor PPTP per a Linux. El seu fitxer de configuració principal, /etc/pptpd.conf, requereix molt pocs canvis: localip (adreça IP local) i remoteip (adreça IP remota). En l'exemple següent, el servidor PPTP sempre utilitza l'adreça 192.168.0.199, i els clients PPTP reben adreces IP de 192.168.0.200 a 192.168.0.250.

Exemple 10.6. El fitxer /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ó PPP utilitzada pel servidor PPTP també requereix alguns canvis a /etc/ppp/pptpd-options. Els paràmetres importants són el nom del servidor (pptp), el nom del domini (falcot.com), i les adreces IP dels servidors de DNS i WINS.

Exemple 10.7. El fitxer /etc/ppp/pptpd-options

# Enable connection debugging facilities.
# (see your syslog configuration for where pppd sends to)
#debug

# Name of the local system for authentication purposes
# (must match the second field in /etc/ppp/chap-secrets entries)
name pptpd

# Optional: domain name to use for authentication
## change the domainname to your local domain
domain falcot.com

# Authentication
## these are reasonable defaults for WinXXXX clients
## for the security related settings
auth
refuse-pap
refuse-chap
refuse-mschap
# Require the peer to authenticate itself using MS-CHAPv2 [Microsoft
# Challenge Handshake Authentication Protocol, Version 2] authentication.
require-mschap-v2
# Require MPPE 128-bit encryption
# (note that MPPE requires the use of MSCHAP-V2 during authentication)
require-mppe-128

# Network and Routing
## Fill in your addresses
ms-dns 192.168.0.1
ms-wins 192.168.0.1

## Fill in your netmask
netmask 255.255.255.0

## some defaults
nodefaultroute
proxyarp
lock
L'últim pas consisteix a registrar l'usuari vpn (i la contrasenya associada) al fitxer /etc/ppp/chap-secrets. Contràriament a altres instàncies on funcionaria un asterisc (*), el nom del servidor s'ha d'explicitar aquí. A més, els clients PPTP de Windows s'identifiquen amb la forma DOMINI\\USER, en lloc de només proporcionar un nom d'usuari. Això explica per què el fitxer també esmenta l'usuari FALCOT\\vpn. També és possible especificar adreces IP individuals per als usuaris; un asterisc en aquest camp especifica que s'ha d'utilitzar l'adreçament dinàmic.

Exemple 10.8. El fitxer /etc/ppp/chap-secrets

# Secrets per a l'autenticació usant CHAP
# client       servidor secret     adreça IP
vpn             pptp     f@Lc3au     *
FALCOT\\vpn     pptp     f@Lc3au     *