Autor: Marufos
Fecha: 14 de Septiembre de 2004
Plataforma: OpenBSD 3.4-RELEASE, OpenBSD 3.5-RELEASE
Este documento esta bajo licencia BSD, asi que ya saben. Como dijo Confucio Si quieres algo bien hecho hazlo tu
Este no pretende ser un manual exhaustivo sobre vpn's, ni nada de lo que se vea aquí, asi que solo veremos como hacer un ipsec bridge desde el punto de vista practico, en pocas palabras es un HOW-TO. Si alguien requiere de informacion mas detallada les recomiendo que lean el FAQ de OpenBSD, y las paginas del man, para cualquier tema que se vea aquí, ya que de ahi salio este documento.
Antes de empezar con el HOW-TO, voy a explicar cual es el posible uso del Ipsec-Bridge, y de paso les platico como lo he aplicado a mis necesidades. Pues resulta, que en donde yo trabajo (si es que se puede decir que trabajo), tenemos 3 sucursales; y las 3 tienen ADSL; Desgraciadamente ninguna de ellas tiene ip fija (estatica), lo cual ya supone un problema, que arreglaremos con unos guiones que diseñe. Ademas la sucursal de Tlalnepantla dispone de un servidor con Novell Netware, esto supone otro problema ya que este usa la pila de protocolos IPX/SPX, eso significa que este trafico no va a pasar de la red local hacia las otras 2, pero haremos que pase por la vpn con el ipsec bridge. Ahora que ya tenemos el problema, vamos a ver la solucion, que no es nada complicado, y hasta resulta divertida.
Debido a que Openbsd trae por defecto los paquetes que vamos a usar, este fue el motivo por el cual vamos a usar este sistema. Esto quiere decir que con unos pocos cambios se puede adaptar a Freebsd o Netbsd.
Y ya despues de esta introduccion vamos a los teclasos...
Primeramente debemos tener instalado y funcionando el OpenBSD. Este how-to fue probado en la versión 3.4 y 3.5
Vamos a dividir la configuración de la VPN en 2 partes: Servidor y clientes.
El servidor esta en Cruces, la Sucursal Tlalnepantla es la que dispone de Novell, y Chavero tiene Freebsd, la cual aquí no menciono como esta configurada, pero sirve la misma configuración de la VPN de Tlalnepantla salvo por las direcciones de Red que hay que cambiar.
Cuando hablo del servidor, me refiero a la computadora que recibira todas las conexiones de las sucursales y los clientes mobiles. Aquí estan los archivos de configuracion que tengo trabajando en el servidor.
Entramos en el directorio de isakmpd
# cd /etc/isakmpd
y aquí debemos tener los archivos: isakmpd.conf, isakmpd.policy
[General] Retransmits=5 Exchange-max-time=120 Default-phase-1-lifetime=600,60:86400 Default-phase-2-lifetime=200,60:86400 [Phase 1] Default=ISAKMP-peer-east [Phase 2] Passive-Connections=IPsec-west-east [ISAKMP-peer-east] Phase=1 Transport=udp Configuration=Default-main-mode Authentication=miclavesupersecreta [IPsec-west-east] Phase=2 ISAKMP-peer=ISAKMP-peer-east Configuration=Default-quick-mode Local-ID=Net-east Remote-ID=Net-west [Net-west] ID-type=IPV4_ADDR_SUBNET Network=0.0.0.0 Netmask=0.0.0.0 [Net-east] ID-type=IPV4_ADDR_SUBNET Network=192.168.1.0 Netmask=255.255.255.0 [Default-main-mode] DOI=IPSEC EXCHANGE_TYPE=ID_PROT Transforms=3DES-SHA [Default-quick-mode] DOI=IPSEC EXCHANGE_TYPE=QUICK_MODE Suites=QM-ESP-AES-SHA-PFS-SUITE
KeyNote-Version: 2 Comment: This policy accepts ESP SAs from a remote that uses the right password $OpenBSD: policy,v 1.6 2001/06/20 16:36:19 angelos Exp $ $EOM: policy,v 1.6 2000/10/09 22:08:30 angelos Exp $ Authorizer: "POLICY" Conditions: app_domain == "IPsec policy" && esp_present == "yes" && esp_enc_alg == "aes" && esp_auth_alg == "hmac-sha" -> "true";
Nota: El archivo isakmpd.policy sirve para todas las estaciones que usen el isakmpd.
[General] Retransmits=5 Exchange-max-time=120 Default-phase-1-lifetime=600,60:86400 Default-phase-2-lifetime=200,60:86400 [Phase 1] 201.201.201.181=ISAKMP-cruces [Phase 2] Connections=IPsec-cruces [ISAKMP-cruces] Phase=1 Transport=udp #Local-Address=192.168.254.50 Address=201.201.201.181 Configuration=Default-main-mode Authentication=miclavesupersecreta123456 [IPsec-cruces] Phase=2 ISAKMP-peer=ISAKMP-cruces Configuration=Default-quick-mode Local-ID=Net-tlalne Remote-ID=Net-cruces [Net-tlalne] ID-type=IPV4_ADDR_SUBNET Network=192.168.2.0 Netmask=255.255.255.0 [Net-cruces] ID-type=IPV4_ADDR_SUBNET Network=192.168.1.0 Netmask=255.255.255.0 [Net-chavero] ID-type=IPV4_ADDR_SUBNET Network=192.168.0.0 Netmask=255.255.255.0 [Default-main-mode] DOI=IPSEC EXCHANGE_TYPE=ID_PROT Transforms=3DES-SHA [Default-quick-mode] DOI=IPSEC EXCHANGE_TYPE=QUICK_MODE Suites=QM-ESP-AES-SHA-PFS-SUITE
Nota: Todos los archivos de /etc/isakmpd deben tener los permisos 600 en octal o no funcionara el isakmpd (chmod 600).
Les anexo un enlace a una excelente pagina: http://vpn.securitybooks.org/ , en esta pagina encontraremos un configurador de vpns, nosotros solo introduciremos nuestros datos de direcciones de IP y nombres, y la pagina nos mostrara los archivos isakmpd.conf resultantes para tres redes.
Aquí tenemos los guiones para actualizar la dirección de IP del servidor.
Nota: Estos guiones solo lo requieren los clientes
#!/bin/sh VPNRESTART=0 if [ `/bin/vpncheck cruces.dyndns.org` = "1" ] then VPNRESTART=1 fi if [ "$VPNRESTART" = "1" ] then # echo "Si cambio la ip" chmod 600 /etc/isakmpd/isakmpd.conf kill `cat /var/run/isakmpd.pid` isakmpd fi
Los siguientes comandos estan en /bin/ y tienen los permisos 555 (chmod 555):
#!/bin/sh # # Script to keep IP-address of VPN with dyndns up-to-date # URL=$1 # dyn-URL of your parnter # # Getting actual IP-address # newip=`/bin/hcheck $1` # # Getting stored IP-address # oldip=`cat /etc/$URL` # # Comparing the address. If not equal, writing new IP-address to netdata # VPNRESTART=0 if [ "$newip" != "$oldip" ] then sed s/$oldip/$newip/ /etc/isakmpd/isakmpd.conf > /tmp/isakmpd.conf mv /tmp/isakmpd.conf /etc/isakmpd/isakmpd.conf echo $newip > /etc/$URL VPNRESTART=1 echo $VPNRESTART exit fi echo $VPNRESTART exit
#!/bin/sh echo "`host $1 | sed -e 's/.* //'`"
Estos guiones nos permitiran cambiar la ip especificada en el archivo isakmpd.conf, la primera vez que los ejecutemos, asi que debemos especificar la direccion de ip del servidor solo la primera vez. Posteriormente los guiones lo haran solos. Otro aspecto que debo aclarar es que yo tengo mis cuentas de DNS's dinamicos dadas de alta en http://www.dyndns.org, y use el cliente ddclient mismo que instale desde los ports en: /usr/ports/net/ddclient/ ,solo para aclarar dejo el archivo de configuración solamente del servidor, para el cliente ddclient. Esto no quiere decir que no puedan usarse cuentas de otros servidores de dns's dinamicos como dns2go u otros, solo tendran que configurar los clientes y las cuentas, respectivas.
###################################################################### ## ## Define default global variables with lines like: ## var=value [, var=value]* ## These values will be used for each following host unless overridden ## with a local variable definition. ## ## Define local variables for one or more hosts with: ## var=value [, var=value]* host.and.domain[,host2.and.domain...] ## ## Lines can be continued on the following line by ending the line ## with a \ ## ###################################################################### daemon=600 # check every 300 seconds syslog=yes # log update msgs to syslog mail=root # mail all msgs to root mail-failure=root # mail failed update msgs to root pid=/var/run/ddclient.pid # record PID in file. # #use=watchguard-soho, fw=192.168.111.1:80 # via Watchguard's SOHO FW #use=netopia-r910, fw=192.168.111.1:80 # via Netopia R910 FW #use=smc-barricade, fw=192.168.123.254:80 # via SMC's Barricade FW #use=netgear-rt3xx, fw=192.168.0.1:80 # via Netgear's internet FW #use=linksys, fw=192.168.1.1:80 # via Linksys's internet FW #use=maxgate-ugate3x00, fw=192.168.0.1:80 # via MaxGate's UGATE-3x00 FW #use=elsa-lancom-dsl10, fw=10.0.0.254:80 # via ELSA LanCom DSL/10 DSL Router #use=elsa-lancom-dsl10-ch01, fw=10.0.0.254:80 # via ELSA LanCom DSL/10 DSL Router #use=elsa-lancom-dsl10-ch02, fw=10.0.0.254:80 # via ELSA LanCom DSL/10 DSL Router #use=alcatel-stp, fw=10.0.0.138:80 # via Alcatel Speed Touch Pro #use=xsense-aero, fw=192.168.1.1:80 # via Xsense Aero Router #use=allnet-1298, fw=192.168.1.1:80 # via AllNet 1298 DSL Router #use=3com-oc-remote812, fw=192.168.0.254:80 # via 3com OfficeConnect Remote 812 #use=e-tech, fw=192.168.1.1:80 # via E-tech Router #use=cayman-3220h, fw=192.168.0.1:1080 # via Cayman 3220-H DSL Router # #fw-login=admin, fw-password=XXXXXX # FW login and password # ## To obtain an IP address from FW status page (using fw-login, fw-password) #use=fw, fw=192.168.1.254/status.htm, fw-skip='IP Address' # found after IP Address # ## To obtain an IP address from Web status page (using the proxy if defined) #use=web, web=checkip.dyndns.org/, web-skip='IP Address' # found after IP Address # #use=ip, ip=127.0.0.1 # via static IP's #use=if, if=eth0 # via interfaces use=web # via web # #protocol=dyndns2 # default protocol #proxy=fasthttp.sympatico.ca:80 # default proxy #server=members.dyndns.org # default server #server=members.dyndns.org:8245 # default server (bypassing proxies) login=cruces # default login password=miclave # default password #mx=mx.for.your.host # default MX #backupmx=yes|no # host is primary MX? #wildcard=yes|no # add wildcard CNAME? ## ## dyndns.org dynamic addresses ## ## (supports variables: wildcard,mx,backupmx) ## server=members.dyndns.org, \ protocol=dyndns2 \ cruces.dyndns.org
Solo falta agregar una linea en el cron, para que compruebe cada determinado tiempo si la IP ha cambiado, yo lo configure, que revise en un intervalo de 5 minutos.
crontab -e
*/5 * * * * /etc/isakmpd/rc.vpn
Una vez que tenemos todo lo anterior ya podemos arrancar el isakmpd con el comando:
Servidor...
# isakmpd
Cliente...
# isakmpd
O podemos elegir que arranque en cada inicio modificando el /etc/rc.conf en el servidor y clientes:
cambiamos la linea que tiene algo como:
isakmpd_flags=NO
Por:
isakmpd_flags=””
Ahora en ya debe aparecer en la tabla de rutas algo como lo siguiente:
Encap: Source Port Destination Port Proto SA(Address/Proto/Type/Direction)192.168.0/24 0 192.168.1/24 0 0 201.129.247.134/50/use/in 192.168.2/24 0 192.168.1/24 0 0 201.135.238.70/50/use/in 192.168.254.1/32 0 192.168.1/24 0 0 201.133.83.143/50/use/in 192.168.1/24 0 192.168.0/24 0 0 201.129.247.134/50/require/out 192.168.1/24 0 192.168.2/24 0 0 201.135.238.70/50/require/out 192.168.1/24 0 192.168.254.1/32 0 0 201.133.83.143/50/require/out
Por supuesto esto solamente es la tabla del ruteo del servidor, tambien debe de aparecer en los clientes, una tabla de ruteo parecida.
Si hasta aquí todo va bien ahora ya podemos pasar a la parte del bridge, esto quiere decir que la vpn ya esta lista y funcionando la cual podemos probar con un simple ping, de alguna maquina en una red a otra maquina en la otra red y viceversa.
También dividiremos la configuración del Bridge en 2 partes: Servidor y cliente.
Vamos a la configuración del servidor.
Contenido de: /etc/hostname.gif0
#estas son las direcciones de ip de las interfaces internas de los bridges # la orden de las direcciones es tunnel ipbridgelocal ipbridgeremoto tunnel 192.168.1.20 192.168.2.20 Contenido de: /etc/bridgename.bridge0 add gif0 add dc0 up
Hay que aclarar que la interfaz gif0 la creamos nosotros con el archivo hostname.gif0 y es la interfaz que crea un tunnel, solo en un sentido, para el otro sentido necesitamos configurar lo mismo en la otra PC. La interfaz dc0, es la interfaz interna del IpsecBridge y la cual formara parte del bridge al igual que gif0
Pasemos a la configuración del cliente.
Contenido de: /etc/bridgename.bridge0
add gif0 add rl0 up
Contenido de: /etc/hostname.gif0
tunnel 192.168.2.20 192.168.1.20
Con esto hemos terminado la parte de la configuración un tanto tediosa y aburrida, pero apenas si empezamos a conocer algo de las vpn's, todavia hay muchas configuraciones que podemos modificar y probar.
Bueno este es mi segundo documento que escribo y mando a el demonio.org. Espero que sea entendible y les pueda ayudar. También estoy conciente que me hacen falta clases de redacción para que este documento tenga una mayor calidad, pero lo hice con mucho gusto, y como dicen que la intención es lo que cuenta. Me agradaria mucho me escribiesen para comentarios, sugerencias, criticas; en especial si alguien sabe como optimizar los scripts o cualquier cosa del documento, ya que aun soy neofito en la programación de Shell, como habrán notado.