jueves, 7 de agosto de 2014

̣MIKROTIK: Configurar OpenVPN en router Mikrotik

Sobre OpenVPN

Actualmente las implementaciones de VPNs pueden ser por medio de estas tecnologías: SSL, IPSec y PPTP.

OpenVPN es un proyecto open source de VPNs para la implementar conexiones seguras point-to-point o site-to-site. Utiliza SSL/TLS para el intercambio de llaves y es capaz de atravesar NAT y firewalls, permite autenticación por medio de llaves preestablecidas (pre-shared secret key), certificados o usuario/contraseña.

Algunas de las ventajas de usar OpenVPN es su implementación en el espacio de usuario, lo que permite portabilidad en distintas plataformas, no modifica el protocolo IP como en el caso de IPSec y es más seguro que PPTP por lo que es una de los tipos de implementaciones recomendados para trabajar con VPNs.

Instalación

Se configurará como servidor VPN un router Mikrotik y como cliente una PC con Linux (Fedora, CentOS) pero es fácil configurar como cliente una PC con Windows. Las instrucciones y la descarga de clientes se encuentran en el sitio oficial de OpenVPN.

Topología a usar





Pasos


Aproximadamente a partir de la versión 6.3 de RouterOS en el Mikrotik se cambió la forma de crear certificados, ahora se tiene que crear primero un template y después crear el certificado basado en ese template.

Los pasos para configurar OpenVPN son:

  1. Crear el certificado SSL de servidor para Mikrotik.
  2. Crear los certificados para los clientes que se van a conectar
  3. Configurar OpenVPN
  4. Configuramos el cliente


Crear certificados SSL de servidor para el Mikrotik

Creamos el template
/certificate add name=cert1 common-name=servidorvpn.empresa-abc.com key-size=2048 country=NI state=Managua locality=Managua organization="Empresa ABC" subject-alt-name=email:micorreo@empresa-abc.com

El common-name es el único dato importante y debe ser el hostname para el IP Público del router. Por ejemplo: servidorvpn.empresa-abc.com
Creamos el certificado
/certificate create-certificate-request  template: cert1  key-passphrase: ******
Esto crea el archivo certificate-request.pem y certificate-request_key.pem en el directorio raíz del Mikrotik.
Descargamos los archivos (por winbox/scp/sftp) certificate-request.pem y certificate-request_key.pem del Mikrotik a la PC.
$ sftp 198.51.100.2  admin@198.51.100.2's password:   Connected to 198.51.100.2.  sftp> get certificate-request.pem  Fetching /certificate-request.pem to certificate-request.pem  /certificate-request.pem                                     100% 1074     1.1KB/s   00:00    sftp> get certificate-request_key.pem  /certificate-request_key.pem                                 100% 1834     1.8KB/s   00:00        sftp> exit
Abrimos el archivo certificate-request.pem en un editor de texto y copiamos el contenido.
Utilizando CAcert como Certificate Authority entramos a nuestra cuenta https://www.cacert.org (si no se tiene cuenta se debe de crear, registrar y comprobar el domino, algo que no toma más de 10 minutos) y creamos un nuevo Certificado de Servidor (Certificado de Servidor > Nuevo)
Pegamos el contenido del certificado donde dice Pegue abajo el contenido de su solicitud de firma de certificado (CSR)...
Con el contenido del certificado pegado enviamos la solicitud, se nos presenta una página con el certificado del servidor para el Mikrotik que dice

Copiamos el contenido en un editor de texto y lo guardamos como certificate-response.pem.
Ahora nos falta la llave privada para el otro archivo (certificate-request_key.pem) que descargamos, pero, para generar esta llave nos tenemos que apoyar con el paquete de openssl en Linux ya que Mikrotik no soporta llaves en el formato pkcs8.
Instalamos openssl
yum install openssl
Corremos

