OpenVPN y CIPE: Haciendo tuneles VPN con Fedora

Este HowTo es valido tanto para Fedora como para RH 8 y 9.

VPN ¿para que?

Una VPN (red privada virtual) es una tuberi­a por la que se comunican dos maquinas (o redes) de forma que el contenido de la tuberi­a esta cifrado y no es posible descifrar por nadie que no se una de las puntas de la VPN.

A continuacion una breve gui­a de como instalar OpenVPN y CIPE.

Toni
Byx.com
¿Porque OpenVPN?
OpenVPN es una aplicacion de tunneling robusta y altamente flexible, ademas usa todos los tipos de encriptacion, autenticacion y certificacion que la librería OpenSSL para garantizar la seguridad en un tunel IP sobre un puerto TCP o UDP (por defecto UDP!!). OpenVPN utiliza la libreria LZO para la compresion.

La mejor forma de entender que es una VPN es haciendo una pero antes hay que tener en cuenta varios asuntos:
-Comprueba que las dos maquinas con las que quieres hacer la VPN "se ven", es decir, puedes hacer ping de una maquina a otra y viceversa.
-El tunel VPN tendra un direccionamiento diferente a la red que estas usando.
-Si estas en red local, las direcciones IP, seran las privadas de las maquinas, si estas haciendo un tunel a traves de Internet, la ip local, sera la privada de tu maquina, y la remota, sera la publica de la maquina contra la que haces el tunel (y en la otra punta del tunel sigue la misma metodologi­a).
-Ten en cuenta que si tienes un router ADSL o firewall debes hacer NAT (o PAT) para que las peticiones que llegan al puerto 5000 UDP del router se redirijan al 5000 UDP de la maquina destino (la otra punta de la VPN).

Bueno, vamos al lio:

Lo principal es tener el software necesario:

# yum install openvpn

Probablemente, como dependencia, instale lzo (si no estaba antes instalado) que sera el metodo de compresion que utilizaremos para nuestra vpn.

Situate en el directorio en el que vamos a trabajar:

# cd /etc/openvpn/

Genera la clave que usaremos en nuestro tunel:

# openvpn --genkey --secret clave.key

Copia el archivo clave.key a la otra maquina del tunel (deben tener la misma clave). Copialo por scp, haciendo "copy-paste" por ssh o como quiereas pero usa una forma segura.

Creamos el archivo tunel.conf en ambas maquinas (dentro del directorio /etc/openvpn):

# vi tunel.conf
local tu.ip.local
remote ip.remota
dev tun0
port 5000
comp-lzo
user nobody
ping 15
ifconfig ip.vpn.local ip.vpn.remota
secret /etc/openvpn/clave.key

NOTA: ip.vpn.local y remota son las IPs que asignamos a nuestra vpn, escribe por ejemplo 172.16.0.1 y 172.16.0.2, seran las IPps de tun0 en cada punta del tunel.

Arrancamos en modo extendido el tunel en las dos puntas para ver que todo funciona correctamente:
# openvpn --verb 5 --config /etc/openvpn/tunel.conf

