Google
 

martes, 27 de mayo de 2008

Openswan: ipsec en linux (I)

Ya que me he estado peleando con IPsec en linux voy a dejar los pasos que hay que seguir para crear un túnel en modo transporte mediante openswan. Supongo que sabrás que es esto de IPsec, y también teoría sobre túneles pues para poder entender que estas configurando lo necesitarás.

Voy a explicar la configuración necesaria para autenticarse mediante

  • Claves compartidas
  • RSA
  • Certificados X.509


Lo primero de todo es instalar openswan, yo lo hice desde los repositorios de debian y no tuve ningún problema en la instalación. Tengo entendido que si usas un kernel 2.6 no necesitas nada más, pero si tienes un kernel 2.4 vas a tener que parchearlo para añadir KLIPS. ( $:/>uname -r para saber el tuyo) A la hora de instalarlo te indica que si quieres opportunistic encryption yo le he dicho que no y tampoco quiero que me cree claves rsa ni certificados. Todo esto lo haremos nosotros.


Después de instalar openswan vamos a levantar el servicio:

#:/>/etc/init.d/ipsec start
ipsec_setup: Starting Openswan IPsec 2.4.9...
#:/>

Dependiendo del kernel que uses te saldran más o menos mensajes de salida, pero eso es lo de menos. Ahora vamos a comprobar que todo va bien:

#:/>ipsec verify
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path [OK]
Linux Openswan U2.4.9/K2.6.24-16-generic (netkey)
Checking for IPsec support in kernel [OK]
NETKEY detected, testing for disabled ICMP send_redirects [FAILED]

Please disable /proc/sys/net/ipv4/conf/*/send_redirects
or NETKEY will cause the sending of bogus ICMP redirects!

NETKEY detected, testing for disabled ICMP accept_redirects [FAILED]

Please disable /proc/sys/net/ipv4/conf/*/accept_redirects
or NETKEY will accept bogus ICMP redirects!

Checking for RSA private key (/etc/ipsec.secrets) [DISABLED]
ipsec showhostkey: no default key in "/etc/ipsec.secrets"
Checking that pluto is running [OK]
Two or more interfaces found, checking IP forwarding [FAILED]
Checking for 'ip' command [OK]
Checking for 'iptables' command [OK]
Opportunistic Encryption Support [DISABLED]
#:/>

Para solucionar esto es necesario ejecutar tres comandos que sólo los encontré en esta página. Los comandos ha ejecutar son:
#:/>for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $f; done
#:/>for f in /proc/sys/net/ipv4/conf/*/send_redirects; do echo 0 >; $f; done
#:/>echo 1 > /proc/sys/net/ipv4/ip_forward

Los dos primeros son necesarios para la denegar el envío y aceptación de paquetes ICMP de redirección y el último para aceptar la redirección de paquetes que no son nuestros.

Una vez ejecutados los comandos, la salida de ipsec verify es la siguiente:
#:/>ipsec verify
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path [OK]
Linux Openswan U2.4.9/K2.6.24-16-generic (netkey)
Checking for IPsec support in kernel [OK]
NETKEY detected, testing for disabled ICMP send_redirects [OK]
NETKEY detected, testing for disabled ICMP accept_redirects [OK]
Checking for RSA private key (/etc/ipsec.secrets) [DISABLED]
ipsec showhostkey: no default key in "/etc/ipsec.secrets"
Checking that pluto is running [OK]
Two or more interfaces found, checking IP forwarding [OK]
Checking NAT and MASQUERADEing [N/A]
Checking for 'ip' command [OK]
Checking for 'iptables' command [OK]
Opportunistic Encryption Support [DISABLED]
#:/>

Debes verificar esto cada vez que reinicies el ordenador.
Ahora llega el paso de configurar openswan, vamos a explicar el método de clave compartida(PSK).

Para configurar IPsec mediante clave compartida sólo hay que configurar dos archivos:
  • ipsec.secrets, (que estará en /etc/ipsec.secrets)
  • ipsec.conf, (que estará en /etc/ipsec.conf)
Vamos a empezar por ipsec.conf, editamos el fichero con nuestro editor favorito:

#:/>vi /etc/ipsec.conf

y añadimos al final:

conn linux-linux # Nombre de la conexión
authby=secret # Autenticación mediante clave compartida
left=192.168.1.100 # La IP del equipo de un lado del túnel
leftid=@laptop.dbx # Identificador de red del equipo, no te preocupes por esto puedes poner cualquier nombre
right=192.168.1.2 # La IP del equipo del otro lado del túnel
right=@xbase.dbx # Identificador del equipo
auto=add # Para levantar el túnel manualmente