$ openssl rsa -in certificate-request_key.pem -text  Enter pass phrase for certificate-request_key.pem:  ...  writing RSA key  -----BEGIN RSA PRIVATE KEY-----  MIIEowIBAAKCAQEArPs+8FBatVwc3Lunm9zfmWc/CMwQotouxE5+Xl4HIT44LHSO  HjHOpN5mTfRfSHH7cMiHjxEr+rebxvbtGVmL4j7zXd+A+7gbvk8ZC5TT7UD0Q6DH  1guEggwvkddi/8z/Fd225bGiBpk3nQw1EXBQPP/KqTm+zN4/rC8sIcpudaeb+yCz  9tkZAICn8lHdQZge85HAgM3OButtirJAeB9ZyKL3MREZayodchtR4AW09PqTq8a8  NQeXkVynnJb07+B/qSu9U6r1Shyggx/J9gGb9wv/CebpA8lILRow//Q7gV1U72DZ  ...
Copiamos la llave generada desde donde dice BEGIN RSA PRIVATE KEY a un editor de texto y la guardamos con el nombre de private-key.key
Subimos los archivos certificate-response.pem y private-key.key al Mikrotik
$ scp certificate-response.pem private-key.key 198.51.100.2:  198.51.100.2's password:   certificate-response.pem                                     100% 1846     1.8KB/s   00:00      private-key.key                                              100% 1676     1.6KB/s   00:00  
y luego los instalamos con:
/certificate import  passphrase: ********       certificates-imported: 1       private-keys-imported: 1              files-imported: 2         decryption-failures: 0    keys-with-no-certificate: 0  
Corremos el siguiente comando en el Mikrotik para revisar el certificado:
/certificate print detail  ...  1 K L   T name="cert_4"              issuer=O=Root CA,OU=http:,,www.cacert.org,CN=CA Cert Signing Authority,emailAddress=support@cacert.org   ...
Vemos que el nombre es cert_4.

Crear certificado para los clientes

Los clientes que se conectarán por OpenVPN requieren contar también con certificados. Estos los crearemos con la herramienta pkitool del paquete easy-rsa en Linux.
Debido a que se requiere autenticar tanto al servidor como cliente, necesitaremos certificados para el servidor el cual nombraremos "RB2011" y certificados para la PC que vamos a conectar la que nombramos "client1".
Instalamos easy-rsa
$ sudo yum install easy-rsa

Inicializamos easy-rsa
En Fedora 20, se instala en /usr/share/easy-rsa/2.0. Es preferible modificar las variables del archivo vars. Como root:
# cd /usr/share/easy-rsa/2.0  # mkdir keys
Modificamos en el archivo vars y modificamos:
# vi vars    export KEY_COUNTRY="NI"  export KEY_PROVINCE="MGA"  export KEY_CITY="Managua"  export KEY_ORG="Empresa ABC"  export KEY_EMAIL="micorreo@empresa-abc.com"  export KEY_OU=""
Salimos del editor y actualizamos las variables
# source vars  # ./clean-all

Creamos CA (Certificate Authority)
Esto nos va a dar autoridad para firmar certificados para el servidor y clientes.
# ./pkitool --initca  Using CA Common Name: Fort-Funston CA  Generating a 2048 bit RSA private key  ............................................+++  ...............................+++  writing new private key to 'ca.key'  -----
Esto nos crea los archivos ca.crt y ca.key en el directorio keys. El archivo ca.key no lo tocamos, el archivo ca.crt con el certificado root debe de copiarse en el Mikrotik y en todos los clientes que intentarán conectarse (este paso se describe más abajo).
Creamos la Llave y Certificado del Servidor (Server Certificate)

# ./pkitool --pass --server RB2011    Generating a 2048 bit RSA private key  ......................................+++  ......+++  writing new private key to 'RB2011.key'
Estos nos crea los archivos RB2011.crt,RB2011.csr y RB2011.key. Usamos de nombre "RB2011" para referirnos al modelo del router Mikrotik que usamos pero puede ser cualquier otro para identificarlo.
Convertimos la Llave Privada del Servidor (Server Private Key) a formato .pem

# openssl rsa -in keys/RB2011.key -out keys/RB2011.pem
Sólo es necesario crear una llave para el servidor.
Creamos la Llave y Certificado del Cliente (Client Certificate)
# ./pkitool --pass client1
Nos crea los archivos client1.crt, client1.csr y client1.key
Si queremos crear llaves para otros clientes de la VPN los creamos aquí, las convertimos a formato.pem y la subimos al Mikrotik (ver abajo).
Convertimos la Llave Privada del Cliente (Client Private Key) recién creada a formato .pem