Thu Feb 5 10:57:23 2004 0[0]: Current Parameter Settings:
Thu Feb 5 10:57:23 2004 1[0]: config = '/etc/openvpn/tunel.conf'
Thu Feb 5 10:57:23 2004 2[0]: persist_config = DISABLED
Thu Feb 5 10:57:23 2004 3[0]: persist_mode = 1
Thu Feb 5 10:57:23 2004 4[0]: show_ciphers = DISABLED
Thu Feb 5 10:57:23 2004 5[0]: show_digests = DISABLED
Thu Feb 5 10:57:23 2004 6[0]: genkey = DISABLED
Thu Feb 5 10:57:23 2004 7[0]: askpass = DISABLED
Thu Feb 5 10:57:23 2004 8[0]: show_tls_ciphers = DISABLED
Thu Feb 5 10:57:23 2004 9[0]: proto = 0
Thu Feb 5 10:57:23 2004 10[0]: local = '10.10.21.1'
Thu Feb 5 10:57:23 2004 11[0]: remote = '10.10.21.80'
Thu Feb 5 10:57:23 2004 12[0]: local_port = 5000
Thu Feb 5 10:57:23 2004 13[0]: remote_port = 5000
Thu Feb 5 10:57:23 2004 14[0]: remote_float = DISABLED
Thu Feb 5 10:57:23 2004 15[0]: ipchange = '[UNDEF]'
Thu Feb 5 10:57:23 2004 16[0]: bind_local = ENABLED
Thu Feb 5 10:57:23 2004 17[0]: dev = 'tun0'
Thu Feb 5 10:57:23 2004 18[0]: dev_type = '[UNDEF]'
Thu Feb 5 10:57:23 2004 19[0]: dev_node = '[UNDEF]'
Thu Feb 5 10:57:23 2004 20[0]: tun_ipv6 = DISABLED
Thu Feb 5 10:57:23 2004 21[0]: ifconfig_local = '1172.16.0.1'
Thu Feb 5 10:57:23 2004 22[0]: ifconfig_remote_netmask = '172.16.0.2'
Thu Feb 5 10:57:23 2004 23[0]: ifconfig_noexec = DISABLED
Thu Feb 5 10:57:23 2004 24[0]: ifconfig_nowarn = DISABLED
Thu Feb 5 10:57:23 2004 25[0]: shaper = 0
Thu Feb 5 10:57:23 2004 26[0]: tun_mtu = 1300
Thu Feb 5 10:57:23 2004 27[0]: tun_mtu_defined = DISABLED
Thu Feb 5 10:57:23 2004 28[0]: link_mtu = 1300
Thu Feb 5 10:57:23 2004 29[0]: link_mtu_defined = ENABLED
Thu Feb 5 10:57:23 2004 30[0]: tun_mtu_extra = 0
Thu Feb 5 10:57:23 2004 31[0]: tun_mtu_extra_defined = DISABLED
Thu Feb 5 10:57:23 2004 32[0]: fragment = 0
Thu Feb 5 10:57:23 2004 33[0]: mtu_discover_type = -1
Thu Feb 5 10:57:23 2004 34[0]: mtu_test = 0
Thu Feb 5 10:57:23 2004 35[0]: mlock = DISABLED
Thu Feb 5 10:57:23 2004 36[0]: inactivity_timeout = 0
Thu Feb 5 10:57:23 2004 37[0]: ping_send_timeout = 15
Thu Feb 5 10:57:23 2004 38[0]: ping_rec_timeout = 0
Thu Feb 5 10:57:23 2004 39[0]: ping_rec_timeout_action = 0
Thu Feb 5 10:57:23 2004 40[0]: ping_timer_remote = DISABLED
Thu Feb 5 10:57:23 2004 41[0]: persist_tun = DISABLED
Thu Feb 5 10:57:23 2004 42[0]: persist_local_ip = DISABLED
Thu Feb 5 10:57:23 2004 43[0]: persist_remote_ip = DISABLED
Thu Feb 5 10:57:23 2004 44[0]: persist_key = DISABLED
Thu Feb 5 10:57:23 2004 45[0]: mssfix_defined = DISABLED
Thu Feb 5 10:57:23 2004 46[0]: mssfix = 0
Thu Feb 5 10:57:23 2004 47[0]: passtos = DISABLED
Thu Feb 5 10:57:23 2004 48[0]: resolve_retry_seconds = 0
Thu Feb 5 10:57:23 2004 49[0]: username = 'nobody'
Thu Feb 5 10:57:23 2004 50[0]: groupname = '[UNDEF]'
Thu Feb 5 10:57:23 2004 51[0]: chroot_dir = '[UNDEF]'
Thu Feb 5 10:57:23 2004 52[0]: cd_dir = '[UNDEF]'
Thu Feb 5 10:57:23 2004 53[0]: writepid = '[UNDEF]'
Thu Feb 5 10:57:23 2004 54[0]: up_script = '[UNDEF]'
Thu Feb 5 10:57:23 2004 55[0]: down_script = '[UNDEF]'
Thu Feb 5 10:57:23 2004 56[0]: up_restart = DISABLED
Thu Feb 5 10:57:23 2004 57[0]: daemon = DISABLED
Thu Feb 5 10:57:23 2004 58[0]: inetd = DISABLED
Thu Feb 5 10:57:23 2004 59[0]: log = DISABLED
Thu Feb 5 10:57:23 2004 60[0]: nice = 0
Thu Feb 5 10:57:23 2004 61[0]: verbosity = 5
Thu Feb 5 10:57:23 2004 62[0]: mute = 0
Thu Feb 5 10:57:23 2004 63[0]: gremlin = DISABLED
Thu Feb 5 10:57:23 2004 64[0]: tuntap_flags = 0
Thu Feb 5 10:57:23 2004 65[0]: occ = ENABLED
Thu Feb 5 10:57:23 2004 66[0]: http_proxy_server = '[UNDEF]'
Thu Feb 5 10:57:23 2004 67[0]: http_proxy_port = 0
Thu Feb 5 10:57:23 2004 68[0]: http_proxy_auth_method = '[UNDEF]'
Thu Feb 5 10:57:23 2004 69[0]: http_proxy_auth_file = '[UNDEF]'
Thu Feb 5 10:57:23 2004 70[0]: http_proxy_retry = DISABLED
Thu Feb 5 10:57:23 2004 71[0]: comp_lzo = ENABLED
Thu Feb 5 10:57:23 2004 72[0]: comp_lzo_adaptive = ENABLED
Thu Feb 5 10:57:23 2004 73[0]: route_script = '[UNDEF]'
Thu Feb 5 10:57:23 2004 74[0]: route_default_gateway = '[UNDEF]'
Thu Feb 5 10:57:23 2004 75[0]: route_noexec = DISABLED
Thu Feb 5 10:57:23 2004 76[0]: route_delay = 0
Thu Feb 5 10:57:23 2004 77[0]: route_delay_defined = DISABLED
Thu Feb 5 10:57:23 2004 78[0]: shared_secret_file = '/etc/openvpn/clave.key'
Thu Feb 5 10:57:23 2004 79[0]: key_direction = 0
Thu Feb 5 10:57:23 2004 80[0]: ciphername_defined = ENABLED
Thu Feb 5 10:57:23 2004 81[0]: ciphername = 'BF-CBC'
Thu Feb 5 10:57:23 2004 82[0]: authname_defined = ENABLED
Thu Feb 5 10:57:23 2004 83[0]: authname = 'SHA1'
Thu Feb 5 10:57:23 2004 84[0]: keysize = 0
Thu Feb 5 10:57:23 2004 85[0]: replay = ENABLED
Thu Feb 5 10:57:23 2004 86[0]: replay_window = 64
Thu Feb 5 10:57:23 2004 87[0]: replay_time = 15
Thu Feb 5 10:57:23 2004 88[0]: packet_id_file = '[UNDEF]'
Thu Feb 5 10:57:23 2004 89[0]: use_iv = ENABLED
Thu Feb 5 10:57:23 2004 90[0]: test_crypto = DISABLED
Thu Feb 5 10:57:23 2004 91[0]: tls_server = DISABLED
Thu Feb 5 10:57:23 2004 92[0]: tls_client = DISABLED
Thu Feb 5 10:57:23 2004 93[0]: key_method = 1
Thu Feb 5 10:57:23 2004 94[0]: ca_file = '[UNDEF]'
Thu Feb 5 10:57:23 2004 95[0]: dh_file = '[UNDEF]'
Thu Feb 5 10:57:23 2004 96[0]: cert_file = '[UNDEF]'
Thu Feb 5 10:57:23 2004 97[0]: priv_key_file = '[UNDEF]'
Thu Feb 5 10:57:23 2004 98[0]: cipher_list = '[UNDEF]'
Thu Feb 5 10:57:23 2004 99[0]: tls_verify = '[UNDEF]'
Thu Feb 5 10:57:23 2004 100[0]: tls_remote = '[UNDEF]'
Thu Feb 5 10:57:23 2004 101[0]: crl_file = '[UNDEF]'
Thu Feb 5 10:57:23 2004 102[0]: tls_timeout = 2
Thu Feb 5 10:57:23 2004 103[0]: renegotiate_bytes = 0
Thu Feb 5 10:57:23 2004 104[0]: renegotiate_packets = 0
Thu Feb 5 10:57:23 2004 105[0]: renegotiate_seconds = 3600
Thu Feb 5 10:57:23 2004 106[0]: handshake_window = 60
Thu Feb 5 10:57:23 2004 107[0]: transition_window = 3600
Thu Feb 5 10:57:23 2004 108[0]: single_session = DISABLED
Thu Feb 5 10:57:23 2004 109[0]: tls_auth_file = '[UNDEF]'
Thu Feb 5 10:57:23 2004 110[0]: OpenVPN 1.5.0 i386-redhat-linux [SSL] [LZO][PTHREAD] built on Nov 25 2003
Thu Feb 5 10:57:23 2004 111[0]: Static Encrypt: Cipher 'BF-CBC' initializedwith 128 bit key
Thu Feb 5 10:57:23 2004 112[0]: Static Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Feb 5 10:57:23 2004 113[0]: Static Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Thu Feb 5 10:57:23 2004 114[0]: Static Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Feb 5 10:57:23 2004 115[0]: LZO compression initialized
Thu Feb 5 10:57:23 2004 116[0]: TUN/TAP device tun0 opened
Thu Feb 5 10:57:23 2004 117[0]: /sbin/ifconfig tun0 172.16.0.2 pointopoint 172.16.0.1 mtu 1255
Thu Feb 5 10:57:23 2004 118[0]: Data Channel MTU parms [ L:1300 D:1300 EF:45EB:19 ET:0 ]
Thu Feb 5 10:57:23 2004 119[0]: Local Options String: 'V3,dev-type tun,link-mtu 1300,tun-mtu 1255,proto UDPv4,ifconfig 172.16.0.1172.16.0.2,comp-lzo,cipher BF-CBC,auth SHA1,keysize 128,secret'
Thu Feb 5 10:57:23 2004 120[0]: Expected Remote Options String: 'V3,dev-type
tun,link-mtu 1300,tun-mtu 1255,proto UDPv4,ifconfig 172.16.0.2 172.16.0.1,comp-lzo,cipher BF-CBC,auth SHA1,keysize 128,secret'
Thu Feb 5 10:57:23 2004 121[0]: Local Options hash (VER=V3): 'dc63bb49'
Thu Feb 5 10:57:23 2004 122[0]: Expected Remote Options hash (VER=V3): '7dfb21ed'
Thu Feb 5 10:57:23 2004 123[0]: UID set to nobody
Thu Feb 5 10:57:23 2004 124[0]: PTHREAD support initialized
Thu Feb 5 10:57:23 2004 125[0]: UDPv4 link local (bound): 10.10.21.1:5000
Thu Feb 5 10:57:23 2004 126[0]: UDPv4 link remote: 10.10.21.80:5000
Thu Feb 5 10:57:29 2004 127[0]: Peer Connection Initiated with 10.10.21.80:5000
WWRWRRW

