Configurar un cliente vpn l2tp en linux como servicio

¿Cual era mi problema?

Uno de mis cliente necesitaba conectar su pagina web con su ERP, como es normal el servidor web esta en un hosting y el ERP en su servidor de la oficina. Como medida de seguridad me pidieron que la comunicación entre los equipos fuera por vpn, y como no…el servidor solamente aceptaba l2tp sobre ipsec, lo más complicado para configurar en un linux por consola, no podía ser openvpn no….en fin que nos toco investigar como se configura el l2tp en linux y no te creas que hay una información clara. 

Por último para complicar un poco más el asunto era necesario que el cliente (la web tuviese un ip fija interna), esto costo un riñón encontrar como hacerlo. Pero el menda es un poco cabezón y después de mucho investigar encontré como hacerlo. Viva la documentación!!!

La receta de hoy: Como configurar un cliente l2tp sobre IPSec en linux con ip fija por consola y con comprobación de conexión cada minuto

Ingredientes.

    1. Un servidor de vpn l2tp sobre ipsec con ip fija.
    2. Un usuario, contraseña de usuario y contraseña de ipsec.

Preparación.

Vamos al lío. Para poder conectar el cliente linux por l2tp osobre ipsec vamos a necesitar instalar los siguientes paquetes: libreswan para la parte ipsec, y xl2tpd para la parte l2tp para ello escribimos lo siguiente:

Para debian/ubuntu:

apt install libreswan x2ltpd

Para centos

yum install libreswan x2ltpd 

Empezamos por configurar libreswan, para lo que tenemos que crear un fichero de configurar en /etc/ipsec.d/ en nuestro caso le vamos a llamar v_cli.conf y le pegamos lo siguiente:

conn v_cli

  left=%defaultroute

  auto=add

  authby=secret

  type=transport

  leftprotoport=17/1701

  rightprotoport=17/1701

  right=X.X.X.X #la ip publica del servidor vpn

  rightid=Y.Y.Y.Y #la ip privada del servidor vpn

Con esto ya tenemos una configuración estándar para el túnel ipsec. Solamente nos queda indicar la contraseña del túnel. Esto lo hacemos modificando el fichero /etc/ipsec.secrets añadiendo la siguiente línea con nuestro:

%any : PSK "Contraseña"

Con esto ya tendríamos la parte ipsec configurada. Vamos a por la parte L2TP, esto la hacemos configurando el paquete xl2tp, lo cual hacemos modificando el fichero /etc/x2ltpd/xl2tp.conf con los siguientes datos:

[lac v_cli] #nombre de nuestra conexión

lns=X.X.X.X #la ip publica de nuestro servidor

ppp debug = yes

pppoptfile = /etc/ppp/options.xl2tpd.client #indicamos donde está el fichero de configuración del cliente

length bit = yes

Ahora configuramos el cliente ppp para meter los datos de nuestros usuario:

pcp-accept-local

ipcp-accept-remote

require-mschap-v2

noaccomp

noccp

noauth

idle 1800

mtu 1410

mru 1410

noipdefault

nodefaultroute

Y.Y.Y.Z:Y.Y.Y.Y #donde Y.Y.Y.z es la ip fija que le queremos dar a nuestro equipo en la red remota y Y.Y.Y.Y la ip privada del servidor vpn

usepeerdns

debug

logfile /var/log/xl2tpd.log

connect-delay 5000

proxyarp

name v_name #nuestro usuario

password v_password #nuestra contraseña de usuario

Si lo hemos hecho todo bien, ya tendríamos nuestro túnel levantado ahora solo tendríamos que ejecutar los siguientes comandos para levantarlo

sudo systemctl start ipsec #arrancamos el servicio de ipsec
sudo systemctl start xl2tpd #arrancamos el servicios de l2tp
sudo ipsec auto --up v_cli #levanta el tunel ipsec v_cli
sudo xl2tpd connect v_cli #conecta a nuestro usuario con el túnel l2tp 

Con esto tendríamos levantado el túnel a través de una nueva interfaz ppp0 con una ip estática Y.Y.Y.Z, solo nos queda indicar la ruta que para llegar a nuestra red remota Y.Y.Y.Y tiene que usar esta nueva interfaz para eso añadimos una ruta estática:

route add -net Y.Y.Y.0/24 gw Y.Y.Y.Z dev ppp0

y voilá ya tenemos nuestro cliente conectado a nuestra red remota. Este proceso lo tendríamos que repetir cada vez que queramos conectarnos. Para que no tengamos que estar pendientes de hacerlo creamos un script que ejecutado cada minuto compruebe que la conexión está creada y sino creará de nuevo el túnel.

#!/bin/bash
 #obtenemos las ip de la interfaz ppp0
 IP_P=$(ip -o -4 a show dev ppp0 | awk -F '[ /]+' '/global/ {print $4}') 
 
#comprobamos que la ip concede con la nuestra y sino volvemos a levantar el túnel
 if [ "$IP_P" = "Y.Y.Y.Z" ]
         then
                 exit -1
         else
                 echo "Hay que conectar v_cli"
                 sleep 1
                 echo "Reinciamos los servicios....."
                 systemctl stop ipsec || true
                 systemctl start ipsec 
                 systemctl stop xl2tpd || true
                 systemctl start xl2tpd
                 echo "Servicios reiniciados, conectamos v_cli"
                 sleep 5
                 ipsec auto --up v_cli
                 xl2tpd-control connect v_cli
                 sleep 10
                 echo "Comprobamos PPP0 y añadimos la ruta ..."
                 ipconfig ppp0
                 route add -net Y.Y.Y.0/24 gw Y.Y.Y.Z dev ppp0
                 echo "Todo listo"
 fi

