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.