Ahora probamos el tunel tirando un ping de una punta a otra (desde otro terminal), si no funciona algo falla.
Esto puede ser por una equivocacion con respecto a las ips del tunel, recuerda, que el tunel, tiene sus propias IPs, al margen de las ips publicas o privadas. Al final del documento pongo mis archivos para ver un ejemplo.

Prueba desde una punta tirar un ping a la otra y viceversa, por ejemplo:

# ping 172.16.0.2
PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data.
64 bytes from 172.16.0.2: icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from 172.16.0.2: icmp_seq=2 ttl=64 time=0.029 ms
64 bytes from 172.16.0.2: icmp_seq=3 ttl=64 time=0.031 ms
64 bytes from 172.16.0.2: icmp_seq=4 ttl=64 time=0.026 ms

Comprueba que las rutas se han asignado bien al tun0:

# route -n|grep tun0
172.16.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 tun0

El puerto esta escuchando correctamente:
# socklist |grep openvpn
udp 5000 263351 0 19447 3 openvpn

NOTA: socklist pertenece al paquete procinfo (apt-get install procinfo)

Vemos las caracteri­sticas del tunel, esta es la de una de las puntas de mi tunel:

# ifconfig tun0
tun0 Link encap:Point-to-Point Protocol
inet addr:172.16.0.2 P-t-P:172.16.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1255 Metric:1
RX packets:15 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:1260 (1.2 Kb) TX bytes:0 (0.0 b)

