miércoles, 23 de mayo de 2012

RaspberryPi como servidor VPN

Instalación y configuración de PPTPD

... el primer superpoder de mi Raspberry

Hola gente!, ha llegado el momento de darle el primer superpoder a nuestro RaspberryPi, vamos a configurarlo como servidor VPN, esto es vital para muchos de los superpoderes que le daremos en sucesivos post. Manos al lio.

¡¡AVISO!! ESTE MANUAL SÓLO ES VALIDO CON UN KERNEL QUE SOPORTE PPP FILTERING (pasate por este post)

Servidores VPN hay cientos, la mayoría muy buenos. De igual forma hay cientos de formas de configurar el servicio de VPN, ya que podemos poner distintos tipos de autentificación, permisos, redes ... yo voy a hacer una configuración muy muy simple, a la par que segura, para que al conectar desde cualquier parte del mundo, tengamos acceso a nuestra red doméstica (o a la del curro) y además poder hacerlo desde cualquier cliente linux, windows o android. Supongamos la más común de las redes 192.168.1.x , empecemos:
sudo aptitude install pptpd iptables
Editamos el archivo de configuración general de pptpd:
sudo vim /etc/pptpd.conf
Como vemos es bastante extenso, tiene cientos de configuraciones posibles ... asusta un poco. Para mis necesidades dejo el archivo de la siguiente forma:
option /etc/ppp/pptpd-options
logwtmp
localip 192.168.1.2
remoteip 192.168.1.234-238
#deja esta linea comentada para evitar fallos raros
Siendo 192.168.1.2 la IP local de mi RaspberryPi. Aqui mi colega Abel (y el Borreguero) me dirá que es más seguro segmentar la red y aislar de forma segura en una Vlan a los clientes VPN ... y tiene razón. Pero como voy a ser yo el que se conecte y suelo fiarme de mi mismo, lo voy a dejar así. Seguimos editando el siguiente archivo:
sudo vim /etc/ppp/pptpd-options
Este archivo casi que asusta más que el anterior, el mio lo dejo así:
name pptpd
require-mschap-v2
require-mppe-128
nomppe-stateful
nodefaultroute
debug
lock
nobsdcomp
Y ahora vamos a añadir usuarios a nuestra VPN:
sudo vim /etc/ppp/chap-secrets
Añadimos usuario, servidor, clave e IP que va a tener nuestro cliente:
usuario pptpd clave 192.168.1.234
Reiniciamos el servicio:
sudo /etc/init.d/pptpd restart
Y poco más. Tendremos que rutar el puerto 1723 desde el ruter hacia la IP de nuestro RaspberryPi y listo. Configuramos cualquier cliente VPN contra nuestra IP pública o DynDNS, usuario ... clave ...

ACTUALIZACIÓN: he notado que no todas las distros modifican correctamente los archivos correspondientes, así que para curarnos en salud, modificamos el archivo:
/etc/sysctl.conf
Descomentamos la linea:
net.ipv4.ip_forward=1
Y reiniciamos.

ACTUALIZACIÓN 27/02/2013: después de una puntillosa puntualidad por parte del puntilloso del Borreguero, recomiendo cambiar la red que se asigna en la VPN, cambiando la linea de /etc/pptpd por esta otra:
remoteip 192.168.2.234-238
y la de /etc/ppp/chap-secrets:
usuario pptpd clave 192.168.2.234
Tras lo cual hay que ejecutar:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
y ya que estamos metemos esa misma línea al final del archivo /etc/rc.local

