Como de openVpn en linux

+1
0
-1

Mini cómo de openvpn en debian sarge

El objetivo de este mini manual de openvpn son varios:

a)Comunicar 2 redes alejadas para compartir datos
b)Reducir costes de adsl
c)Proteger los datos que van a circular por esta red virtual, ya que la encriptacion wep no es del todo segura.

Podemos dar varios niveles de seguridad a nuestra vpn ,todo depende de lo importante que sean los datos para nosotros,pero nos hemos decantado por el uso de certificaciones comerciales de opevpn.

Empezemos a luchar como los hombres.

1)Instalacion del paquete openvpn
Tan sencillo como apt-get install openvpn , lo hemos de instalar tanto el cliente como en el servidor.

Debemos asegurarnos que tenemos el controlador tun/tap instalado en el kernel,aunque si tenemos un kernel 2,4,27 o superior, casi seguro que lo tenemos, pero vamos a comprobar si estamos en lo cierto con el comando modprobe -l | grep ' tun/tap' o con lsmod .

2)Fichero de configuracion del servidor
Está en /etc/openvpn y lo hemos llamado tunel.conf y es asi:

Vim /etc/openvpn/tunel.conf
status openvpn-status.log
log openvpn.log
verb 6
server 10.0.0.0 255.255.255.0 “esta es la red de ip`s virtuales”
ifconfig-pool-persist ipp.txt
dh /etc/openvpn/dh1024.pem
client-config-dir /etc/openvpn/cld
ca /etc/openvpn/keys/mi-ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dev tun
comp-lzo
port 50000
ifconfig 10.0.0.10 10.0.0.83
route 192.168.121.0 255.255.255.0 “red del servidor”
push "route 192.168.120.0 255.255.255.0" “red del cliente”

2.1)Instalacion de openssl para generar certificados.
apt-get install openssl

Nuestro fichero quedo de la siguiente manera:

HOME = .
RANDFILE = $ENV::HOME/.rnd

oid_section = new_oids

####################################################################
[ ca ]
default_ca = CA_default # The default ca section

####################################################################
[ CA_default ]

dir = ./demoCA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.

new_certs_dir = $dir/newcerts # default place for new certs.

certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number

crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key
RANDFILE = $dir/private/.rand # private random number file

x509_extensions = usr_cert # The extentions to add to the cert

name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options

default_days = 3650 # duracion para 10 años
default_crl_days= 30 # how long before next CRL
default_md = md5 # which md to use.
preserve = no # keep passed DN ordering

# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

####################################################################
[ req ]
default_bits = 1024
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert

string_mask = nombstr

[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = ES #pais
countryName_min = 2
countryName_max = 2

stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = LasPalmas #Provincia

localityName = Locality Name (eg, city)
localityName_default = GALDAR #Localidad

0.organizationName = Organization Name (eg, company)
0.organizationName_default = Excmo. Ayuntamiento de Gáldar #nombre de tu organizacion

organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default = Dpto. NNTT #nombre de la unidad organizativa

commonName = Common Name (eg, YOUR name)
commonName_max = 64

emailAddress = Email Address
emailAddress_max = 64
emailAddress_default = tu email

[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20

unstructuredName = An optional company name

[ usr_cert ]

basicConstraints=CA:FALSE

# This is OK for an SSL server.
# nsCertType = server

nsComment = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always

[ v3_req ]

# Extensions to add to a certificate request

basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]

# Extensions for a typical CA

# PKIX recommendation.

subjectKeyIdentifier=hash

authorityKeyIdentifier=keyid:always,issuer:always

basicConstraints = CA:true

[ crl_ext ]

authorityKeyIdentifier=keyid:always,issuer:always

Con esto ya rularia el fichero de coonfiguracion

Bien, ahora con un super script que se curro Eduardo vamos a generar todos los certificados.

#!/bin/sh

# Pa' asegurarnos que partimos de un directorio "Limpio"
d=./keys
if test $d; then
rm -rf $d
fi
mkdir $d
chmod go-rwx $d
touch $d/index.txt
echo "01" > $d/serial

# Generar Certificado de Entidad Certificadora (CA)
openssl req -nodes -new -x509 -keyout mi-ca.key -out mi-ca.crt -days 3650
echo "Generado Certificado (CA)"
chmod 0600 mi-ca.key

# Generar Certificado del Servidor (server)
echo "A Generar Certificado del Servidor"
openssl req -nodes -new -keyout server.key -out server.csr
echo "Certificado del Servidor generado"
chmod 0600 server.key

# Firmar Certificado del Servidor
echo "Firmando el Certificado del Servidor"
openssl ca -out server.crt -in server.csr -outdir $d -cert mi-ca.crt -keyfile mi-ca.key -config mi-openssl.cnf

# Generar Certificado del primer cliente (client1)
echo "A Generar certificado del primer cliente"
openssl req -nodes -new -keyout client.key -out client.csr
echo "Certificado del Primer Cliente generado"
chmod 0600 client.key

# Firmar Certificado del primer cliente
echo "Firmando el Certificado del Primer Cliente"
openssl ca -out client.crt -in client.csr -outdir $d -cert mi-ca.crt -keyfile mi-ca.key -config mi-openssl.cnf

# Er' fichero Diffie Hellman
echo "Creando fichero Diffie Hellman"
openssl dhparam -out dh1024.pem 1024
echo "Fichero DH Generado."
chmod 0600 dh1024.pem

# Coloca los ficheros dentro del directorio $d
echo "Reubicando los archivos en $d"
mv mi-ca.* $d
mv server.* $d
mv client.* $d
mv dh1024.* $d

y con esto ya tenemos todos los certificados hechos, tanto para el cliente como para el servidor.

3)El cliente.

Hemos de instalar como dije antes el paquete openvpn y tambien el paquete openssl.

El fichero de configuracion del cliente tambien se llamara tunel.conf y su localizacion es la misma que la del servidor.

Vim /etc/openvpn/tunel.conf
client
remote 192.168.111.2”ip publica del server”
ca /etc/openvpn/keys/mi-ca.crt
cert /etc/openvpn/keys/client.crt
key /etc/openvpn/keys/client.key
dev tun
comp-lzo
user nobody
group nogroup
port 50000

Por ultimo y para terminar lo que es la parte de configuracion hemos de copiar en el directorio /etc/openvpn/keys/ del cliente los certificados generados anterior mente con el script de Eduardo, concretamente hemos de pasarle los siguientes:

mi-ca.crt, client.key y el client.crt

Bueno ahora solo nos queda arrancar la vpn a ver si rula, pero si queremos que se arranque siempre que encendamos la maquina vamos a hacer un pequeño script , que pondremos en el arranque.

ArrancandoVpn.sh
#!/bin/sh

openvpn –daemon –verb 0 –config
/etc/openvpn/tunel.conf

#fin del script

Ahora le damos permisos de ejecucion chmod 755 ArrancandoVpn.sh y lo metemos en el arranque con update-rc.d ArrancandoVpn.sh defaults ,esto lo que hara sera ponerlo en cada uno de los rc´s.

Bien solo nos queda arrancar la vpn y lo podemos hacer de dos formas:

a)openvpn –verb 6 –config /etc/openvpn/tunel.conf
b)/etc/init.d/openvpn restart.

Comentarios

Imagen de Anónimo

Hola .. gracias por la info porque esta super buena pero tengo una duda.. no pude generar los certificados porque manda un error el script... ¿estas seguro que no falta nada que hacer con el script?
como dije antes gracias esta super entendible pero el script watea

Imagen de marox

Nosotros cuando lo hicimos funciono y de momento la vpn no da fallos, quiza puede ser algun cambio en la distribucion, ya que se hizo en una debian sarge, si ,ubuntu esta basado en sarge , pero creo que puede ser por eso, aun que te recomiendo que compruebes bien si tu script es igual al original.
Un saludo desde Las Palmas.

Imagen de Anónimo

me puedes explicar más sobre el esquemático o estructura de las redes que están conectando me quedo pegado con las redes del server y esas cosas

gracias

Atte
Antonio

Imagen de Anónimo

y es por la sintaxis del OpenSSL
openssl ca -out server.crt -in server.csr -outdir $d -cert mi-ca.crt -keyfile mi-ca.key
es sin esta funcion (-config mi-openssl.cnf)

Pero antes... hay que medificar el script...openssl.cnf
Salen errores por los directorios, por ejemplo ./demoCA, cambialo por uno que deseas, en caso de que no tengas el directorio ./demoCA. y los demas. Tambien donde busca el archivo index.txt.

Tambie sale otro error, al momento que busca el archivo index.txt.
En el script de eduardo hay que modificar despues del touch index.txt
que gaga una copia al directorio.

Es solo seguir los errores que da, pero si la rayada que me meti para descifrar el error (-config mi-openssl.cnf) no es aceptada por el open SSL, la momento de instalar el openSSL se debe dar ese parametro a donde va a alojar el archivo .cnf y listo.

Algo didactico sobre openSSL que ncontre para Uds...
http://proyectos.gpul.org/charlas/criptografia2004/chuleta_openssl.pdf

Bueno yho me tuve que ir a los libros, pero con ese PDF se guiaran sobre la sintaxis de OpenSSL.

Bueno espero les vaya bien con este tema... Interesante pero debemos de procurarque funcione al menos en otras distribuciones, ya por mi parte las probé en BSD, RHEL...

Imagen de Anónimo

Gracias por tu how-to, esta buenísimo, he hecho algunas pruebas en una red local, y te quería pedir ayuda con un error que tengo. En ambos extremos tengo configurado usar para recibir y enviar el puerto 600, con Tcp-server y tcp-client en el servidor y el cliente, respectivamente , pero al usar Ethereal o ver el achivo de configuración veo que solo un extremo usa el puerto 600 y el otro usa el puerto 32960

Fri Oct 21 13:14:02 2005 us=366189 Listening for incoming TCP connection on 200. 1.17.160:600
Fri Oct 21 13:14:06 2005 us=706316 TCP connection established with 200.1.17.165: 32960
Fri Oct 21 13:14:06 2005 us=706466 Socket Buffers: R=[87380->131072] S=[16384->1 31072]
Fri Oct 21 13:14:06 2005 us=706553 TCPv4_SERVER link local (bound): 200.1.17.160 :600
Fri Oct 21 13:14:06 2005 us=706615 TCPv4_SERVER link remote: 200.1.17.165:32960
RFri Oct 21 13:14:06 2005 us=733815 Peer Connection Initiated with 200.1.17.165: 32960

Por favor, si me pueden ayudar ,

saludos

CArlos

Imagen de Anónimo

Tengo una pequeña duda . . .
al generar una llave estatica precompartida en openvpn por defecto la crea de 2048 bits, si quiero reducirla digito el siguiente comando
openvpn --genkey --keysize 64 --secret static.key
pero no me funciona igual la sigue generando de 2048. Que estoy haciendo mal ???

Imagen de Anónimo

Instalo y configuro OPENVPN2 Lan_to_Lan. Genero las llave y los certificados son ningun problema.
Establesco el tunel perfectamente entre dos PC linux(Suse10) y puedo ver(Haciendo ping) desde el Pc_ClienteVPN hacia el Server_VPN y su respectiva Lan_1, pero desde el Server_VPN hacia el Pc_ClienteVPN y su respectiva Lan_2 no me da respuesta el ping.
La idea es que puedan verse las dos LANs.
He revisado las rutas en ambos Linux y realizado pruebas pero no he logrado solucionar este problema.
Harold
hajiva@hotmail.com