Table of Contents
OpenVPN
Routed VPN
Instalacion y configuracion
Esta configuración nos permite conectividad punto a punto entre los distintos clientes y el servidor VPN
http://openvpn.net/index.php/open-source/documentation/howto.html#quick
1. Instalar el paquete, tanto en el servidor como en todos los clientes.
sudo aptitude install openvpn openssl
2. Creamos el archivo vacío donde se almacenarán los certificados revocados:
sudo touch /etc/openvpn/crl.pem
3. Generate the master Certificate Authority (CA) certificate & key
cd /usr/share/easy-rsa sudo su vim vars
... export KEY_COUNTRY="ES" export KEY_PROVINCE="BC" export KEY_CITY="Barcelona" export KEY_ORG="example.com" export KEY_EMAIL="info@example.com" export KEY_CN=cn export KEY_NAME=name export KEY_OU=IT ...
source ./vars ./clean-all ./build-ca
Error:
grep: /usr/share/easy-rsa/openssl.cnf: No such file or directory pkitool: KEY_CONFIG (set by the ./vars script) is pointing to the wrong version of openssl.cnf: /usr/share/easy-rsa/openssl.cnf The correct version should have a comment that says: easy-rsa version 2.x
Solución:
ln -s openssl-1.0.0.cnf openssl.cnf
Y volver a intentar:
./build-ca
Error:
unable to find 'distinguished_name' in config problems making Certificate Request 1995425184:error:0E06D06A:configuration file routines:NCONF_get_string:no conf or environment variable:../crypto/conf/conf_lib.c:272:
Desconozco el motivo, pero se resuleve editando las lineas en las que se le asigna un valor a la variable “subjectAltName”, en mi caso 2 veces:
vim openssl.cnf
Y cambio los valores:
# anyadido #subjectAltName=$ENV::KEY_ALTNAMES subjectAltName=email:copy
Y volver a intentar:
./build-ca
Ahora a contestar las preguntas y pulsar “enter” al final de cada una:
Country Name (2 letter code) [US]:ES State or Province Name (full name) [BC]: Locality Name (eg, city) [Barcelona]: Organization Name (eg, company) [Contrabanda FM]: Organizational Unit Name (eg, section) [Tècnica]: Common Name (eg, your name or your server's hostname) [ContrabandaFM]: Name [EasyRSA]: Email Address [admin@example.com]:
4. Generar claves del servidor (solo 1 vez)
4.1. Generate certificate & key for server
./build-key-server server
Ahora a contestar las preguntas y pulsar “enter” al final de cada una:
Country Name (2 letter code) [US]:ES State or Province Name (full name) [BC]: Locality Name (eg, city) [Barcelona]: Organization Name (eg, company) [Contrabanda FM]: Organizational Unit Name (eg, section) [Tècnica]: Common Name (eg, your name or your server's hostname) [ContrabandaFM]: Name [EasyRSA]: Email Address [admin@example.com]:
Las contraseñas las dejo en blanco:
A challenge password []: An optional company name []:
Y aquí hay que pulsar “y” más “enter”:
Sign the certificate? [y/n]: 1 out of 1 certificate requests certified, commit? [y/n]
4.2. Generate Diffie Hellman parameters
OJO: puede llevar mucho tiempo, unos 15 minutos:
./build-dh
4.3. Mover llaves (revisar, no estoy seguro de que haya que mover en lugar de copiar nada):
mkdir -p /etc/openvpn/keys/server cp keys/ca.crt /etc/openvpn/keys/server; mv keys/server.* /etc/openvpn/keys/server; mv keys/dh1024.pem /etc/openvpn/keys/server
5. Crear el archivo de configuracion:
cd /usr/share/doc/openvpn/examples/sample-config-files cp server.conf.gz /etc/openvpn/ cd /etc/openvpn/; gzip -d server.conf.gz vim server.conf
Yo lo he dejado asi:
port 443 proto tcp dev tun ca /etc/openvpn/keys/server/ca.crt cert /etc/openvpn/keys/server/server.crt key /etc/openvpn/keys/server/server.key dh /etc/openvpn/keys/server/dh2048.pem server 172.16.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 10.0.0.0 255.255.255.0" push "route 10.7.13.0 255.255.255.0" push "dhcp-option DNS 10.0.0.10" push "dhcp-option DOMAIN local.example.com" client-to-client keepalive 10 120 comp-lzo user nobody group nogroup persist-key persist-tun status openvpn-status.log log /var/log/openvpn.log log-append /var/log/openvpn.log verb 3 crl-verify /etc/openvpn/crl.pem
Hay muchas opciones (“port”, “proto” y “dev” por ejemplo) que tienen que concordar con las que se especifiquen en el archivo de configuracion del cliente.
Generar claves de los clientes
Procedimiento generico
Para cada nuevo cliente se tiene que repetir este proceso completo.
1. Convertirse en root y entrar en el directorio:
sudo su cd /usr/share/easy-rsa
2. Reiniciar vars:
source ./vars
3. Generar certificado y llave para el cliente “cliente1”
./build-key client1
Contestar las preguntas, presionar “enter” para aceptar los valores propuestos:
Country Name (2 letter code) [US]:ES State or Province Name (full name) [BC]: Locality Name (eg, city) [Barcelona]: Organization Name (eg, company) [Contrabanda FM]: Organizational Unit Name (eg, section) [Tècnica]: Common Name (eg, your name or your server's hostname) [client1]: Name [EasyRSA]: Email Address [admin@example.com]:
Las contraseñas las dejo en blanco:
A challenge password []: An optional company name []:
Y aquí hay que pulsar “y” más “enter”:
Sign the certificate? [y/n]: 1 out of 1 certificate requests certified, commit? [y/n]
4. Mover las llaves y copiar la clave publica de la CA a un directorio:
mkdir -p ~/openvpn/client1 user="client1" && cp keys/ca.crt ~/openvpn/$user/ && cp keys/$user.crt keys/$user.key ~/openvpn/$user/
5. Crear el archivo de configuracion del cliente (hay un ejemplo en /usr/share/doc/openvpn/examples/sample-config-files ):
user="client1" && vim ~/openvpn/$user/$user.conf
Con el siguiente contenido:
5.1.1. Si queremos que el cliente OpenVPN tome el servidor DNS del servidor VPN:
client dev tun proto tcp remote vpn.example.com 443 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ca /etc/openvpn/client1/ca.crt cert /etc/openvpn/client1/client1.crt key /etc/openvpn/client1/client1.key ns-cert-type server comp-lzo verb 4 log /var/log/openvpn/client1.log log-append /var/log/openvpn/client1.log # If we want to get DNS server from VPN script-security 2 up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf
En este caso el servidor se llama “vpn.example.com” y escucha en el puerto TCP 443.
5.1.2. Crear el script para tomar el servidor DNS al conectarse al servidor VPN:
vim ~/openvpn/client1/update-resolv-conf
Con el siguiente contenido:
#!/bin/bash # # Parses DHCP options from openvpn to update resolv.conf # To use set as 'up' and 'down' script in your openvpn *.conf: # up /etc/openvpn/update-resolv-conf # down /etc/openvpn/update-resolv-conf # # Used snippets of resolvconf script by Thomas Hood and Chris Hanson. # Licensed under the GNU GPL. See /usr/share/common-licenses/GPL. # # Example envs set from openvpn: # # foreign_option_1='dhcp-option DNS 193.43.27.132' # foreign_option_2='dhcp-option DNS 193.43.27.133' # foreign_option_3='dhcp-option DOMAIN be.bnc.ch' # [ -x /sbin/resolvconf ] || exit 0 [ "$script_type" ] || exit 0 [ "$dev" ] || exit 0 split_into_parts() { part1="$1" part2="$2" part3="$3" } case "$script_type" in up) NMSRVRS="" SRCHS="" for optionvarname in ${!foreign_option_*} ; do option="${!optionvarname}" echo "$option" split_into_parts $option if [ "$part1" = "dhcp-option" ] ; then if [ "$part2" = "DNS" ] ; then NMSRVRS="${NMSRVRS:+$NMSRVRS }$part3" elif [ "$part2" = "DOMAIN" ] ; then SRCHS="${SRCHS:+$SRCHS }$part3" fi fi done R="" [ "$SRCHS" ] && R="search $SRCHS " for NS in $NMSRVRS ; do R="${R}nameserver $NS " done echo -n "$R" | /sbin/resolvconf -a "${dev}.openvpn" ;; down) /sbin/resolvconf -d "${dev}.openvpn" ;; esac
5.1.1. Si NO queremos que el cliente OpenVPN tome el servidor DNS del servidor VPN:
client dev tun proto tcp remote vpn.example.com 443 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ca /etc/openvpn/client1/ca.crt cert /etc/openvpn/client1/client1.crt key /etc/openvpn/client1/client1.key ns-cert-type server comp-lzo verb 4 log /var/log/openvpn/client1.log log-append /var/log/openvpn/client1.log
En este caso el servidor se llama “vpn.example.com” y escucha en el puerto TCP 443.
6. Empaquetar todos los archivos para poder transferirlos comodamente al cliente:
cd ~/openvpn/client1 tar cvfj ~/openvpn/client1.tar.bz2 *
7. Copiar del servidor al cliente el archivo comprimido y luego eliminarlo:
scp ~/openvpn/client1.tar.bz2 user@client1.example.com:/tmp/ rm -fr ~/openvpn
8. (Maquina cliente) Asumo que ya esta instalado el paquete “openvpn”. Descomprimir archivos, moverlos y darles permisos
sudo mv /tmp/client1.tar.bz2 /etc/openvpn sudo tar xvfj client1.tar.bz2 sudo chown root:root client1* sudo chmod 0700 client1 sudo chmod 0600 client1/*
Si optamos por tomar las DNS del servidor VPN:
sudo chmod 0700 update-resolv-conf
9. Starting up the VPN and testing for initial connectivity
9.1 (Opcional) Abrir el puerto y protocolo definido en el archivo de configuración en el firewall (UDP 1194 por defecto)
9.2 (Opcional) Si se quiere que los clientes puedan acceder además de al servidor VPN a otras máquinas que estén en la red privada (LAN) de éste, y si el gateway de esa LAN NO es el servidor VPN, en el servidor VPN hay que activar masquerade.
9.3 Arrancar (mismo comando en el servidor y en todos los clientes):
sudo service openvpn start
Migracion a openvpn >=2.3
IMPORTANTE: realizar los siguientes pasos UNA sola vez, en caso de migrar a openvpn >=2.3
0. Instalar paquete, ahora ya NO es parte de openvpn
sudo aptitude install easy-rsa
1. IMPORTANTE: mover certificados de la CA, lista de revocados, etc… a nueva ubicacion:
cd /usr/share/easy-rs mv keys keys.old sudo mv /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/ /usr/share/easy-rsa
Acceso desde el cliente a la LAN del servidor VPN (gateway de la LAN y servidor VPN son distintos)
Queremos que desde el cliente se llegue no solo al servidor VPN, sino también a la LAN de ese servidor. La particularidad es que el servidor VPN es una máquina virtual detrás de un Hipervisor KVM. Además el Hipervisor KVM está detrás de un router ADSL casero en modo DMZ, de forma que TODO el tráfico lo redirige hacia el Hipervisor.
Resumen:
Máquina | Interfaz | IP | Comentario |
---|---|---|---|
Cliente | wlan0 | 192.168.1.100 | LAN doméstica. Se conecta al router que le da salida a internet |
Cliente | tun0 | 172.16.0.6 | Red VPN |
Servidor VPN | eth0 | 10.0.0.11 | LAN corporativa (VM de KVM) |
Servidor VPN | tun0 | 172.16.0.1 | Red VPN |
Hipervisor KVM | p5p1 | 192.168.1.4 | LAN que se conecta al router que le da salida a internet |
Hipervisor KVM | virbr0 | 10.0.0.1 | LAN corporativa (Hipervisor de KVM) |
Servidor destino | eth0 | 10.0.0.12 | LAN corporativa (VM de KVM) |
El objetivo es conectarse de la siguiente manera:
[Cliente] → [Hipervisor KVM] → [Servidor VPN] → [Servidor destino]
1. (Servidor VPN) Anunciar a los clientes la ruta a la que se pueden conectar, y si es menester, reiniciar el servicio VPN:
sudo vim /etc/openvpn/server.conf
... push "route 10.0.0.0 255.255.255.0" ...
sudo /etc/init.d/openvpn restart
2. (Servidor VPN) Crear el guión para el enrutado de tráfico y hacer que se ejecute al arrancar el servidor:
vim /home/ubuntu/firewall_on.sh
#!/bin/bash IPTABLES=/sbin/iptables # Borrado de reglas de iptables $IPTABLES -P INPUT ACCEPT $IPTABLES -F INPUT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -F OUTPUT $IPTABLES -P FORWARD ACCEPT $IPTABLES -F FORWARD $IPTABLES -t nat -F $IPTABLES -t filter -F $IPTABLES -t mangle -F # Interfaces LAN_IF="eth0" VPN_IF="tun0" LO_IF="lo" #CRÍTICO: habilitar redirección IPv4, deshabilitado por defecto echo "1" > /proc/sys/net/ipv4/ip_forward $IPTABLES -t nat -A POSTROUTING -o $LAN_IF -j MASQUERADE
chmod +x /home/ubuntu/firewall_on.sh cd /etc/init.d sudo ln -s /home/ubuntu/firewall_on.sh sudo update-rc.d firewall_on.sh defaults
3. (Hipervisor KVM) Crear el guión para el enrutado de tráfico y hacer que se ejecute al arrancar el servidor:
vim /home/ubuntu/firewall_on.sh
#!/bin/bash IPTABLES=/sbin/iptables # Borrado de reglas de iptables $IPTABLES -P INPUT ACCEPT $IPTABLES -F INPUT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -F OUTPUT $IPTABLES -P FORWARD ACCEPT $IPTABLES -F FORWARD $IPTABLES -t nat -F $IPTABLES -t filter -F $IPTABLES -t mangle -F # Interfaces VIRT_IF="virbr0" EXT_IF="p5p1" LO_IF="lo" KVM_LAN_IP="192.168.1.4" VM="10.0.0.0/24" KVM_VM_IP="10.0.0.1" # VPN VPN_VM="10.0.0.11" VPN_NET="172.16.0.0/24" VPN_PROTOCOL="udp" VPN_PORT="1193" # KVM $IPTABLES -A INPUT -i $VIRT_IF -p udp -m udp --dport 53 -j ACCEPT $IPTABLES -A INPUT -i $VIRT_IF -p tcp -m tcp --dport 53 -j ACCEPT $IPTABLES -A INPUT -i $VIRT_IF -p udp -m udp --dport 67 -j ACCEPT $IPTABLES -A INPUT -i $VIRT_IF -p tcp -m tcp --dport 67 -j ACCEPT $IPTABLES -A FORWARD -d $VM -o $VIRT_IF -m state --state RELATED,ESTABLISHED -j ACCEPT $IPTABLES -t nat -A POSTROUTING -s $VM ! -d $VM -p tcp -j MASQUERADE --to-ports 1024-65535 $IPTABLES -t nat -A POSTROUTING -s $VM ! -d $VM -p udp -j MASQUERADE --to-ports 1024-65535 $IPTABLES -t nat -A POSTROUTING -s $VM ! -d $VM -j MASQUERADE # Forward traffic between VM's $IPTABLES -A FORWARD -i $VIRT_IF -o $VIRT_IF -s $VM -d $VM -j ACCEPT # Allow loop interface traffic $IPTABLES -A INPUT -i $LO_IF -j ACCEPT # ESTABLISHED $IPTABLES -A INPUT -d $KVM_LAN_IP -i $EXT_IF -m state --state RELATED,ESTABLISHED -j ACCEPT # VPN (OpenVPN) $IPTABLES -A INPUT -i $EXT_IF -d $KVM_LAN_IP -p $VPN_PROTOCOL --dport $VPN_PORT -j ACCEPT $IPTABLES -t nat -I PREROUTING -i $EXT_IF -p $VPN_PROTOCOL --dport $VPN_PORT -s $ANY -d $KVM_LAN_IP -j DNAT --to-destination $VPN_VM $IPTABLES -A FORWARD -i $EXT_IF -o $VIRT_IF -d $VPN_VM -p $VPN_PROTOCOL --dport $VPN_PORT -j ACCEPT $IPTABLES -A FORWARD -i $VIRT_IF -o $EXT_IF -s $VPN_VM -p $VPN_PROTOCOL --sport $VPN_PORT -j ACCEPT # VPN access to server's private LAN $IPTABLES -A FORWARD -i $VIRT_IF -o $VIRT_IF -s $VM -d $VPN_NET -j ACCEPT $IPTABLES -A FORWARD -i $VIRT_IF -o $VIRT_IF -s $VPN_NET -d $VM -j ACCEPT $IPTABLES -A FORWARD -i $VIRT_IF -o $EXT_IF -s $VM -d $VPN_NET -j ACCEPT
chmod +x /home/ubuntu/firewall_on.sh cd /etc/init.d sudo ln -s /home/ubuntu/firewall_on.sh sudo update-rc.d firewall_on.sh defaults
4. (Cliente) Reiniciar el cliente VPN y probar conectividad:
sudo /etc/init.d/openvpn restart ping 10.0.0.12
Configurar DNS en el cliente
Para que el cliente reciba del servidor VPN parámetros como servidor DNS o Dominio de búsqueda necesitamos configuración tanto en el servidor como en el cliente, y un script en el lado cliente. Si la máquina es Windows el script no es necesario.
Variables:
10.0.0.10 | Dirección Ip del servidor DNS |
local.jamgo.org | Sufijo de búsqueda DNS |
1. (Servidor) Editar:
sudo vim /etc/openvpn/server.conf
Y asegurarse que las siguientes lineas están presentes:
... push "dhcp-option DNS 10.0.0.10" push "dhcp-option DOMAIN local.jamgo.org" ...
2. (Servidor) Reiniciar el servicio OpenVPN:
sudo /etc/init.d/openvpn restart
3. (Cliente) Instalar el siguiente paquete:
sudo aptitude install resolvconf
4. (Cliente) Asegurarse que tenemos el siguiente archivo (viene con el paquete “openvpn”) y que es ejecutable:
/etc/openvpn/update-resolv-conf
Con el siguiente contenido:
#!/bin/bash # # Parses DHCP options from openvpn to update resolv.conf # To use set as 'up' and 'down' script in your openvpn *.conf: # up /etc/openvpn/update-resolv-conf # down /etc/openvpn/update-resolv-conf # # Used snippets of resolvconf script by Thomas Hood <jdthood@yahoo.co.uk> # and Chris Hanson # Licensed under the GNU GPL. See /usr/share/common-licenses/GPL. # # 05/2006 chlauber@bnc.ch # # Example envs set from openvpn: # foreign_option_1='dhcp-option DNS 193.43.27.132' # foreign_option_2='dhcp-option DNS 193.43.27.133' # foreign_option_3='dhcp-option DOMAIN be.bnc.ch' [ -x /sbin/resolvconf ] || exit 0 case $script_type in up) for optionname in ${!foreign_option_*} ; do option="${!optionname}" echo $option part1=$(echo "$option" | cut -d " " -f 1) if [ "$part1" == "dhcp-option" ] ; then part2=$(echo "$option" | cut -d " " -f 2) part3=$(echo "$option" | cut -d " " -f 3) if [ "$part2" == "DNS" ] ; then IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3" fi if [ "$part2" == "DOMAIN" ] ; then IF_DNS_SEARCH="$IF_DNS_SEARCH $part3" fi fi done R="" for SS in $IF_DNS_SEARCH ; do R="${R}search $SS " done for NS in $IF_DNS_NAMESERVERS ; do R="${R}nameserver $NS " done echo -n "$R" | /sbin/resolvconf -a "${dev}.inet" ;; down) /sbin/resolvconf -d "${dev}.inet" ;; esac
5. (Cliente) Editar:
sudo vim /etc/openvpn/cliente.conf
Y asegurarse que las siguientes lineas están presentes:
... script-security 2 up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf ...
6. (Cliente) Reiniciar el servicio OpenVPN:
sudo /etc/init.d/openvpn restart
7. (Cliente) Comprobar los cambios:
cat /etc/resolv.conf
Debería aparecer la configuración especificada en el paso 1):
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 10.0.0.10 search local.jamgo.org
Revocar certificados
http://openvpn.net/index.php/open-source/documentation/howto.html#revoke
1. Comprobar que el certificado a revocar (“usuario.cert” en este ejemplo) se encuentra en el siguiente directorio:
/usr/share/doc/openvpn/examples/easy-rsa/2.0/keys
2. Revocarlo
sudo su cd /usr/share/doc/openvpn/examples/easy-rsa/2.0 . ./vars ./revoke-full usuario
Salida esperada:
Using configuration from /root/openvpn/20/openvpn/tmp/easy-rsa/openssl.cnf DEBUG[load_index]: unique_subject = "yes" Revoking Certificate 04. Data Base Updated Using configuration from /root/openvpn/20/openvpn/tmp/easy-rsa/openssl.cnf DEBUG[load_index]: unique_subject = "yes" client2.crt: /C=KG/ST=NA/O=OpenVPN-TEST/CN=client2/emailAddress=me@myhost.mydomain error 23 at 0 depth lookup:certificate revoked
El “error 23” al final es normal
3. Actualizar la lista de certificads revocados (se encuentra en la ruta especificada en el parámetro “crl-verify” del archivo de configuración del servidor):
cat /usr/share/doc/openvpn/examples/easy-rsa/2.0/keys/crl.pem » /etc/openvpn/crl.pem
4. Supongo que tiene sentido reiniciar/recargar openvpn:
sudo /etc/init.d/openvpn reload
5. La siguiente vez que se intente conectar el usuario “usuario” no podrá hacerlo, y aparecerán las siguientes entradas en los logs:
Cliente
Fri Apr 5 19:27:06 2013 Connection reset, restarting [0] Fri Apr 5 19:27:06 2013 TCP/UDP: Closing socket Fri Apr 5 19:27:06 2013 SIGUSR1[soft,connection-reset] received, process restarting Fri Apr 5 19:27:06 2013 Restart pause, 5 second(s)
Servidor
Fri Apr 5 19:01:02 2013 31.4.107.170:35244 CRL CHECK FAILED: /C=ES/ST=BC/L=Barcelona/O=Jamgo/OU=IT/CN=toberevoked/name=To_Be_Revoked/emailAddress=toberevoked@jamgo.es is REVOKED
Receta 2 (parcialmente incompleta)
Instalar OPENVPN
# apt-get install openvpn
Crear certificados
Generar la CA para firmar los certificados
Copiamos el directorio de ejemplo en la carpeta de configuración de OpenVPN:
#/usr/share/doc/openvpn/examples# cp -R easy-rsa/ /etc/openvpn/
Editamos:
donquixot:/etc/openvpn/easy-rsa/2.0# vi vars
export KEY_COUNTRY="ES" export KEY_PROVINCE="BC" export KEY_CITY="Mataro" export KEY_ORG="Lobo99" export KEY_EMAIL="jose@lobo99.com"
donquixot:/etc/openvpn/easy-rsa/2.0# source ./vars donquixot:/etc/openvpn/easy-rsa/2.0# ./clean-all donquixot:/etc/openvpn/easy-rsa/2.0# ./build-ca
Generating a 1024 bit RSA private key
.........................++++++ ................++++++ writing new private key to 'ca.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) [BC]:Barcelona Locality Name (eg, city) [Mataro]: Organization Name (eg, company) [Lobo99]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) [Lobo99 CA]:lobo99.com Name []: Email Address [jose@lobo99.com]:
Esto genera la CA:
donquixot:/etc/openvpn/easy-rsa/2.0/keys# ls -la total 6 drwx------ 2 root root 1024 Nov 6 21:21 . drwxr-xr-x 3 root root 1024 Nov 6 21:20 .. -rw-r--r-- 1 root root 1204 Nov 6 21:21 ca.crt -rw------- 1 root root 887 Nov 6 21:21 ca.key -rw-r--r-- 1 root root 0 Nov 6 21:20 index.txt -rw-r--r-- 1 root root 3 Nov 6 21:20 serial
Creación de Certificado y llaves para Servidor
donquixot:/etc/openvpn/easy-rsa/2.0# ./build-key-server server
Generating a 1024 bit RSA private key .................++++++ ............................++++++ writing new private key to 'server.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) [BC]:Barcelona Locality Name (eg, city) [Mataro]: Organization Name (eg, company) [Lobo99]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) [server]:lobo99.com Name []: Email Address [jose@lobo99.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:OpenVpn lobo99.com An optional company name []: Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'ES' stateOrProvinceName :PRINTABLE:'Barcelona' localityName :PRINTABLE:'Mataro' organizationName :PRINTABLE:'Lobo99' commonName :PRINTABLE:'lobo99.com' emailAddress :IA5STRING:'jose@lobo99.com' Certificate is to be certified until Nov 3 20:25:25 2021 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
Generar Certificado para los clientes
./build-key client1 ./build-key client2
donquixot:/etc/openvpn/easy-rsa/2.0# ./build-key jose Generating a 1024 bit RSA private key ...............................++++++ ........++++++ writing new private key to 'jose.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) [BC]:Barcelona Locality Name (eg, city) [Mataro]: Organization Name (eg, company) [Lobo99]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) [jose]: Name []:Jose Email Address [jose@lobo99.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:mysecretpassword An optional company name []: Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'ES' stateOrProvinceName :PRINTABLE:'Barcelona' localityName :PRINTABLE:'Mataro' organizationName :PRINTABLE:'Lobo99' commonName :PRINTABLE:'jose' name :PRINTABLE:'Jose' emailAddress :IA5STRING:'jose@lobo99.com' Certificate is to be certified until Nov 3 20:30:04 2021 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
Generate Diffie Hellman parameters
Diffie Hellman parameters must be generated for the OpenVPN server. On Linux/BSD/Unix:
./build-dh
Ficheros de configuración
donquixot:/etc/openvpn# cp -R /usr/share/doc/openvpn/examples/sample-config-files/ config-files
Habilitar para máquinas virtuales contenedores openvz
vzctl set 101 --devnodes net/tun:rw --save
Fuente: http://wiki.openvz.org/VPN_via_the_TUN/TAP_device
Copiamos ficheros de certificados:
cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/
Habilitar IP fordwarding en el servidor:
# echo 1 > /proc/sys/net/ipv4/ip_forward
En el fichero de configuración del servidor, modificamos las siguientes opciones básicas:
server.conf
port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key # This file should be kept secret dh dh1024.pem server 10.8.0.0 255.255.255.0 push "route 192.168.1.0 255.255.255.0" push "route 10.139.0.0 255.255.0.0"
El servidor se arranca con:
# openvpn server.conf
En la parte del cliente, pasamos los ficheros de certificados y el de configuración client.conf
El cliente se conecta con:
# openvpn clien.conf
Para acceder a las subredes, está tiene que enrutar hacía la subred del vpn, en este caso la 10.8.0.0
He añadido la ruta 10.8.0.0 a la miktorik y un nat para que vuelva:
ip > firewall
General Chain: srcnat Src.Address: 10.8.0.0/24
Action Action: src-nat To Addresses: 10.139.56.129
Y la ruta 10.8.0.0/24 → 10.139.67.103 (ip del servidor vpn)
Autenticación LDAP
/etc/openvpn/auth/auth-ldap.conf
URL ldaps://ldap.guifi.net/ <Authorization> # Base DN BaseDN "dc=guifi,dc=net" # User Search Filter SearchFilter "(&(uid=%u)(accountStatus=active))" # Require Group Membership RequireGroup false # Add non-group members to a PF table (disabled) #PFTable ips_vpn_users <Group> BaseDN "o=proxyusers,dc=guifi,dc=net" SearchFilter "(|(cn=developers)(cn=artists))" MemberAttribute uniqueMember # Add group members to a PF table (disabled) #PFTable ips_vpn_eng </Group> </Authorization>
IPs estáticas
http://dnaeon.github.io/static-ip-addresses-in-openvpn/
1. Una sola vez
1.1. Crear directorios y archivos:
sudo mkdir /etc/openvpn/ccd sudo touch /etc/openvpn/ipp.txt
1.2. Editar arhcivo de configuración del servidor VPN:
sudo vim /etc/openvpn/server.conf
Y añadir las lineas:
client-config-dir /etc/openvpn/ccd ifconfig-pool-persist /etc/openvpn/ipp.txt
1.3. Reiniciar el servicio:
sudo service openvpn restart
2. Para cada cliente
2.1. Crear un archivo con el nombre del certificado que se ha creado:
sudo vim /etc/openvpn/ccd/client1
Y especificar tanto la IP como la IP del servidor VPN:
ifconfig-push 172.16.0.50 172.16.0.1
2.2. Reservar esa IP para ese certificado, para no asignársela a otro cliente:
client1,172.16.0.50
2.3. (Cliente) Reiniciar el servicio VPN:
sudo service openvpn restart
2.4. (Cliente) Comprobar que la IP es la especificada en los pasos 2.1. y 2.2:
sudo ifconfig