Como configurar una conexión PPP contra una VPN en Linux

pila OSI
Pila OSI para TCP/IPfuente:wikipedia

En este post se describe cómo conectar un cliente a una red privada
virtual (VPN) usando el protocolo de enlace PPP.

Tecnologías implicadas

PPP (Point to Point Protocol) es un protocolo englobado en el nivel de enlace dentro de la pila de protocolos OSI para TCP/IP. Encapsulando a PPP se pueden emplear PPtP (Point to Point tunneling Protocol), PPPoE (PPP over Ethernet) , PPPoA (PPP over ATM), … Dependiendo de cómo esté configurada la VPN habrá que usar uno u otro.

Configuración del cliente en ubuntu

En ubuntu hay que usar el demonio pppd y en este caso concreto usaremos pptp. Todo esto está en los
repositorios oficiales, por lo que se pueden instalar con el apt-get.

Una vez instalados configuraremos el perfil del peer, para lo cual crearemos un archivo con nombre descriptivo
en /etc/ppp/peers dónde definiremos las opciones de la conexión :

#--------------- /etc/ppp/peers/mypeer ---------------------

pty "pptp $REMOTE_IP --nolaunchpppd" # En esta línea pondría pppoe si los usásemos
#debug # Loguea exhaustivamente en /var/log/syslog; muy útil al principio para depurar errores.
dump # Muestra las opciones efectivas de configuración y de dónde salen
endpoint $REMOTE_IP
noipdefault
user $USERNAME
password $PASSWORD

# Para más información sobre opciones de configuracion : man pppd
# Para más información sobre ppptp : man ppptp

#--------------- /etc/ppp/peers/mypeer ---------------------

Por último queda invocar la conexión :

# pppd call mypeer

Si todo está bien debería haber una interfaz conectada con la red :

# ifconfig

	ppp0      Link encap:Point-to-Point Protocol
	          inet addr:172.16.XXX.XXX  P-t-P:172.16.XXX.XXX  Mask:255.255.255.255
	          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1024  Metric:1
	          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
	          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
	          collisions:0 txqueuelen:3
	          RX bytes:121 (121.0 B)  TX bytes:104 (104.0 B)

Problemas conocidos

No se puden alcanzar host de la vpn
Posiblemente sea un problema de entutamiento. Hay que añadir la red a la tabla de rutas.

$ route add -net $VPN_NET dev $PPP_IFACE

Si no queremos hacer esto manualmente se puede inluir en un archivo en /etc/ppp/ip-up.d/ :

# ---------------------- /etc/ppp/ip-up.d/update_routing_table ------------------
#!/bin/bash
NET="172.16.0.0/16"
IFACE="ppp0"
route add -net ${NET} dev ${IFACE}
# ---------------------- /etc/ppp/ip-up.d/update_routing_table ------------------

Creo que hay una opción de pppd que sirve para lo mismo, pero no lo he probado (you know : “if works don’t touch” 🙂 ).

scp no funciona correctamente o la conexión se cuelga
Durante la conexión se negocia el mtu de la red; pero en ocasiones esto no es suficiente por lo que hay que ajustarlo a mano. Por ejemplo:

$ pppd call mypeer mtu 1024