OpenVPN Site to Site

cabecera

Nos encontramos con un escenario como el que vemos en la ilustración, disponemos de dos redes aisladas entre sí, que son las redes 1 y 2, y los servidores S1 y S2, están conectados a Internet.

Vamos a crear, gracias a OpenVPN un túnel a través de Internet para interconectar las redes 1 y 2, dicho túnel tendrá un direccionamiento de la 10.10.10.0/24. Los “roles”, por llamarlo de alguna forma, de nuestros servidores serán, S1 el servidor principal y S2 el servidor cliente.

Bien, empezaremos con la configuración del servidor principal (S1 o servidor1). Comentar que todo el escenario está recreado con máquinas Debian Stretch.

apt install openvpn easy-rsa

Para una configuración más sencilla, haremos uso de easy-rsa, con lo que nos traemos los ficheros alojados en la siguiente ubicación, al directorio de configuración de openvpn, y el fichero openssl-1.0.0.cnf lo renombramos, copiamos o creamos un enlace simbólico a openssl.cnf (ésto es debido a que el script whereisopenssl no funciona correctamente).

cp -r /usr/share/easy-rsa/* /etc/openvpn
cd /etc/openvpn
cp openssl-1.0.0.cnf ./openssl.cnf

Entonces, en el fichero openssl.cnf comentamos las linea 198 (subjectAltName=$ENV::KEY_ALTNAMES) y 220 (subjectAltName=$ENV::KEY_ALTNAMES) ya que no vamos a hacer uso de dicha directiva, vamos a realizar una configuración más simple.

El siguiente paso que vamos a realizar es la modificación del fichero vars, para que nos sea más cómoda la creación de los certificados, pero ésto no debería hacerse así en un entorno real de producción, las entidades certificadores deben, manualmente, comprobar y configurar los certificados que emiten.

# Don't leave any of these fields blank.
export KEY_COUNTRY="ES"                # Igual en todos
export KEY_PROVINCE="SEVILLA"          # Igual en todos
export KEY_CITY="Dos Hermanas"         # Igual en todos
export KEY_ORG="Seguridad"             # Igual en todos
export KEY_EMAIL="root@localhost"
export KEY_CN="servidorCA"
export KEY_OU="OpenVPN"

# X509 Subject Field
export KEY_NAME="easy-rsa"

Entonces cargamos vars en nuestro enviroment y ejecutamos los comandos que nos indica.

source vars
./clean-all
./build-ca

Ésta es la creación de nuestra entidad certificadora, que dejaremos los campos por defecto (para ello hemos configurado el fichero vars).

Country Name (2 letter code) [ES]:
State or Province Name (full name) [Sevilla]:
Locality Name (eg, city) [DosHermanas]:
Organization Name (eg, company) [Seguridad]:
Organizational Unit Name (eg, section) [OpenVPN]:
Common Name (eg, your name or your server's hostname) [servidorCA]:
Name [easy-rsa]:
Email Address [root@localhost]:

Y construimos los parámetros de Diffie-Hellman.

./build-dh

Entonces, con todo ésto ya configurado, podremos crear el certificado de nuestro servidor.

./build-key-server servidor1

Vuelvo a hacer hincapié, al haber configurado y cargado el fichero vars, vamos a dejar los valores por defecto, pero habría que hacerlos manualmente, en este caso si que vamos a añadir que habrá que confirmar el firmarlo y el hacerlo efectivo, los atributos extras, los vamos a dejar en blanco.

Country Name (2 letter code) [ES]:
State or Province Name (full name) [Sevilla]:
Locality Name (eg, city) [DosHermanas]:
Organization Name (eg, company) [Seguridad]:
Organizational Unit Name (eg, section) [OpenVPN]:
Common Name (eg, your name or your server's hostname) [servidor1]:
Name [easy-rsa]:
Email Address [root@localhost]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/openssl.cnf
Can't open /etc/openvpn/keys/index.txt.attr for reading, No such file or directory
139892219663616:error:02001002:system library:fopen:No such file or directory:../crypto/bio/bss_file.c:74:fopen('/etc/openvpn/keys/index.txt.attr','r')
139892219663616:error:2006D080:BIO routines:BIO_new_file:no such file:../crypto/bio/bss_file.c:81:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'ES'
stateOrProvinceName :PRINTABLE:'Sevilla'
localityName :PRINTABLE:'DosHermanas'
organizationName :PRINTABLE:'Seguridad'
organizationalUnitName:PRINTABLE:'OpenVPN'
commonName :PRINTABLE:'servidor1'
name :PRINTABLE:'easy-rsa'
emailAddress :IA5STRING:'root@localhost'
Certificate is to be certified until Feb 16 18:09:07 2028 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Copiamos los certificados a sus correspondientes directorios.

cp keys/ca.crt /etc/ssl/certs/seguridad.crt
cp keys/servidor1.crt /etc/ssl/certs/
cp keys/servidor1.key /etc/ssl/private/
cp keys/dh2048.pem /etc/openvpn/

Ahora vamos a crear los certificados para nuestro servidor cliente (S2)

./build-key servidor2

Y al igual que en servidor1 vamos a dejar los parámetros extras en blanco, y confirmar el firmarlo y el hacerlo efectivo.

Generating a 2048 bit RSA private key
.....+++
................................................................................+++
writing new private key to 'servidor2.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [ES]:
State or Province Name (full name) [Sevilla]:
Locality Name (eg, city) [DosHermanas]:
Organization Name (eg, company) [Seguridad]:
Organizational Unit Name (eg, section) [OpenVPN]:
Common Name (eg, your name or your server's hostname) [servidor2]:
Name [easy-rsa]:
Email Address [root@localhost]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'ES'
stateOrProvinceName :PRINTABLE:'Sevilla'
localityName :PRINTABLE:'DosHermanas'
organizationName :PRINTABLE:'Seguridad'
organizationalUnitName:PRINTABLE:'OpenVPN'
commonName :PRINTABLE:'servidor2'
name :PRINTABLE:'easy-rsa'
emailAddress :IA5STRING:'root@localhost'
Certificate is to be certified until Feb 16 19:00:49 2028 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Las claves que se generan, deberemos pasarlas al servidor2 más adelante.

Ahora que ya tenemos toda la autenticación por certificados, vamos a configurar lo que realmente es de OpenVPN, entonces creamos en /etc/openvpn/ el fichero server.conf con la siguiente configuración.

# Interfaz to use
dev tun

# Route to certs and Diffie-Hellman parameters

ca /etc/ssl/certs/seguridad.crt
cert /etc/ssl/certs/servidor1.crt
key /etc/ssl/private/servidor1.key
dh /etc/openvpn/dh2048.pem

# Net to VPN (Servidor1 will get the *.*.*.1)
server 10.10.10.0 255.255.255.0

# Set up the static route to the clientes
push "route 10.0.0.0 255.255.255.0"

# Set up personal conf directory to the clients
client-config-dir ccd

# Set up clients can see between them
client-to-client

# Route to client private network
route 10.0.2.0 255.255.255.0
push "route 10.0.2.0 255.255.255.0"

Y ya podemos arrancar el servicio con la configuración.

systemctl start openvpn@server

Tal y como comentamos anteriormente, es necesario que el servidor2 tenga sus certificados para la conexión, así que los transferimos a su máquina.

scp keys/ca.crt usuario@servidor2:/home/usuario/seguridad.crt
scp keys/servidor2.crt usuario@servidor2:/home/usuario/
scp keys/servidor2.key usuario@servidor2:/home/usuario/

Y ya lo único que nos queda es la configuración del servidor2. Lo primero, como no, será instalar OpenVPN.

apt install openvpn

Y, como administrador, vamos a pasar los certificados a los correspondientes directorios.

cp /home/servidor2/seguridad.crt /etc/ssl/certs/
cp /home/servidor2/servidor2.crt /etc/ssl/certs/
cp /home/servidor2/servidor2.key /etc/ssl/private/

Para que la configuración no sea muy “tediosa”, vamos a utilizar el fichero de ejemplo que nos trae el propio OpenVPN y lo modificamos para nuestra conexión.

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/connect.conf

Lo primero será comentar la linea que contiene el parámetro ta.key, y la configuración que debemos modificar es la siguiente.

dev tun

# La dirección de servidor1 deberá estar en nuestro /etc/hosts o ser resuelta por DNS
remote servidor1 1194
 
# Ruta de los certificados
ca /etc/ssl/certs/seguridad.crt
cert /etc/ssl/certs/servidor2.crt
key /etc/ssl/private/servidor2.key

Ya tenemos toda la configuración creada, simplemente deberemos arrancar la conexión y será al igual que hemos hecho en el servidor1.

systemctl start openvpn@connect

Entonces con el comando ip podemos ver que se nos ha generado la interfaz tun0 con las características de la red 10.10.10.0/24

9: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
 link/none 
 inet 10.10.10.6 peer 10.10.10.5/32 scope global tun0
 valid_lft forever preferred_lft forever
 inet6 fe80::f9a1:b6fd:c92b:6cad/64 scope link flags 800 
 valid_lft forever preferred_lft forever

Y ya podremos realizar las pruebas de su correcto funcionamiento, con realizar una de extremo a extremo, es decir desde C1C2 o viceversa, sería suficiente, pero vamos a ver ambas para comprobar los saltos que hacen cada una.

Del C2 al C1 vemos que, al estar en la red 10.0.2.0/24, primero pasará por su puerta de enlace, que es el servidor2 éste accede a la 10.10.10.1, a través de la VPN y ya accede la red privada de ésta. Y en el caso contrario, del C1 al C2, son exactamente los mismos saltos, pero al contrario.

cliente2@CVPN2:~$ traceroute 10.0.0.2
traceroute to 10.0.0.2 (10.0.0.2), 30 hops max, 60 byte packets
 1 10.0.2.1 (10.0.2.1) 0.268 ms 0.520 ms 0.350 ms
 2 10.10.10.1 (10.10.10.1) 1.844 ms 1.862 ms 1.883 ms
 3 10.0.0.2 (10.0.0.2) 4.681 ms 4.746 ms 4.765 ms
cliente1@CVPN1:~$ traceroute 10.0.2.2
traceroute to 10.0.2.2 (10.0.2.2), 30 hops max, 60 byte packets
 1 10.0.0.1 (10.0.0.1) 0.291 ms 0.202 ms 0.117 ms
 2 10.10.10.6 (10.10.10.6) 1.493 ms 1.502 ms 4.974 ms
 3 10.0.2.2 (10.0.2.2) 5.222 ms 5.399 ms 5.513 ms
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s