# openssl rsa -in keys/client1.key -out keys/client1.pem

Subimos el Certificado y Llave del Servidor al Mikrotik
# scp keys/RB2011.crt keys/RB2011.pem keys/ca.crt @198.51.100.2:
Tener cuidado de no subir la llave privada ca.key.

Instalamos los Certificados y Llaves en el Mikrotik:
/certificate  import file=RB2011.crt  import file=RB2011.pem  import file=ca.crt
Con esto tenemos instalado:
RB2011.crt - certificado del Mikrotik.
RB2011.pem - llave para del Mikrotik.
ca.crt - Nuestro certificado root que nos da autoridad.
Subimos el Certificado y Llave del Cliente al Mikrotik:

# scp keys/client1.crt keys/client1.pem daniel@198.51.100.2:

Instalamos en el Mikrotik:
/certificate  import file=client1.crt  import file=client1.pem
Instalamos:
client1.crt - certificado cliente para nuestro usuario.
client1.pem - llave cliente para nuestro usuario.

Configuramos OpenVPN en el router Mikrotik

Se configurará el router Mikrotik desde el inicio, se asume que no tiene configuración adicional.

Configuramos el bridge para la VPN
/interface bridge add name=vpn-bridge
  /interface bridge port add interface=ether2 bridge=vpn-bridge
Configuramos IPs

/ip address add address=198.51.100.2/24 interface=ether1 comment=INTERNET  /ip address add address=172.16.1.1/24 interface=ether2 comment=LAN
IP WAN: 198.51.100.2 interfaz ether1 (IP Público asignado por ISP)
IP LAN: 172.16.1.1 interfaz ether2 (IP para la interfaz interna)
Configuramos gateway por default (ISP)
/ip route add gateway=198.51.100.1 comment=Internet 
Creamos pool de IPs
Creamos un pool de direcciones para asignar a los clientes de la VPN
/ip pool add name=ovpn-pool \  ranges=172.16.1.100-172.16.1.120
Asegurarse que este pool no interfiera con el pool de algún posible servidor DHCP que vayamos a configurar para la red interna más adelante.
Hacemos NAT para conexiones salientes
/ip firewall nat add chain=srcnat \  out-interface=ether1 action=masquerade
Configuramos el OpenVPN Server
Definimos un perfil
/ppp profile   add name="openvpn" local-address="172.16.1.1" \  remote-address=ovpn-pool \  bridge=vpn-bridge use-ipv6=yes use-mpls=default \   use-compression=default use-vj-compression=default \   use-encryption=required only-one=default \  change-tcp-mss=default address-list="" \  dns-server=8.8.8.8,4.4.4.4
Agregamos usuario de la VPN
/ppp secret   add name=daniel \  password=goodpassword profile=openvpn \  service=ovpn
Activamos el servicio
/interface ovpn-server server \  set auth=sha1 certificate=cert_5 \  cipher=blowfish128,aes128,aes192,aes256 \  default-profile=openvpn enabled=yes port=1194
Lo más seguro es que tengamos varios certificados en el Mikrotik por lo que hay que asegurarse que certificate= sea el certificado del servidor (en nuestro caso lleva de common name: RB2011, para mi cert_5). Esto lo verificamos corriendo el comando en el Mikrotik: /certificate print detail
Configuramos el firewall
Permitimos conexiones para la VPN
/ip firewall filter \   add action=accept chain=input comment="OpenVPN" \  disabled=no dst-port=1194 protocol=tcp

Configuramos el cliente

