Configurar la conexión
La forma más cómoda de configurar la conexión es mediante el port net/mpd5. Es necesario que el núcleo que estemos corriendo tenga soporte para netgraph (el núcleo GENERIC lo incorpora mediante módulos, que se cargan automáticamente cuando se necesitan).
Una vez instalado el port, preparamos el archivo de configuración, que se encuentra en /usr/local/etc/mpd5/mpd.conf
El port instala su documentación en /usr/local/share/doc/mpd5.
Antes de nada, necesitaremos varios datos que nos suministrará el administrador de la red remota:
- La dirección IP del servidor VPN: por ejemplo, 70.70.70.70
- La red a la que nos da acceso: por ejemplo, 100.0.0.0/255.0.0.0
- Usuario y password de la conexión: por ejemplo, vpn_user, secret
# archivo /usr/local/etc/mpd5/mpd.conf
startup:
set user admin admin admin
default:
load servidor_vpn_oficina
servidor_vpn_oficina:
create bundle static B1
# Use a net/mask to create specific routes
set iface route 100.0.0.0/8
# Script to execute on connect/disconnect (custom routes etc)
# descomentar estas líneas cuando se disponga de los scripts correctamente configurados
# set iface up-script /usr/local/etc/mpd5/up-script.servidor_vpn_oficina.sh
# set iface down-script /usr/local/etc/mpd5/down-script.servidor_vpn_oficina.sh
# Accept any IP-address
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
# Microsoft Point-to-Point Compression, only enable if you have a really fast machine
set bundle enable compression
set ccp yes mppc
# PARA EVITAR EL ERROR LCP: protocol 0x2145 was rejected
set mppc yes stateless
set mppc yes e56
set mppc yes e128
# otras opciones
create link static L1 pptp
set link action bundle B1
# Replace with you credentials or use the mpd.secret file
set auth authname vpn_user
set auth password secret
set link max-redial 0
set link mtu 1460
set link keep-alive 20 75
# Hostname/IP of the VPN server
set pptp peer 70.70.70.70
set pptp disable windowing
set link no eap
open
# fin /usr/local/etc/mpd5/mpd.conf
Conexión con la VPN
Para establecer la conexión, ejecutamos desde una shell de root:
# mpd5 conexion_vpn_oficina
Veremos por el terminal gran cantidad de información acerca de la conexión. Al final, se debe mostrar lo siguiente:
[B1] IPCP: LayerUp
[B1] 100.0.90.5 -> 100.0.100.81
[B1] IFACE: Up event
En este momento, la conexión debería estar abierta y funcionando correctamente. La interfaz creada es ng0:
# ifconfig ng0
ng0: flags=88d1
inet 100.0.90.5 --> 100.0.100.81 netmask 0xffffffff
Los módulos que se han cargado en mi caso han sido:
# kldstat | tail
26 1 0xc60c9000 4000 ng_socket.ko
27 1 0xc60cd000 4000 ng_mppc.ko
28 1 0xc60d1000 2000 rc4.ko
29 1 0xc60d3000 4000 ng_iface.ko
30 1 0xc60d7000 7000 ng_ppp.ko
31 1 0xc60e0000 3000 ng_tee.ko
32 1 0xc60e3000 4000 ng_pptpgre.ko
33 1 0xc60e7000 5000 ng_ksocket.ko
En el terminal donde se lanzó el comando mpd5 se nos mostrará la línea de comandos de mpd (dar al intro para que aparezca):
Available commands:
authname : Choose link by auth name bundle : Choose/list bundles
close : Close a layer create : Create new item
destroy : Destroy item exit : Exit console
iface : Choose bundle by iface help : Help on any command
link : Choose link load : Read from config file
log : Set/view log options msession : Ch. bundle by msession-id
open : Open a layer quit : Quit program
repeater : Choose/list repeaters session : Choose link by session-id
set : Set parameters show : Show status
[L1]
authname : Choose link by auth name bundle : Choose/list bundles
close : Close a layer create : Create new item
destroy : Destroy item exit : Exit console
iface : Choose bundle by iface help : Help on any command
link : Choose link load : Read from config file
log : Set/view log options msession : Ch. bundle by msession-id
open : Open a layer quit : Quit program
repeater : Choose/list repeaters session : Choose link by session-id
set : Set parameters show : Show status
[L1]
[L1] show link
Link L1 (static):
Configuration:
Device type : pptp
MRU : 1500 bytes
MRRU : 2048 bytes
Ctrl char map : 0x000a0000 bytes
Retry timeout : 2 seconds
Max redial : unlimited, delay 1s
Bandwidth : 64000 bits/sec
Latency : 2000 usec
Keep-alive : every 20 secs, timeout 75
Ident string : ""
Link incoming actions:
Bundle B1
Link level options:
Self Peer
incoming disable
pap disable accept
chap-md5 disable accept
chap-msv1 disable deny
chap-msv2 disable accept
eap disable deny
acfcomp enable accept
protocomp enable accept
keep-ms-domain disable
magicnum enable
passive disable
check-magic enable
no-orig-auth disable
callback disable
multilink disable
shortseq enable accept
time-remain disable
peer-as-calling disable
report-mac disable
Link state:
State : UP
Session Id : 1506855-L1
Peer ident :
Session time : 202 seconds
Up/Down stats:
Up Reason : Manual
Traffic stats:
Input octets : 136
Input frames : 12
Output octets : 150
Output frames : 12
Bad protocols : 0
Runts : 0
Dup fragments : 0
Drop fragments : 0
Cerrar la conexión
Para cerrar la conexión, simplemente escribimos quit:
[L1] quit
Console closed.
process 6401 terminated
Configurar el NAT
Bien, ya solo queda explicar las dos siguientes líneas del fichero de configuración:
# Script to execute on connect (custom routes etc)
set iface up-script /usr/local/etc/mpd5/up-script.servidor_vpn_oficina.sh
set iface down-script /usr/local/etc/mpd5/down-script.servidor_vpn_oficina.sh
Lo que perseguimos es que la conexión se comparta con otros nodos de la red mediante NAT. Para ello, usaremos el estupendo Packet Filter de OpenBSD (todo una obra de arte, dicho sea de paso).
En mi caso, el archivo de configuración /etc/pf.conf que manejo para PF es realmente sencillo:
# http://www.openbsd.org/faq/pf
# macros
# tablas
# http://www.openbsd.org/faq/pf/tables.html
table
# options
# http://www.openbsd.org/faq/pf/options.html
set debug urgent
set skip on lo0
# scrub
# http://www.openbsd.org/faq/pf/scrub.html
scrub in all no-df
# nat
# http://www.openbsd.org/faq/pf/nat.html
# poner aquí todos los interfaces dinámicos que podamos tener
nat-anchor tap0 # openvpn
nat-anchor ng0 # VPN microsoft
nat-anchor tun0 # orange everywhere
nat-anchor tap0 # openvpn
nat-anchor ng0 # VPN microsoft
nat-anchor tun0 # orange everywhere
# http://www.openbsd.org/faq/pf/filter.html
# filter
pass in all
pass out all
Básicamente, dejamos que nuestro host deje pasar todo tipo de tráfico, sin imponer ninguna restricción. Los anchors destinados a nat nos permitirán añadir/eliminar reglas específicas, sin afectar al resto. En nuestro caso, nos afe Para activar PF, añadir las siguiente líneas al /etc/rc.conf:
pf_enable="YES"
gateway_enable="YES"
(asegurarse de que no se usa ningún otra herramienta de filtrado de paquetes como IPFW). La opción gateway_enable permite que nuestro host actúe como router, encaminando los paquetes hacia los destinos adecuados según nuestra tabla de rutas.
Para arrancar PF, lanzamos:
# /etc/rc.d/pf start
Enabling pf
No ALTQ support in kernel
ALTQ related functions disabled
No ALTQ support in kernel
ALTQ related functions disabled
No ALTQ support in kernel
ALTQ related functions disabled
pf enabled
Para verificar que el filtrado está funcionando, lanzar pfctl -s all, que nos muestra un extenso resumen del estado de PF.
Ahora vayamos al contenido de los dos scripts mencionados anteriormente. En el caso de up-script.servidor_vpn_oficina.sh, se activa el NAT para la interfaz ng0 cuando se abra la conexión, de modo que cualquier paquete que nuestro host deba encaminar por esa interfaz sea convenientemente camuflado para aparentar que sale de nuestro host, y no desde el host que emitió ese paquete. El contenido del script es simplemente:
#!/bin/sh
dev="$1"
echo "nat pass on $dev from ! $dev to 100.0.0.0/8 -> $dev" | \
/sbin/pfctl -a $dev -N -f -
Observar que no hacemos mención alguna a la interfaz ng0: se envía como primera parámetro al script (hay otros, ver la documentación para más detalles). Una cosa muy importante es que se realiza NAT para todos los paquetes excepto para aquellos que se emitan desde la propia interfaz ng0 (sentencia !$if). La razón es que los paquetes que emita nuestro host a través de la interfaz ng0 no deben ser tratados por el NAT, ya que no es necesario, y por otro lado nos daría ciertos problemas con algunas aplicaciones como el NFS . Por ejemplo, si queremos montar por NFS un directorio desde nuestro host, el NAT modificará el puerto origen y esto confundirá al cliente de NFS, que no será capaz de montar nada. Por supuesto, desde otro host de nuestra red no será posible montar por NFS los directorios que se exporten desde la VPN, pero esto ya es una limitación inherente al NAT.
Podemos ver el estado del NAT mediante pfctl -a ng0 -s nat. Por ejemplo, en mi caso:
# pfctl -a ng0 -s nat
No ALTQ support in kernel
ALTQ related functions disabled
nat pass on ng0 inet from ! 100.0.90.5 to 100.0.0.0/8 -> 100.0.90.5
El contenido del script down-script.servidor_vpn_oficina.sh simplemente limpiará las reglas del NAT establecidas en la interfaz ng0:
#!/bin/sh
dev="$1"
/sbin/pfctl -a "$dev" -F all
Este script será invocado cuando cerremos la conexión con la VPN.
Acceder a la VPN desde otros nodos de nuestra red
Ya tenemos el enlace con la VPN funcionando, con el NAT correctamente establecido, y nuestro host haciendo de encaminador (router). Para configurar otro host de nuestra red de modo que pueda alcanzar la VPN, simplemente le indicamos por dónde tiene que encaminar los paquetes que emita hacia la red 100.0.0.0/255.0.0.0 (recordad que ésa era la red de la VPN). Por ejemplo, si nuestro host está conectado a una LAN a través de una red 192.168.50.1/255.255.255.0, cualquier nodo de esa red podrá conectarse a la red 100.0.0.0/255.0.0.0 de la VPN añadiendo la ruta correcta. Por ejemplo, si el nodo fuera otro FreeBSD:
# route add 100/8 192.168.50.1
No hay comentarios:
Publicar un comentario