En esta entrada explicare como realizar una configuración cliente VPN a red privada (VPN host to net) con un túnel VPN con certificados x509.

En primer lugar instalamos openvpn y openssl para el certificado:

apt-get install openvpn openssl

Bajamos los script de ejemplo o lo instalamos desde repositorios: Opción 1:

apt-get install easy-rsa

Opción 2:

git clone https://github.com/OpenVPN/easy-rsa.git -b 'release/2.x'

Copiamos los script de ejemplo:

cd /etc/openvpn/
mkdir easy-rsa
cp -r /root/easy-rsa/easy-rsa/2.0/* easy-rsa

Dentro de /etc/openvpn/easy-rsa/vars podremos configurar algunas variables de entorno que cargaremos posteriormente, vamos a modificar:

export KEY_SIZE=2048
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="ES"
export KEY_PROVINCE="Sevilla"
export KEY_CITY="Dos Hermanas"
export KEY_ORG="IESGN"
export KEY_EMAIL="juanmanuel.torres@aventurabinaria.es"
export KEY_OU="Informatica"

export KEY_NAME="vpn_key"
# PKCS11 Smart Card
export PKCS11_MODULE_PATH="/usr/lib/changeme.so"
export PKCS11_PIN=1234
export KEY_CN="ServidorVPN"

Cargamos las variables de entorno anteriores:

root@servidorvpn:/etc/openvpn/easy-rsa# source vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

Creación del certificado:

Borramos las claves anteriores:

root@servidorvpn:/etc/openvpn/easy-rsa# ./clean-all

Creamos dh:

root@servidorvpn:/etc/openvpn/easy-rsa# ./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
.............
root@servidorvpn:/etc/openvpn/easy-rsa# ./build-ca
Generating a 2048 bit RSA private key
.............
Country Name (2 letter code) [ES]:
State or Province Name (full name) [Sevilla]:
Locality Name (eg, city) [Dos Hermanas]:
Organization Name (eg, company) [IESGN]:
Organizational Unit Name (eg, section) [Informatica]:
Common Name (eg, your name or your server's hostname) [ServidorVPN]:
Name [vpn_key]:
Email Address [juanmanuel.torres@aventurabinaria.es]:

Creación del certificado para el servidor:

root@servidorvpn:/etc/openvpn/easy-rsa# ./build-key-server ServidorVPN
Generating a 2048 bit RSA private key
........+++
.............................................+++
writing new private key to 'ServidorVPN.key'
----
Country Name (2 letter code) [ES]:
State or Province Name (full name) [Sevilla]:
Locality Name (eg, city) [Dos Hermanas]:
Organization Name (eg, company) [IESGN]:
Organizational Unit Name (eg, section) [Informatica]:
Common Name (eg, your name or your server's hostname) [ServidorVPN]:
Name [vpn_key]:
Email Address [juanmanuel.torres@aventurabinaria.es]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:tu_contraseña
An optional company name []:

Creamos el certificado para el cliente:

root@servidorvpn:/etc/openvpn/easy-rsa# ./build-key cliente-vpn
Generating a 2048 bit RSA private key
...............+++
...................................................+++
writing new private key to 'cliente-vpn.key'
-----
Country Name (2 letter code) [ES]:
State or Province Name (full name) [Sevilla]:
Locality Name (eg, city) [Dos Hermanas]:
Organization Name (eg, company) [IESGN]:
Organizational Unit Name (eg, section) [Informatica]:
Common Name (eg, your name or your server's hostname) [cliente-vpn]:
Name [vpn_key]:
Email Address [juanmanuel.torres@aventurabinaria.es]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Las claves se encuentran en la carpeta: /etc/openvpn/easy-rsa/keys/

Configuración del servidor VPN:

Copiamos el paquete de ejemplo de configuración del servidor:

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Configuración del servidor:

nano server.conf
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/ServidorVPN.crt
key /etc/openvpn/easy-rsa/keys/ServidorVPN.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
server 10.88.88.0 255.255.255.0
push "route 10.99.99.0 255.255.255.0"
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 4

Activamos el encaminamiento:

nano /etc/sysctl.conf
net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward

Reiniciamos el servicio:

service openvpn restart
service openvpn status

Configuración del cliente en el servidor:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn

Modificamos:

nano /etc/openvpn/easy-rsa/keys/client.ovpn
remote 10.0.0.33 1194

Tranferimos los certificados al cliente,en mi caso para realizar la prueba lo pasare a otra maquina por scp:

scp /etc/openvpn/easy-rsa/keys/cliente-vpn.key debian@172.33.23.92:/home/debian/openvpn
scp /etc/openvpn/easy-rsa/keys/cliente-vpn.crt debian@172.33.23.92:/home/debian/openvpn
scp /etc/openvpn/easy-rsa/keys/ca.crt debian@172.33.23.92:/home/debian/openvpn
scp /etc/openvpn/easy-rsa/keys/client.ovpn debian@172.33.23.92:/home/debian/openvpn

Configuración del cliente:

Movemos los certificados y la configuración:

sudo mv /home/debian/openvpn/* /etc/openvpn/
sudo mv client.ovpn client.conf

Editamos la configuración del cliente:

nano /etc/openvpn/client.conf
client
dev tun
proto udp
remote 10.0.0.33 1194
keepalive 10 120
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/cliente-vpn.crt
key /etc/openvpn/cliente-vpn.key
#ns-cert-type server
comp-lzo
verb 4
log /var/log/openvpn.log

Quitamos el arranque automatico de OpenVPN:

update-rc.d -f openvpn remove

Reiniciamos el servicio:

service openvpn restart

Comprobamos el funcionamiento del tunel:

root@servidorvpn:/etc/openvpn# ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.99.99.1 P-t-P:10.99.99.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:672 (672.0 B) TX bytes:0 (0.0 B)

root@clientevpn:/etc/openvpn# ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.99.99.6 P-t-P:10.99.99.5 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B) TX bytes:504 (504.0 B)

Añadimos una regla nat al servidor VPN:

iptables -A POSTROUTING -t nat -s 10.88.88.0/24 -o eth0 -j MASQUERADE

Nos conectamos a la maquina de la red interna:

ssh debian@10.99.99.3

Con esto ya tendríamos funcionando nuestra conexión host to network con OpenVPN.