Para que un cliente pueda conectarse a la VPN debemos copiar las llaves del cliente y certificados ca.crt, client1.crt y client1.pem a la PC cliente. Se recomienda copiarlas por un método seguro como sftp o scp. Si se van a transportar las llaves copiándolas a una memoria USB se recomienda asegurarse que sean borradas después ya que en el caso que se extravíe la memoria, nadie más pueda conectarse usando las llaves.
En la PC cliente instalamos openvpn si no lo hemos hecho:
yum install openvpn
Las llaves y certificado para el cliente las copiamos (por ejemplo en: /etc/openvpn/) asegurándonos que tengan derecho de lectura por root solamente:
Copiamos las llaves a la PC cliente
$ sudo cp ca.crt client1.crt client1.key /etc/openvpn/
Damos permiso de lectura y escritura a root solamente
$ sudo chown root:root /etc/openvpn/*  $ sudo chmod 600 /etc/openvpn/*
Creamos el archivo que nos servirá de script de conexión para OpenVPN
Para conectarnos a la VPN debemos ejecutar un script que contendrá opciones, configuración del servidor y ubicación de las llaves. A este archivo le llamamos client.ovpn y lo podemos guardar de igual forma en /etc/openvpn/
$ sudo vim /etc/openvpn/client.ovpn
Copiamos la configuración de conexión
# client.ovpn    # Dispositivo para la conexión  # dev tap # modo bridge ethernet en Mikrotik. Encapsulamos tramas Ethernet. Permite pasar al cliente broadcast, etc.   dev tun # ip en Mikrotik. Encapsulamos protocolo IP solamente.    # El tunel se hará por TCP. Mikrotik no soporta UDP.  proto tcp-client    # Nombre del servidor OpenVPN  # remoto o dirección IP  remote servidorvpn.empresa-abc.com 443     # Ubicación de certificados y llaves  # ca: Certificado de Autoridad (CA Public Key)  # cert: Client certificate (Client Public Key)  # key: Client Private Key  ca   /etc/openvpn/ca.crt  cert /etc/openvpn/client1.crt  key  /etc/openvpn/client1.key    # Habilita encriptación TLS (SSL)  # Nos conectamos por puerto 443  tls-client  port 443    # OpenVPN debe correr como root para leer el archivo de la llave de servidor, abrir el dispositivo tun, etc. Después de hacer eso baja de permisos para correr como el siguiente usuario/grupo  user nobody  group nobody    # Habilitamos compresión de datos  comp-lzo    # Opcionalmente podemos fijar rutas por la VPN de esta forma  #route 192.168.0.0 255.255.255.0 172.16.1.1    # Que la VPN sea default gateway para todo tráfico  redirect-gateway    # Para detectar cuando se cae la conexión  ping 15  ping-restart 45  ping-timer-rem    # Mantener en cache detalles de la conexión   # dispositivos (tun) y llaves (keys) para intentar  # reconexiones en caso de interrupción  persist-tun  persist-key    # No mostramos replay warnings que son falsas alarmas comunes  # de paquetes duplicados en redes WiFi.   mute-replay-warnings    # Verbosity level.  # 0 = quiet, 1 = mostly quiet, 3 = medium output, 9 = verbose  verb 3    # Encriptación de los datos  cipher AES-256-CBC  # Algoritmo de hash para autenticación  auth SHA1    # Aceptar opciones "push" del servidor  pull    # Log  status /var/log/openvpn-status.log  log-append /var/log/openvpn.log    # El archivo auth.cfg contiene autenticación de usuario/clave.   # En la primera línea del archivo va el usuario y la segunda línea la clave  auth-user-pass auth.cfg
Conectamos el cliente a la VPN (línea de comando)
$ sudo openvpn --config /etc/openvpn/client.ovpn --daemon
Con el comando anterior openvpn correrá como daemon con la configuración en el archivo client.ovpn.
Podemos ver el estado de la conexión viendo el log
$ sudo tail /var/log/openvpn.log
Conectamos el cliente a la VPN (interfaz gráfica)
En el administrador de red de Gnome 3
Network Manager-> Network Settings-> +(Add Network Connection)-> Import from file... y seleccionamos el archivo client.ovpn con la configuración.
----------------
Más ejemplos:
Leer más sobre OpenVPN

3 comentarios:

  1. Hola intente establecer ovpn pero me da un error de TLS cuando el cliente intenta cnectarse. El servidor y el cliente estan directamente conectados entre si.

    Saludos

    ResponderEliminar
  2. como hago para registrar un dominio en cacert !!! para emitir mi certificado

    ResponderEliminar
  3. Hola buenos dias, si tengo 2 LAN el MK 192.168.1.x y 10.89.149.x como puedo hacer para que al esteblecer la conexion VPN pueda llegar a ambas??

    ResponderEliminar