Para activar el servicio en el arranque:
# chkconfig --level 35 openvpn on

Ahora puedes iniciar de forma normal el servicio con /etc/init.d/openvpn start

Hay mil formas de configurar OpenVPN, esta es la mas sencilla. Para mas info ejecuta #rpm -qd openvpn y veras toda la documentacion diponible en el paquete.

Ejemplo de configuracion del tunel:

/etc/openvpn/tunel.conf --> Host A

local 10.10.21.1
remote 10.10.21.80
dev tun0
port 5000
comp-lzo
user nobody
ping 15
ifconfig 172.16.0.1 172.16.0.2
secret /etc/openvpn/clave.key

/etc/openvpn/tunel.conf --> Host B
local 10.10.21.80
remote 10.10.21.1
dev tun0
port 5000
comp-lzo
user nobody
ping 15
ifconfig 172.16.0.2 172.16.0.1
secret /etc/openvpn/clave.key

Al igual que con OpenVPN en este caso se explica como crear una VPN con CIPE (Crypto IP Encapsulation) .

¿Por que CIPE?

Basicamente porque es el software de VPN soportado por RedHat y el que viene con la distribucion, aunque en este ejemplo lo descargamos e instalamos con yum esta disponible en los isos correspondientes.

Para saber que es una VPN y como funciona te remito al principio de este documento, CIPE trabaja sobre UDP y por el puerto 6060 (por defecto). El funcionamiento respecto al direcionamiento es similar al de OpenVPN. Recuerda que hay que hacer los mismos pasos en las dos maquinas con conforman la VPN.