44 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. Estas usando el protocolo PPTP para hacer la VPN verdad se recomienda usar L2TP o IPsec (Ya que es compatible con bastantes dispositivos) ya que si no recuerdo mal es totalmente vulnerable más datos en http://es.wikipedia.org/wiki/PPTP

      Eliminar
  2. tampoco me funciona, toy gafao. Por lo menos he conseguido conectar por shh con no-ip

    ResponderEliminar
    Respuestas
    1. que no hombre, no seas así. Tenemos linux ¡usémolso!. Primero ¿has abierto el puerto VPN en el ruter? Segundo ¿estas conectando a la VPN desde la misma red a la que la VPN pertenece? Tercero ¿has mirado el syslog a ver si sale algo?

      Eliminar
  3. Tengo un par de dudas referente a este post y a Asterisk. Quiza tenga una idea rara, pero corrigeme...

    Tengo creada la VPN.(bien!) Me conecto por Android a la VPN.(bien!)
    El primer error es que si estoy conectado a la VPN pierdo la conexion a internet del mobil. Es normal?

    Una vez conectado intento conectar con el CSipSimple de Android al Asterisk. Normalmente si estoy en la misma red (es decir la wifi de casa) registra correctamente.
    Para hacer la simulacion de lo que ocurriria con la conexion fuera de casa desactivo el Wifi y conecto el 3G. Conecto la VPN y conecta,(bien!) pero el SIP no registra.

    Dame alguna idea...

    ResponderEliminar
    Respuestas
    1. empieza primero por hacerle ping al servidor asterisk desde la vpn, si no tienes respuesta ya sabes donde esta el fallo. Si haces ping ¿los clientes de la vpn estan en la misma red que el Asterisk? ¿te sale algun mensaje en la consola de asterisk poniendole el verbose a 10?

      Eliminar
  4. Desde Android con el FING, hago ping a la ip del Raspberry Pi (192.168.1.33 en mi caso)
    Me lo devuelve bien. Hago scanner de servicios desde el cliente al PI y me da abiertos los puertos abiertos del PI (22-ssh, 139-netbios-ssn, 445-SMB directly over IP, 1723 pptp, 2000-callbook)

    Portanto si hay conectividad. De hecho debe haberla si en el Android me sale la llave conforme estoy bien conectado y logueado.

    Teoricamente segun el /etc/ppp/chap-secrets le asigno la ip 192.168.1.234, pero en realidad no se como averiguar si le esta asignando esa IP correctamente...

    Desde el asterisk con Verbose 10 no sale ningun mensaje en absoluto...

    A ver si resuelvo esto y luego averiguo porque al estar por VPN no tengo internet.

    ResponderEliminar
    Respuestas
    1. ummm asegurate de que te esté dando una ip del mismo rango que el Asterisk, lo puedes ver en el syslog al hacer la conexión vpn:
      Dec 10 10:32:20 raspberrypi pppd[10135]: local IP address 192.168.1.2
      Dec 10 10:32:20 raspberrypi pppd[10135]: remote IP address 192.168.1.234

      si no consigues que te de una ip del mismo rango, tendras que configurar asterisk para que admita peers, de ese rango.

      Eliminar
  5. He tenido un exito y un error. Te comento...

    Si hago la conexion a la VPN desde el Android con una conexion WiFi desde mi trabajo se conecta a la VPN perfectamente y (redoble de suspense) SE CONECTA EL SIP!!!

    En cambio si me conecto por 3G de Yoigo se conecta a la VPN pero no se conecta el SIP.
    Te pego lo que me dice el syslog cuando me conecto por 3G:

    Dec 10 22:48:12 rasspi pppd[3142]: local IP address 192.168.1.33
    Dec 10 22:48:12 rasspi pppd[3142]: remote IP address 192.168.1.234
    Dec 10 22:48:12 rasspi pppd[3142]: pptpd-logwtmp.so ip-up ppp0 rsspivpn 46.222.96.69
    Dec 10 22:48:12 rasspi pppd[3142]: Script /etc/ppp/ip-up started (pid 3164)

    Deduzco que si tiene la IP tal y como dices correctamente. Me pone en duda el significado de la tercera linea. Dudo si quiza sea que Yoigo tiene algo capado? Aunque al estar conectado por VPN no deberia ser asi...

    De todos modos, tanto por WiFi conmo por 3G, al conectarme por VPN pierdo la conexion a internet. Eso es normal?

    Gracias por la paciencia... estoy disfrutando con esto como un chino!! Enhorabuena por tu trabajo.

    ResponderEliminar
    Respuestas
    1. a mi me pasaba algo parecido con Pepephone, al final la solución estaba en el propio blog de Pepephone. Simplemente habia que cambiar de AP, si uso el de gprsmov.pepephone.com no me funcionan algunas cosas, como la VPN por ejemplo. Si le pongo gprs.pepephone.com me funciona todo. Explican en el blog que por defecto es el otro por temas de ahorro de la bateria.
      Mira a ver si puede ser algo de esto.

      Eliminar
    2. CONSEGUIDOOOO! Era muy muy simple. El csipsimple viene con la opción de conectarse por 3G desactivado... En settings activadlo y ya está!

      Ahora sólo me falta saber si es normal que cuando estoy conectado por VPN no tengo Internet o si me falta algo

      Eliminar
  6. Hola Juanmol, antes que nada felicitarte por el blog...aqui un fiel seguidor de tus "recetas". Estoy intentando montar el servido VPN pero no consigo conectarme desde Android, esto es lo que optengo en el syslog:

    Jan 3 02:28:56 raspberrypi pptpd[11211]: CTRL: Client 77.209.224.144 control connection started
    Jan 3 02:28:56 raspberrypi pptpd[11211]: CTRL: Starting call (launching pppd, opening GRE)
    Jan 3 02:28:56 raspberrypi pppd[11242]: Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded.
    Jan 3 02:28:56 raspberrypi pppd[11242]: pptpd-logwtmp: $Version$
    Jan 3 02:28:56 raspberrypi pppd[11242]: pppd 2.4.5 started by root, uid 0
    Jan 3 02:28:56 raspberrypi pppd[11242]: using channel 4
    Jan 3 02:28:56 raspberrypi pppd[11242]: Using interface ppp0
    Jan 3 02:28:56 raspberrypi pppd[11242]: Connect: ppp0 <--> /dev/pts/2
    Jan 3 02:28:56 raspberrypi pppd[11242]: sent [LCP ConfReq id=0x1 ]
    Jan 3 02:28:56 raspberrypi pptpd[11211]: GRE: Bad checksum from pppd.
    Jan 3 02:28:56 raspberrypi pptpd[11211]: GRE: read(fd=7,buffer=1dbc4,len=8260) from network failed: status = -1 error = Protocol not available
    Jan 3 02:28:56 raspberrypi pptpd[11211]: CTRL: GRE read or PTY write failed (gre,pty)=(7,6)
    Jan 3 02:28:56 raspberrypi pptpd[11211]: CTRL: Reaping child PPP[11242]
    Jan 3 02:28:56 raspberrypi pppd[11242]: Hangup (SIGHUP)
    Jan 3 02:28:56 raspberrypi pppd[11242]: Modem hangup
    Jan 3 02:28:56 raspberrypi pppd[11242]: Connection terminated.
    Jan 3 02:28:56 raspberrypi pppd[11242]: Exit.
    Jan 3 02:28:56 raspberrypi pptpd[11211]: CTRL: Client 77.209.224.144 control connection finished
    Jan 3 02:28:56 raspberrypi ifplugd(ppp0)[12654]: Exiting.

    Gracias, un saludo

    ResponderEliminar
  7. Yo he podido configurar la vpn sin problemas con la distro raspbian.

    Eres un crack, muchas gracias por toda esta información :D

    ResponderEliminar
  8. Muy buen artículo.
    Solo una puntualización. Se necesita hacer postrouting mediante IPTABLES, sino, no sales a inet.

    ResponderEliminar
  9. tengo un problema, sigo todos tus pasos, pero luego no soy capaz de conectarme, bueno, no he cambiado de kernel, intento conectarme con un cliente cisco, no encuentro otro cliente vpn para windows.
    pero nada... que cliente usais en windows??
    el syslog dice esto
    Jan 23 15:59:12 raspberrypi pptpd[8507]: MGR: Manager process started
    $an 23 15:59:12 raspberrypi pptpd[8507]: MGR: Maximum of 6 connections available
    $an 23 16:04:51 raspberrypi pptpd[8568]: MGR: Maximum of 100 connections reduced to 5, not enough IP addresses given
    $an 23 16:04:51 raspberrypi pptpd[8569]: MGR: Manager process started
    $an 23 16:04:51 raspberrypi pptpd[8569]: MGR: Maximum of 5 connections available
    Jan 23 16:05:17 raspberrypi pptpd[8569]: MGR: initial packet length 51746 outside (0 - 220)
    $an 23 16:04:51 raspberrypi pptpd[8569]: MGR: Manager process started
    $an 23 16:04:51 raspberrypi pptpd[8569]: MGR: Maximum of 5 connections available
    Jan 23 16:05:17 raspberrypi pptpd[8569]: MGR: initial packet length 51746 outside (0 - 220)Jan 23 16:04:51 raspberryp$

    ResponderEliminar
    Respuestas
    1. windows ya trae un cliente compatible con las instrucciones que pongo. Tienes que ir a las opciones de los interfaces de red (desconozco que nombre recibe actualmente) y tiene que haber algo como "nueva conexion de red" o algo asi, te sale un asistente y en una de las opciones le dices que es uan red vpn, o red privada, o red para el trabajo o red para trabajar o red segura ... desconozo cual es el nombre que toca ponerle actualmente ;)

      Eliminar
  10. vale, bien, ya lo encontre, pero no entiendo porque no me conecta.... en fin, si os pego el archivo de configuracion, me podeis ayudar a ver donde he metido la pata?

    ResponderEliminar
    Respuestas
    1. claro, ponlo en pastebin y danos el enlace.

      Eliminar
    2. Aqui los teneis
      http://pastebin.com/5nVwvDUT
      http://pastebin.com/BbLTV6zi

      Eliminar
    3. pongo tambien el syslog...parece que llegar llego...pero hay algo que me rechaza la conexion...o eso creo

      http://pastebin.com/nKv4i94y

      Eliminar
    4. no veo el fallo, tu archivo options es algo distinto al mio:

      name pptpd
      require-mschap-v2
      require-mppe-128
      nomppe-stateful
      nodefaultroute
      debug
      lock
      nobsdcomp

      el resto todo comentado, prueba a ver.

      Eliminar
  11. Una dudilla. Se podría de alguna manera que cuando se haga login en la VPN se pudiera ejecutar algún comando?

    Me interesa para llamar a un sh que tengo para enviar una alerta por correo. Cuando alguien conecta vía ssh también lo hago.

    Pero como ahora tengo todo cerrado excepto la VPN no tiene sentido avisar cuando hay una conexión ssh, porque siempre va a ser alguien de la red.

    Además si se pudiera sacar de las variables de entorno o de otro sitio el usuario conectado y la ip desde donde se conecta seria la leche ;)

    ResponderEliminar
    Respuestas
    1. es linux! pos claro que se puede!. Si la propia configuración del servicio no te lo permite (tendría que mirarlo) puedes hacerlo monitorizando con incron el archivo del log de la vpn. Incron lo he usado varias veces en otros post, seguro que consigues lo que quieres dedicándole unos minutos. Ya nos contarás.

      Eliminar
  12. hola, estoy siguiendo los pasos que comentas en tu post y no consigo acceder desde el portatil, ni desde la red local ni desde fuera, para poder conectarme por ssh desde no-ip (a pesar de tener el cliente instalado) tuve que configurar mi raspi como dmz en el router pero asi y todo no tengo acceso gracias

    ResponderEliminar
    Respuestas
    1. desde la red local, es posible que no puedas conectar, los ruters adsl se lian un poco con eso. Desde fuera, tiene que dejarte.
      Si pones un segmento de DMZ en tu red, tienes que asegurarte de lo que el ruter adsl entiende por DMZ. Yo te recomiendo, que no uses DMZ en una red doméstica.
      Se me ocurren varias pruebas, pero la mas simple es comprobar que los primeros direccionamientos los haces correctamente. Prueba instalar apache en el raspberry y haz un nat en el ruter para que sea alcanzable desde fuera el puerto 80. Desde fuera de la red ataca a ese puerto y comprueba que se muestra el apache del raspberry.
      Si eso no te funciona, no te funcionará nada. Despues de la prueba quita el NAT, que hay mucho juanker suelto.

      Eliminar
    2. Muchas Gracias por tu respuesta, y perdón por el retraso pero estuve fuera. Por problemas con la room de mi smartphone no puedo usar vpn en el, igual algún día la cambio (sigue siendo la de el fabricante). Actualmente estoy conectado a la red por vpn y me funciona internet y todo pero no veo el resto de equipos, sera por que estoy en windows y todos los demas de la red estan en linux?

      Eliminar
    3. no, por que no se que ip tienen, no me aparecen en la red y con 192.168.1.x no los puedo encontrar

      Eliminar
    4. por cierto, acabo de reiniciar y arrancar desde ubuntu y no puedo acceder a la red vpn, así como en windows tengo acceso pero no veo los demás dispositivos en el mapa de red en linux directamente no puedo acceder a ella.

      Eliminar
  13. Alguno sabe si es posible establecer una VPN, conectando el Raspberry mediante Wifi?
    Tengo el Raspberry como servidor, y lo tengo conectado con Wifi. Cuando intento conectar a la VPN, las conexiones del Raspberry se cuelgan. Sigue funcionando, pero no responde a ping, ssh, por supuesto no llega a conectarse a la VPN. La única solución es ir, quitar la alimentación, y volver a encenderlo.
    Sin embargo si lo conecto por LAN, funciona sin problemas. Imagino que de alguna forma, conectar el Wifi Usb se desconecta, y se pierde la conexión.
    A alguno se le ocurre algo? Creo que me he quedado sin ideas.

    ResponderEliminar
    Respuestas
    1. al servidor vpn le da lo mismo si viene por cable, wifi, modem, cuerda o señales de humo. Hay una remota posibilidad de que el forwarding no se haga correctamente, pero seria un fallo en el firmware del adaptador wifi. Mira a ver si una version mas actualizada, pero no te dejes la vida en ello, porque es dificil que sea eso.

      Eliminar
    2. Pues por señales de humo no he probado. Pero te aseguro que lo conecto por LAN, y funciona. No toco nada, lo conecto por Wifi, y cuando conecto se cuelga. (llevo todo el domingo probando).
      Tengo que probar con otro adaptador, o ver si al establecer la VPN incurre en alguna incompatibilidad que lo cuelga. El syslog no me da más pistas. Seguiré buscando, y si consigo resolverlo os lo comento.
      En cualquier caso, gracias por tu respuesta

      Eliminar
    3. muy posiblemente sea por lo del firmware. Supongo que pones la ip del wifi en las configuraciones y en la línea del iptables cambias el interfaz por wlan0 (o la que sea) no?

      Eliminar
  14. Hola.

    En primer lugar, enhorabuena por el blog. Te sigo desde hace un tiempo y creo que tus tutoriales son fantásticos y fáciles de seguir.

    Aunque ya había configurado con éxito la VPN, desde hace unos días estoy teniendo unos problemas que me tienen despistado. Cuando intento logarme, uso 3G (Pepephone) en un HTC Desire Rooteado con CYanogenMod 7.2.0.1, me falla y en el syslog me sale esto:
    http://pastebin.com/k7YERdXx

    Me he asegurado que el APN de pepephone use gprs.pepephone.com en lugar de gprsmov.pepephone.com ...

    También he actualizado el firmware de la RPi (rpi-update) ...

    Aparentemente, no importa si pongo mal o bien la contraseña, ya que el error es el mismo.

    ¿Alguna idea o sugerencia o pista para seguir?

    Saludos.

    ResponderEliminar
    Respuestas
    1. hay que descartar que sea fallo del HTC o del servidor, así que antes de nada tienes que probar desde otro 'aparato', ya sea windows, linux o cualquier otro.

      Eliminar
    2. Gracias por tu rápida respuesta!

      ¿Valdría un iphone? Porque me da el mismo error.

      El lunes me hicieron una intervención desde ONO para actualizarme el firmware del cable modem, no descarto que pasara algo, pero a priori el puerto está abierto y disponible.

      He probado a llevar a cabo los pasos desde 0 ... ¡y sin éxito!

      ¿Más ideas?

      Eliminar
    3. valdria un Iphone. No me gusta hecharle la culpa a algo que no he tocado, pero mira a ver si hay alguna opción en el cable modem, que se llame "vpn passthough" se esta poniendo de moda y fastidia bastante. En el curro hemos tenido más de un caso así. Y lo jodío jodío, es que lo tenga y sea de esas opciones que no se pueden modificar.
      Esperemos que no sea por eso, seguiremos pensando ...

      Eliminar
    4. Hola.

      Resuelto! Tengo un Router de ONO y me han actualizado el firmware tal y como adelanté. La nueva versión desactiva por seguridad el servicio ppp e ipsec ... entre otros.

      Ya está activado y funcionando ;)

      Gracias por todo.

      Eliminar
    5. Hola.

      Al igual que otras personas, cuando me conecto a la VPN (por ahora sólo lo he hecho con 3G) pierdo la salida a Internet. Puedo hacer ping a la raspberry, pero no puedo salir a Internet.

      ¿Alguna idea?

      Gracias por adelantado.

      Saludos.

      Eliminar
    6. has hecho la parte de la actualizacion del 27/2 ? asegurarte tambien de la parte del ip forwarding.

      Eliminar
    7. hola Raul / Juan

      yo agregue dns editando:

      sudo nano /etc/ppp/pptpd-options

      agregamos :

      ms-dns 192.168.1.1

      podemos poner 8.8.8.8 (dns de googgle) o los que gusten. en mi caso puse la ip de mi router aunque tambien pude poner la ip de las raspberry (no la localip). en mi caso la rpi tiene la 192.168.1.110..
      La vpn ya esta probada en red local, y desde internet en 2 unidades android con 3G.
      saludos.

      Eliminar
  15. Hola Buenas.
    he seguido tu manual y solo me conecta por el movil android y se descoencta en menos de un minuto, y por pc ya sea windows o linux ni conecta..

    no se que mas hacer!!!

    Gracias y un saludo.

    ResponderEliminar
  16. Buenas Juan Mol

    Muchas gracias por tu tuto, tengo todo funcionando como la seda. Eso sí, con la configuración que tienes no he conseguido salir a internet, tuve que añadir en /etc/rc.local la siguiente línea:

    sudo iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

    Y bueno, lo tengo funcionando tanto en win7 como en android. Un saludo y gracias!

    ResponderEliminar
  17. Hola soy de Méjico y ando buscando un router cisco con servidor sip fxo adsl fxs' s y algo de wifi y bueno gigabit ethernet para poner switch

    ResponderEliminar