Ahora solo tenéis que configurar el cron para que ejecute el script cada minuto y así os aseguráis que nunca estaréis sin conexión.

Esto es todo amigos!!!

Activar o desactivar servicios en Linux

¿Cual era mi problema?

En muchas ocasiones he necesitado poder activar que un servicio en Linux se active automáticamente al arrancar el equipo. Normalmente al instalar un servicio,  por ejemplo un servidor web (apache, nginx, etc…), este se instala para que arranque al reiniciarse la máquina pero puede que esto no sea interesante en un momento dado y querramos desactivarlo.

Vamos a ver como hacemos esto para las distintas distribuciones de Linux.

La receta de hoy: Como activar o desactivar servicios en Linux.

Ingredientes.

    1. Una consola conectada a nuestra maquina Linux.
    2. Un servicio instalado por ejemplo SSH.

Preparación.

Activación de servicios en CentOS, Red Hat o Suse

Para estas distribuciones la herramienta que gestiona los servicios es chkconfig la cual permite activarlos y desactivarlos.

Si quiséramos ver el listado de servicios instalados y en que nivel del arranque se activan podemos verlos con

# chkconfig –list

obtendríamos algo como esto

# chkconfig –list
atd                                0:off     1:off    2:off    3:on    4:on     5:on   6:off
attach-static-vdis 0:off     1:off    2:on     3:on    4:on     5:on   6:off
crond                           0:off     1:off    2:on     3:on    4:on     5:on   6:off
dhcpd                          0:off     1:off    2:off    3:off   4:off     5:off  6:off
dhcrelay                     0:off     1:off    2:off    3:off   4:off     5:off   6:off

Vemos los servicios instalados y en que nivel del arranque se activan. Para activar nuestro servicio SSH solamente tendríamos que escribir:

# chkconfig ssh on

Si lo queremos desactivar

# chkconfig ssh off

y si queremos indicarle el nivel en el que queremos que arranque, por ejemplo el 5:

# chkconfig –level 5 ssh on

Chupao ¿verdad?

Activación de servicios en Debian, Ubuntu y derivados.

En estas distribuciones la herramienta update-rc.d es la  encargada de hacer la activación o desactivación.

Para iniciar automáticamente el servicio ssh se debe ejecutar el comando:

# update-rc.d ssh defaults

Si queremos indicarle el nivel en el que queremos que arranque en nuestro caso el 5:

# update-rc.d  ssh  start 5

Para descativar el servicio ejecutamos:

# update-rc.d ssh remove

Sencillo, hasta la próxima entrada

Configurar un cliente openvpn en centOS

¿Cual era mi problema?

Uno de mis clientes necesita conectar su sistema de gestión con el servidor de la tienda online para sincronizar las bases de datos. Para que esta sincronización no se haga al aire, le monté una vpn usando openvpn que permita que los datos vayan lo más protegidos que sea posible. Hoy vamos a ver como configurar un cliente openvpn en centOS.

La receta de hoy: como configurar un cliente openvpn en centOS.

Yo normalmente trabajo con sistemas Debian pero el servidor web de mi cliente estaba con centOS por lo que he tenido que buscar en varias webs como hacerlo. Vamos a la faena…

Ingredientes.

    1. Servidor cliente con SO centOS
    2. Nuestro servidor openvpn configurado.
    3. Los ficheros de configuración del cliente (son 4): cliente.conf (fichero de configuración del cliente vpn), cacert.pem(certificado de la autoridad), XXXXXXX.pem(clave del cliente) y cliente.pem (certificado del cliente).
    4.  Acceso ssh y SFTP al Servidor cliente.

Preparación.

Lo primero que hay que instalar es el cliente de openvpn, pero resulta que los repositorios de centOS por defecto no tienen el paquete openvpn. Por lo que primero tenemos que instalar los repositorios  Extra Packages for Enterprise Linux (EPEL) en los que viene:

yum install epel-release

Una vez instalado el repositorio pasamos a instalar el paquete openvpn

yum install openvpn

Instalado el cliente openvpn. Vale, pero toca configurarlo ¿no? Pues nada, la cosa mas sencilla del mundo, subimos nuestros ficheros de configuración al servidor y los colocamos en la carpeta:

/etc/openvpn/

Listo! ya tenemos configurado el cliente.

¿Cómo conectar el cliente de openvpn?

Para probar que todo funciona, nos posicionaros en /etc/openvpn/ y ejecutamos:

openvpn –config cliente.conf

Y por arte de magia si nuestros ficheros de configuración están bien tendremos conectado nuestro servidor centOS con el servidor de openvpn.

Ahora me diréis muy bien pero ¿que pasa  si se reincia la máquina?

¿Cómo hacer que openvpn no se desconecte o se conecte automáticamente?.

Vamos automátizar el cliente para que se conectarse automáticamente cada vez que pierda la conexión. Vamos a configurar el cliente de openvpn como un servicio para lo cual escribimos lo siguiente:

systemctl start openvpn@cliente

Problema resuelto, ahora nuestro cliente se arranca automáticamente cada vez que la máquina se encienda.

Realmente es una configuración sencilla para alguien que esté acostumbrado a manejar centOS pero como no es mi caso he tenido que cocinarme esta receta buscando de aquí y de allá como hacerlo.