Vamos al li­o:

Instalamos cipe via apt:
# yum install cipe

Vamos al directorio de configuracion:
# cd /etc/cipe

Creamos el archivo con la clave, modificala que esta es la clave que viene con los ejemplos, recuerda que debe ser la misma en la otra maquina:
# vi options.cipcb0
key d3b07384d113edec49eaa6238ad5ff00

Nos aseguramos de que solo root puede leer y modificar la clave:
# chmod 600 options.cipcb0

Creamos el archivo de cofiguracion de nuestro nuevo dispositivo cipcb0 en ambas maquinas:

Para entenderlo mejor vamos a poner un ejemplo, creamos una VPN entre la máquina A (10.10.21.1) y la maquina B (10.10.21.40):

Maquina A:
# vi /etc/sysconfig/network-scripts/ifcfg-cipcb0
DEVICE=cipcb0
ONBOOT=yes
USERCTL=yes
MYPORT=6060
PEER=10.10.21.40:6060
PTPADDR=192.168.0.2
IPADDR=192.168.0.1

Atenciin: PEER es la ip real y el puerto (udp) de la maquina B, PTPADDR es la ip virtual de la maquina B y IPADDR es la ip virtual de la maquina A

Maquina B:
# vi /etc/sysconfig/network-scripts/ifcfg-cipcb0
DEVICE=cipcb0
ONBOOT=yes
USERCTL=yes
MYPORT=6060
PEER=10.10.21.1:6060
PTPADDR=192.168.0.1
IPADDR=192.168.0.2

Atencion: PEER es la ip real y el puerto (udp) de la maquina A, PTPADDR es la ip virtual de la maquina A y IPADDR es la ip virtual de la maquina B

Ahora levantamos el interface creado en ambas maquinas:
# ifup cipcb0

Comprueba que se ha cargado bien, en el /var/log/messages debes ver algo como:
# tail -f /var/log/messages
ifup-cipcb: cipcb started for cipcb0
ciped-cb[4993]: CIPE daemon vers 1.4.5 (c) Olaf Titz 1996-2000

Comprueba tambien que está el dispositivo como tu querias:
# ifconfig cipcb0
cipcb0 Link encap:IPIP Tunnel HWaddr
inet addr:192.168.0.2 P-t-P:192.168.0.1 Mask:255.255.255.255
UP POINTOPOINT NOTRAILERS RUNNING NOARP MTU:1442 Metric:1
RX packets:41 errors:0 dropped:0 overruns:0 frame:0
TX packets:41 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:4592 (4.4 Kb) TX bytes:5412 (5.2 Kb)

Ya tienes una VPN con CIPE creada.

Si quieres mas datos sobre cipe echa un vistazo en la Guia de Seguridad de RedHat 9 http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/security-guide/ch-vpn.html

Design by xactive -