(CUIDADO: todas la líneas referentes a una conexión necesitan un tabulado, es decir, desde la línea authby... hasta la última auto... necesitan ser tabuladas)
Creo que con los comentarios está todo bien explicado no??(sino esto no es lo tuyo...xD)
Esta configuración es para dos máquinas que estén en la misma red o que se vean entre sí. Si quisieramos conectar dos redes mediante Internet habría que añadir:

leftnexthop=%defaultroute
rightnexthop=%defaultroute

Con esto lo que conseguimos es que envíe los paquetes al router, y que sea el quién se encargue de llevarlos al otro extremo del túnel. Si esto lo pensamos es lógico, en la anterior configuración no era necesario puesto que estamos creando un túnel entre dos host de la misma red, y ellos saben encontrarse. Para ver que es lo que tiene openswan por defaultroute ejecutamos:
#:/>ipsec showdefaults
routephys=wlan0
routevirt=ipsec0
routeaddr=192.168.1.100
routenexthop=192.168.1.1
#:/>


Ahora vamos a por el otro archivo de configuración que nos queda, ipsec.secrets:

Puesto que la fortaleza de este método(autenticación mediante PSK) reside en la clave elegida, la propia herramienta permite generarnos una clave que podemos considerar segura.

#:/>ipsec ranbits 128
0x205e3332_93ed0e56_03b58c08_75ef2c4c
#:/>

No te preocupes por la clave, no hay que aprendersela!!xD Quedará en un fichero, así que revisad bien los permisos que sólo root pueda trabajar con el archivo.

Copiamos esa clave y la añadimos al fichero ipsec.secrets, nos quedará algo así:
#:/>vi /etc/ipsec.secrets

# RCSID $Id: ipsec.secrets.proto,v 1.3.6.1 2005/09/28 13:59:14 paul Exp $
# This file holds shared secrets or RSA private keys for inter-Pluto
# authentication. See ipsec_pluto(8) manpage, and HTML documentation.

# RSA private key for this host, authenticating it to any other host
# which knows the public part. Suitable public keys, for ipsec.conf, DNS,
# or configuration of other implementations, can be extracted conveniently
# with "ipsec showhostkey".

#Clave PSK para conexion linux-linux
192.168.1.100 192.168.1.2 : PSK "fe774cd2_309cb910_b1f869d4_23222782"

Una vez realizada la configuración copiamos los dos archivos a los dos extremos del túnel, 192.168.1.2 === 192.168.1.100, que es desde y hasta donde viajará la información cifrada.

Reiniciamos el servicio ipsec:
#:/>/etc/init.d/ipsec restart

Levantamos el túnel linux-linux:
#:/>ipsec auto --up linux-linux

Nos fijamos que al final nos salga algo así:
004 "linux-linux" #7: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_PRESHARED_KEY cipher=oakley_3des_cbc_192 prf=oakley_md5 group=modp1536}
117 "linux-linux" #8: STATE_QUICK_I1: initiate
004 "linux-linux" #8: STATE_QUICK_I2: sent QI2, IPsec SA established {ESP=>0xbf98f229 <0xd9165e59 xfrm=AES_0-HMAC_SHA1 NATD=none DPD=none}

Si es así, todo habrá ido bien. Para verificarlo podemos ejecutar:
#:/>/etc/init.d/ipsec status
IPsec running - pluto pid: 27918
pluto pid 27918
1 tunnels up
#:/>

Hay que recordar que las SA son unidireccionales, luego es necesario establecer una SA en cada dirección del túnel.(vamos que ejecutes ipsec auto --up linux-linux en las dos máquinas)


Si todo no ha sido tan bonito y han aparecido fallos, espero que no pues este es el método más sencillo, a mi me ayudó a solucionarlos cuando me aparecieron en la autenticación mediante certificados estos dos comandos:
#:/>ipsec auto --add
(en nuestro caso ipsec auto --add linux-linux)
No suele tener mensajes tan descriptivos como en auth.log.

Podemos ver los intentos de autenticación de ipsec, he de decir que son muy descriptivos, a mí me ayudó bastante.
#:/>tail -n 200 /var/log/auth.log


Una vez ya entiendes todo esto te dejo algunos enlaces por si quieres revisar/complementar:
Para la autenticación mediante rsa dejaré más enlaces.

Un saludo

David

1 comentario:

Dario dijo...

¿Se podria usar esto para conectarse a una red LAN (ip fija) a traves de VPN desde un pincho ADSL (ip dinamica)?

Un saludo