Configuración de una VPN entre un cliente MS Windows y servidor GNU/Linux

Autor: Sergio González González

Resumen

Documento explicativo sobre como configurar una red privada virtual entre una red empresarial, cuyo punto de salida hacia Internet es una máquina con GNU/Linux, y un sistema MS Windows XP (bien sea un ordenador portátil o un PC).


Tabla de contenidos

1. Introducción
2. Software necesario
3. Instalación de FreeS/WAN y los parches X.509
3.1. Obtención del código fuente de las aplicaciones
3.2. Comprobación de la firma y md5 de los programas
3.3. Descompresión y desempaquetado del software
3.4. Aplicando los parches X.509 a FreeS/WAN
3.5. Compilando e instalando FreeS/WAN
4. Creación de una entidad certificadora
5. Generación de los certificados
6. Instalación del certificado en el gateway
7. Configuración de FreeS/WAN en la máquina gateway
7.1. Configuración de ipsec.secrets
7.2. Configuración de ipsec.conf
7.3. Arrancando IPSec
8. Configuración de iptables en el gateway
9. Configuración del cliente Windows XP
9.1. Crear el certificado para la máquina MS Windows
9.2. Obtener el certificado en formato .p12
9.3. Copiar el certificado a MS Windows
9.4. Aplicación ipsec.exe de Marcus Müller
9.5. IPSec y certificados MMC
9.6. Añadir el certificado
9.7. Configuración de la herramienta IPSec
9.8. Arrancando el enlace
10. Licencia de este documento
Bibliografía

1. Introducción

A lo largo del presente documento explicaré la forma de configurar una máquina GNU/Linux para que actue como gateway de una empresa y permita la conexión de un cliente MS Windows XP (este puede ser un portátil o un PC) mediante una red privada virtual (VPN) a la red empresarial.

El esquema de red se muestra en la siguiente imagen[1]:

Esquema de la red a configurar

La tecnología elegida para la configuración de la red privada virtual es IPSec. La implementación elegida para dar soporte IPSec en GNU/Linux ha sido FreeS/WAN y los Parches X.509 para permitir una autentifiación segura. En MS Windows XP se utilizará la implementación IPSec del propio sistema operativo y la herramienta VPN de Marcus Müller.

[Note]Nota

Para la realización de este documento se ha tomado como guia principal la entrada bibliográfica: “NateCarlson1

2. Software necesario

Para poner en funcionamiento nuestra red privada virtual, necesitamos el siguiente software:

3. Instalación de FreeS/WAN y los parches X.509

Los parches X.509 son necesarios para permitir a FreeS/WAN trabajar con un cliente Windows 2000/XP nativo.

Antes de instalar el paquete FreeS/WAN, es necesario aplicar los parches X.509 al código fuente de FreeS/WAN. La forma de hacerlo se puede obtener de los propios paquetes de X.509 o de la entrada bibliográfica: AndreasSteffen1 (Puntos 1 a 4 de la 'Section 3: Installation').

De todas formas, en las siguientes secciones veremos la forma de instalar el software necesario a partir del código fuente de las apliaciones:

[Note]Nota

Para el proceso de instalación de FreeS/WAN y de la aplicación de los Parches X.509 se han tomado como guias las entradas bibliográficas: DocFreeS/WAN y AndreasSteffen1, respectivamente.

3.1. Obtención del código fuente de las aplicaciones

Baje el código fuente de la página principal de FreeS/WAN y de los Parches X.509.

3.2. Comprobación de la firma y md5 de los programas

Una vez tenemos el software almacenado en nuestro ordenador, verificamos la procedencia del mismo y si se ha bajado correctamente, para ello es necesario obtener las claves públicas de los respectivos mantenedores de los paquetes. El archivo que contiene la clave pública de FreeS/WAN se denomina freeswan-sigkey.asc y el de los Parches X.509 andreas_steffen.asc.

Importamos dichas claves a nuestro anillo de claves:

$ gpg --import freeswan-sigkey.asc
gpg: clave 46EAFCE1: clave pública "Linux FreeS/WAN Software Team <build@freeswan.org>" importada
gpg: Cantidad total procesada: 1
gpg:               importadas: 1  (RSA: 1)
$ gpg --import andreas_steffen.asc
gpg: clave 40995359: clave pública "Andreas Steffen <andreas.steffen@strongsec.net>" importada
gpg: Cantidad total procesada: 1
gpg:               importadas: 1  (RSA: 1)

Antes de verificar la firma, comprobamos que el md5 está correcto:

$ md5sum -cv freeswan-2.04.tar.gz.md5
freeswan-2.04.tar.gz Correcto
$ md5sum -cv x509-1.4.8-freeswan-2.04.tar.gz.md5
x509-1.4.8-freeswan-2.04.tar.gz Correcto

Verificamos la firma del código fuente:

$ gpg --verify freeswan-2.04.k2.4.patch.gz.sig freeswan-2.04.k2.4.patch.gz
gpg: Firma creada el mar 11 nov 2003 21:40:35 WET usando clave RSA ID 46EAFCE1
gpg: Firma correcta de "Linux FreeS/WAN Software Team <build@freeswan.org>"
$ gpg --verify x509-1.4.8-freeswan-2.04.tar.gz.sign x509-1.4.8-freeswan-2.04.tar.gz
gpg: Firma creada el vie 14 nov 2003 21:40:35 WET usando clave RSA ID 40995359
gpg: Firma correcta de "Andreas Steffen <andreas.steffen@strongsec.net>"

3.3. Descompresión y desempaquetado del software

Descomprimimos y desempaquetamos el software en el lugar elegido, por ejemplo en /usr/src:

$ tar xzvf freeswan-2.04.tar.gz -C /usr/src
$ tar xzvf x509-1.4.8-freeswan-2.04.tar.gz -C /usr/src

3.4. Aplicando los parches X.509 a FreeS/WAN

Aplicamos los parches X.509 a FreeS/WAN:

$ cd /usr/src/freeswan-2.04/
$ cat ../x509-1.4.8-freeswan-2.04/freeswan.diff |patch -p1

En estos momentos, si todo ha ido bien, ya estamos en disposición de compilar e instalar el software.

3.5. Compilando e instalando FreeS/WAN

La forma elegida para añadir el soporte IPSec al núcleo Linux, es parcheando las fuentes de Linux y compilando un nuevo núcleo. Para ello, supondremos que las fuentes de Linux están en el directorio /usr/src/linux.

Antes de aplicar el parche FreeS/WAN, ha de configurar y compilar el nuevo núcleo. Una vez que ha finalizado, acceda al código fuente de FreeS/WAN y teclee:

$ cd /usr/src/freeswan-2.04/
$ make menugo
# make minstall

Al finalizar el proceso dispondremos tanto de las herramientas de espacio de usuario de FreeS/WAN como de los módulos necesarios para dar soporte IPSec al núcleo Linux. Ahora sólo le queda instalar el nuevo núcleo y reiniciar el sistema.

[Note]Nota

La distribución Debian GNU/Linux ya provee las herramientas de espacio de usuario empaquetadas (con los Parches X.509 aplicados). Por lo que bastaría con ejecutar el siguiente comando para tenerlas completamente operativas:

# apt-get install freeswan

Debian también provee un parche para el núcleo debidamente preparado y parcheado, si quiere hacer uso del mismo, pruebe a instalar el paquete kernel-patch-freeswan

4. Creación de una entidad certificadora

Una de las partes más importantes de la configuración, es la creación de una entidad certificadora[2]. Para ello es necesario instalar OpenSSL[3] y una vez instalado, hacer nuestro certificado de autoridad. La forma de hacerlo se detalla en los siguientes pasos[4]:

  1. Edite el archivo /etc/ssl/openssl.cnf y cambie la opción 'default_bits' de 1024 a 2048 y la opción 'default_days' a 365 (o similar)[5].

  2. Creamos un directorio para almacenar el nuevo certificado (algo similar a /var/tmp/sslca) y le cambiamos los permisos a 700, para impedir que los usuarios tengan acceso al certificado.

  3. Edite el fichero /usr/lib/ssl/misc/CA.sh y cambie la línea 'DAYS="days 365"' por un valor muy elevado[6]. Asegúrese de que este número es mayor que el establecido en el primer punto, o Windows no aceptará sus certificados.

  4. Ejecute el comando:

    # /usr/lib/ssl/misc/CA.sh -newca

    Y siga los pasos como se muestra a continuación. La letra en negrita es el texto que yo he tecleado:

    [Important]Importante

    No utilice caracteres especiales, como guiones, signos de suma, tildes, etc.; estos pueden confundir a la implementación IPSec de MS Windows.

    # /usr/lib/ssl/misc/CA.sh -newca
    CA certificate filename (or enter to create)
    
    (enter)
    Making CA certificate ...
    Generating a 2048 bit RSA private key
    .......+++
    ..................+++
    writing new private key to './demoCA/private/./cakey.pem'
    Enter PEM pass phrase:ca-password(enter)
    Verifying - Enter PEM pass phrase:ca-password(enter)
    -----
    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) [AU]:PT(enter)
    State or Province Name (full name) [Some-State]:Braganca(enter)
    Locality Name (eg, city) []:Braganca
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Instituto Politecnico de Braganca(enter)
    Organizational Unit Name (eg, section) []:Comunicacoes(enter)
    Common Name (eg, YOUR name) []:Sergio Gonzalez Gonzalez(enter)
    Email Address []:sergio.gonzalez@hispalinux.es(enter)
    

Una vez finalizado el proceso de generación, ya disponemos de una entidad certificadora, con la cual podremos crear certificados.

5. Generación de los certificados

Lo primero que ha de hacer es genearar los certificados para su máquina gateway. Los pasos que se listan a continuación serán los mismos que deberá seguir si quiere generar certificados para otras máquinas.

  1. Generamos el certificado en cuestión, como se muestra en la siguiente captura de pantalla:

    # /usr/lib/ssl/misc/CA.sh -newreq
    Generating a 2048 bit RSA private key
    ..................................................+++
    .....................................................+++
    writing new private key to 'newreq.pem'
    Enter PEM pass phrase:req-password(enter)
    Verifying - Enter PEM pass phrase:req-password(enter)
    -----
    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) [AU]:PT
    State or Province Name (full name) [Some-State]:Braganca
    Locality Name (eg, city) []:Braganca
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Instituto Politecnico de Braganca
    Organizational Unit Name (eg, section) []:Comunicacoes
    Common Name (eg, YOUR name) []:Sergio Gonzalez Gonzalez
    Email Address []:sergio.gonzalez@hispalinux.es
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:(enter)
    An optional company name []:(enter)
    Request (and private key) is in newreq.pem
    # 
    # 
    # /usr/lib/ssl/misc/CA.sh -sign
    Using configuration from /usr/lib/ssl/openssl.cnf
    Enter pass phrase for ./demoCA/private/cakey.pem:ca-password(enter)
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number: 1 (0x1)
            Validity
                Not Before: Dec 12 16:25:34 2003 GMT
                Not After : Dec 11 16:25:34 2004 GMT
            Subject:
                countryName               = PT
                stateOrProvinceName       = Braganca
                localityName              = Braganca
                organizationName          = Instituto Politecnico de Braganca
                organizationalUnitName    = Comunicacoes
                commonName                = Sergio Gonzalez Gonzalez
                emailAddress              = sergio.gonzalez@hispalinux.es
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:FALSE
                Netscape Comment:
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier:
                    43:A9:62:84:2D:90:F9:A9:5B:43:12:EC:3C:9E:40:13:09:25:57:6C
                X509v3 Authority Key Identifier:
                    keyid:E7:9D:04:A6:98:8F:C5:AB:F8:E4:AA:A8:8D:69:AE:F6:82:0B:11:D5
                    DirName:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
                    serial:00
    
    Certificate is to be certified until Dec 11 16:25:34 2004 GMT (365 days)
    Sign the certificate? [y/n]:y(enter)
    
    
    1 out of 1 certificate requests certified, commit? [y/n]y(enter)
    Write out database with 1 new entries
    Data Base Updated
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 1 (0x1)
            Signature Algorithm: md5WithRSAEncryption
            Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd
            Validity
                Not Before: Dec 12 16:25:34 2003 GMT
                Not After : Dec 11 16:25:34 2004 GMT
            Subject: C=PT, ST=Braganca, L=Braganca, O=Instituto Politecnico de Braganca, OU=Comunicacoes,
                     CN=Sergio Gonzalez Gonzalez/emailAddress=sergio.gonzalez@hispalinux.es
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                RSA Public Key: (2048 bit)
                    Modulus (2048 bit):
                        00:b1:ab:d1:e1:db:6f:0c:9b:a1:2c:eb:9a:58:5c:
                        ad:9d:66:27:b6:47:84:50:d6:93:24:0d:92:32:a2:
                        81:49:5b:8b:b4:86:f3:31:6d:9d:23:9c:e4:dd:99:
                        35:26:d5:5a:f4:e7:2a:ad:51:69:0a:29:1d:a1:58:
                        3c:3c:33:96:5f:91:ef:ee:4b:77:0d:2c:e2:df:d3:
                        39:9c:fa:69:11:6f:64:41:c6:36:c1:2e:1f:1e:d9:
                        2b:1d:2d:e0:6b:e7:a6:e7:4f:d3:eb:92:7f:a1:30:
                        b3:61:1e:c8:2c:c9:e1:85:0b:ca:df:bf:a0:be:34:
                        48:b5:4f:0d:6c:4f:3d:a2:21:9a:1a:d8:73:11:bb:
                        a5:f3:ee:65:c3:5a:02:e4:a4:3c:8c:06:d3:4a:93:
                        98:e4:1b:8a:e9:2f:bf:b4:32:e5:8f:26:bc:2a:93:
                        2c:77:29:d3:98:c2:d2:88:f1:45:53:6b:84:7f:ee:
                        c2:0a:ba:35:0a:8e:7a:1d:d8:ca:23:cc:25:4d:e9:
                        cc:7b:ef:ea:46:d4:df:e6:8d:07:8d:8d:4c:ad:e5:
                        72:35:92:6a:db:05:ca:60:a2:6e:9e:1d:81:41:d0:
                        7b:32:0b:f1:ca:7c:96:34:e8:9c:d5:0d:b5:a7:ed:
                        f1:35:c3:ef:c5:71:4c:1d:ab:e3:f2:10:28:d2:ff:
                        dd:9b
                    Exponent: 65537 (0x10001)
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:FALSE
                Netscape Comment:
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier:
                    43:A9:62:84:2D:90:F9:A9:5B:43:12:EC:3C:9E:40:13:09:25:57:6C
                X509v3 Authority Key Identifier:
                    keyid:E7:9D:04:A6:98:8F:C5:AB:F8:E4:AA:A8:8D:69:AE:F6:82:0B:11:D5
                    DirName:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
                    serial:00
    
        Signature Algorithm: md5WithRSAEncryption
            1a:d4:f2:72:ca:02:3a:7a:8d:ed:f5:c0:2a:03:56:14:d2:70:
            85:e1:c0:97:84:bb:29:5c:d1:38:f8:d9:56:95:44:e4:47:db:
            48:92:da:fd:9b:49:1e:e5:0c:15:15:a4:a9:f4:78:b2:80:31:
            81:7b:06:35:f3:86:81:e2:03:a0:37:25:ad:0b:70:17:6e:cd:
            80:3a:93:b8:b7:e3:15:0c:45:04:f4:c9:78:43:14:90:b9:3d:
            68:ca:2e:b0:9c:95:8c:2d:d3:d2:9a:ea:18:ca:52:24:d7:79:
            f6:3f:02:63:9c:09:f5:17:41:5b:f7:8d:d0:01:2b:66:59:5a:
            62:6b:e8:b7:6b:22:33:5a:a0:42:69:00:e1:83:30:5c:43:55:
            c7:aa:f8:f8:80:db:db:43:54:aa:6d:99:7a:fc:ea:40:48:af:
            65:56:e1:78:4b:b4:0d:c3:41:e5:b6:6e:18:c8:05:ab:db:dd:
            a0:45:f5:e9:77:69:a0:ab:b4:fa:8c:4e:32:89:eb:76:76:53:
            f5:13:b2:87:a4:45:4f:df:d0:9d:0e:fc:dd:a0:51:2e:0c:42:
            0c:22:d1:ec:7d:e4:ab:31:04:b1:ee:85:fb:a9:d7:83:28:dd:
            de:50:15:e9:22:22:73:0c:4a:8b:ad:35:66:bc:af:11:ee:2c:
            7c:0f:dd:66
    -----BEGIN CERTIFICATE-----
    MIIEUzCCAzugAwIBAgIBATANBgkqhkiG9w0BAQQFADBFMQswCQYDVQQGEwJBVTET
    MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ
    dHkgTHRkMB4XDTAzMTIxMjE2MjUzNFoXDTA0MTIxMTE2MjUzNFowgccxCzAJBgNV
    BAYTAlBUMREwDwYDVQQIEwhCcmFnYW5jYTERMA8GA1UEBxMIQnJhZ2FuY2ExKjAo
    BgNVBAoTIUluc3RpdHV0byBQb2xpdGVjbmljbyBkZSBCcmFnYW5jYTEVMBMGA1UE
    CxMMQ29tdW5pY2Fjb2VzMSEwHwYDVQQDExhTZXJnaW8gR29uemFsZXogR29uemFs
    ZXoxLDAqBgkqhkiG9w0BCQEWHXNlcmdpby5nb256YWxlekBoaXNwYWxpbnV4LmVz
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsavR4dtvDJuhLOuaWFyt
    nWYntkeEUNaTJA2SMqKBSVuLtIbzMW2dI5zk3Zk1JtVa9OcqrVFpCikdoVg8PDOW
    X5Hv7kt3DSzi39M5nPppEW9kQcY2wS4fHtkrHS3ga+em50/T65J/oTCzYR7ILMnh
    hQvK37+gvjRItU8NbE89oiGaGthzEbul8+5lw1oC5KQ8jAbTSpOY5BuK6S+/tDLl
    jya8KpMsdynTmMLSiPFFU2uEf+7CCro1Co56HdjKI8wlTenMe+/qRtTf5o0HjY1M
    reVyNZJq2wXKYKJunh2BQdB7MgvxynyWNOic1Q21p+3xNcPvxXFMHavj8hAo0v/d
    mwIDAQABo4HKMIHHMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wg
    R2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRDqWKELZD5qVtDEuw8nkAT
    CSVXbDBtBgNVHSMEZjBkgBTnnQSmmI/Fq/jkqqiNaa72ggsR1aFJpEcwRTELMAkG
    A1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0
    IFdpZGdpdHMgUHR5IEx0ZIIBADANBgkqhkiG9w0BAQQFAAOCAQEAGtTycsoCOnqN
    7fXAKgNWFNJwheHAl4S7KVzROPjZVpVE5EfbSJLa/ZtJHuUMFRWkqfR4soAxgXsG
    NfOGgeIDoDclrQtwF27NgDqTuLfjFQxFBPTJeEMUkLk9aMousJyVjC3T0prqGMpS
    JNd59j8CY5wJ9RdBW/eN0AErZllaYmvot2siM1qgQmkA4YMwXENVx6r4+IDb20NU
    qm2ZevzqQEivZVbheEu0DcNB5bZuGMgFq9vdoEX16XdpoKu0+oxOMonrdnZT9ROy
    h6RFT9/QnQ783aBRLgxCDCLR7H3kqzEEse6F+6nXgyjd3lAV6SIicwxKi601Zryv
    Ee4sfA/dZg==
    -----END CERTIFICATE-----
    Signed certificate is in newcert.pem
  2. Renombramos ahora los archivos generados a algo más significativo:

    # mv newcert.pem host.dominio.com.pem
    # mv newreq.pem host.dominio.com.key
  3. Edite el archivo .key y borre todo el contenido existente entre la línea '-----BEGIN CERTIFICATE REQUEST-----' y '-----END CERTIFICATE REQUEST-----'. Una vez hecho esto, su archivo debería comenzar por '-----BEGIN RSA PRIVATE KEY-----' y terminar por '-----END RSA PRIVATE KEY-----'.

6. Instalación del certificado en el gateway

La instalación es muy sencilla, simplemente copie los archivos a sus ubicaciones[7]:

# cp /var/tmp/sslca/host.dominio.com.key /etc/ipsec.d/private
# cp /var/tmp/sslca/host.dominio.com.pem /etc/ipsec.d
# cp /var/tmp/sslca/demoCA/cacert.pem /etc/ipsec.d/cacerts
# openssl ca -gencrl -out /etc/ipsec.d/crls/crl.pem

7. Configuración de FreeS/WAN en la máquina gateway

Sigua los siguientes pasos para completar su configuración:

7.1. Configuración de ipsec.secrets

El archivo /etc/ipsec.secrets debe contener lo siguiente:

: RSA host.dominio.com.key "req-password"

La palabra rep-password ha de ser sustituida con la clave que introdujo a la hora de generar el certificado SSL, o con: %prompt si quiere que al arrancar IPSec pregunte por la clave.

[Warning]Aviso

A lo largo de este documento estamos suponiendo el uso de una versión 1.96 o superior de FreeS/WAN.

7.2. Configuración de ipsec.conf

El archivo /etc/ipsec.conf ha de poseer un contenido similar a:

[Important]Importante

Tenga en cuenta que la identación es importante, si no se respeta, FreeS/WAN fallará.

# /etc/ipsec.conf - FreeS/WAN IPsec configuration file
# RCSID $Id: ipsec.conf.in,v 1.10.2.1 2003/06/13 23:27:25 sam Exp $

# This file:  /usr/share/doc/freeswan/ipsec.conf-sample
#
# Manual:     ipsec.conf.5
#
# Help:
# http://www.freeswan.org/freeswan_trees/freeswan-2.01/doc/quickstart.html
# http://www.freeswan.org/freeswan_trees/freeswan-2.01/doc/config.html
# http://www.freeswan.org/freeswan_trees/freeswan-2.01/doc/adv_config.html
#
# Policy groups are enabled by default. See:
# http://www.freeswan.org/freeswan_trees/freeswan-2.01/doc/policygroups.html
#
# Examples:
# http://www.freeswan.org/freeswan_trees/freeswan-2.01/doc/examples


version 2.0     # conforms to second version of ipsec.conf specification

config setup
    interfaces=%defaultroute
    klipsdebug=none
    plutodebug=none
    plutoload=%search
    plutostart=%search
    uniqueids=yes

conn %default
    keyingtries=1
    compress=yes
    disablearrivalcheck=no
    authby=rsasig
    leftrsasigkey=%cert
    rightrsasigkey=%cert

conn roadwarrior-net
    leftsubnet=192.168.1.0/24
    also=roadwarrior

conn roadwarrior
    right=%any
    left=%defaultroute
    leftcert=host.dominio.com.pem
    auto=add
    pfs=yes

Esta configuración permitirá a cualquier persona, con un certificado válido, conectarse a nuestro host. Hay dos perfiles de conexión: uno para las conexiones que se realizan directamente en el gateway y otro para los clientes que se conectan a la red que está detrás del gateway.

7.3. Arrancando IPSec

Ahora sólo falta arrancar el demonio IPSec tecleando:

# /etc/init.d/ipsec start
ipsec_setup: Starting FreeS/WAN IPsec 2.01...
ipsec_setup: Using /lib/modules/<uname -r>/kernel/net/ipsec/ipsec.o

Una vez que ipsec ha arrancado con normalidad, se habrá creado una nueva interfaz de red (ipsec0), el demonio pluto estará escuchando en el puerto UDP 500 y se habrán añadido algunas entradas en la tabla de rutas:

# /sbin/ifconfig
eth1      Link encap:Ethernet  HWaddr 00:00:00:00:00:01
          inet addr:193.146.99.5  Bcast:193.146.99.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:5 Base address:0x8f00

ipsec0    Link encap:Ethernet  HWaddr 00:00:00:00:00:02
          inet addr:192.168.1.254  Mask:255.255.255.0
          UP RUNNING NOARP  MTU:16260  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 0)

eth0      Link encap:Ethernet  HWaddr 00:00:00:00:00:02
          inet addr:192.168.1.254  Bcast:10.255.255.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:9 Base address:0xee80

# /sbin/route -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
193.146.99.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
193.146.99.0    0.0.0.0         255.255.255.0   U     0      0        0 ipsec0
0.0.0.0         193.146.99.254  128.0.0.0       UG    0      0        0 ipsec0
128.0.0.0       193.146.99.254  128.0.0.0       UG    0      0        0 ipsec0
0.0.0.0         193.146.99.254  0.0.0.0         UG    0      0        0 eth1
# /bin/netstat -putan | grep pluto
udp        0      0 10.0.1.4:500            0.0.0.0:*                          16428/pluto

8. Configuración de iptables en el gateway

Las reglas de iptables necesarias para que el gateway se comporte como debe son las siguientes:

#!/bin/bash
#

##
# Configuration
#

IPTABLES="/sbin/iptables"

#
# interfaces
#

INTERFACE_LO="lo"
INTERFACE_LAN="eth0"
INTERFACE_INTERNET="eth1"
INTERFACE_IPSEC="ipsec0"

#
# network
#

IP_LOCALHOST="127.0.0.1"

IP_LAN="192.168.1.254"
BCAST_LAN="192.168.1.255"

IP_INET="193.146.99.5"

IP_LAN_CLIENT_IPSEC="192.168.1.4"
IP_INET_CLIENT_IPSEC="212.22.69.45"

#
# ports
#

OPEN_TCP_PORTS="22"
OPEN_UDP_PORTS="500"
OPEN_ICMP_PORTS="0 3 5 8 11"

#
# IP NAT
#

IP_NAT="193.146.99.5"


##
# Reset iptables
#

${IPTABLES} -P INPUT ACCEPT
${IPTABLES} -P OUTPUT ACCEPT
${IPTABLES} -P FORWARD ACCEPT
${IPTABLES} -X
${IPTABLES} -F


##
# Policy
#

${IPTABLES} -P INPUT DROP
${IPTABLES} -P OUTPUT ACCEPT
${IPTABLES} -P FORWARD ACCEPT


##
# INPUT Chain
#

#
# open tcp ports
#

for x in ${TCP_PORTS}
do
        ${IPTABLES} -A INPUT -p TCP -i ${INERFACE_INET} --dport ${x} -j ACCEPT
done

#
# open udp ports
#

for x in ${UDP_PORTS}
do
        ${IPTABLES} -A INPUT -p UDP -i ${INERFACE_INET} --dport ${x} -j ACCEPT
done

#
# open icmp ports
#

for x in ${ICMP_PORTS}
do
        ${IPTABLES} -A INPUT -p ICMP -i ${INERFACE_INET} --icmp-type ${x} -j ACCEPT
done

#
# general input rules
#

${IPTABLES} -A INPUT -p ALL -i ${INTERFACE_LO}  -d ${IP_LOCALHOST} -j ACCEPT
${IPTABLES} -A INPUT -p ALL                     -d ${IP_LAN}       -j ACCEPT
${IPTABLES} -A INPUT -p ALL -i ${INTERFACE_LAN} -d ${BCAST_LAN}    -j ACCEPT
${IPTABLES} -A INPUT -m state --state ESTABLISHED,RELATED          -j ACCEPT


##
# OUTPUT Chain
#

${IPTABLES} -A OUTPUT -p ALL -s ${IP_LOCALHOST} -j ACCEPT
${IPTABLES} -A OUTPUT -p ALL -s ${IP_LAN}       -j ACCEPT

${IPTABLES} -A OUTPUT -p ALL -s ${IP_LAN} -o ${INTERFACE_IPSEC}    \
            -d ! ${IP_LAN_CLIENT_IPSEC} -j DROP
${IPTABLES} -A OUTPUT -p ALL -s ${IP_LAN} -o ${INTERFACE_INTERNET} \
            -d   ${IP_LAN_CLIENT_IPSEC} -j DROP

##
# NAT
#

${IPTABLES} -t nat -A POSTROUTING -o ${INTERFACE_INET} \
            -d ! ${IP_LAN_CLIENT_IPSEC} -j SNAT --to-source ${IP_NAT}

9. Configuración del cliente Windows XP

[Important]Importante

Si tiene instalado en su sistema la aplicación SSH Sentinel, y quiere utilizar la pila IPSec de MS Windows, ha de desinstalar (o desabilitar) SSH Sentinel, y habilitar el servicio 'ipsec'.

[Note]Nota

En la siguiente dirección existen una serie de capturas de pantalla que muestran el proceso de importación de certificados en una máquina Windows: http://support.real-time.com/open-source/ipsec/index.html

Los pasos necesarios para configurar nuestro cliente MS Windows XP son los siguientes:

9.1. Crear el certificado para la máquina MS Windows

Cree el certificado para la máquina cliente, para ello siga los pasos detallados en la Sección 5, “Generación de los certificados”. A partir de este momento, asumiremos que se ha denominado al certificado para Windows XP de la siguiente forma: winhost.dominio.com

9.2. Obtener el certificado en formato .p12

Desde el certificado generado para MS Windows, exporte un archivo .p12 para la máquina MS Windows. La forma de hacerlo es la siguiente:

# openssl pkcs12 -export -in winhost.dominio.com.pem -inkey winhost.dominio.com.key \
-certfile demoCA/cacert.pem -out winhost.dominio.com.p12
Enter pass phrase for host.dominio.com.key:req-password(enter)
Enter Export Password:win-password(enter)
Verifying - Enter Export Password:win-password(enter)
[Note]Nota

Tenga en cuenta que puede necesitar añadir la opción '-name friendly_name', para que algunas versiones de MS Windows puedan leer el certificado.

Ejecute también el siguiente comando:

# openssl x509 -in demoCA/cacert.pem -noout -subject

Deberá apuntar el resultado obtenido, ya que lo necesitará para la configuración de su VPN. El resultado obtenido en mi caso ha sido:

subject= /C=PT/ST=Braganca/L=Braganca/O=Instituto Politecnico de Braganca
/OU=Comunicacoes/CN=Sergio Gonzalez Gonzalez/emailAddress=sergio.gonzalez@hispalinux.es

9.3. Copiar el certificado a MS Windows

Copie el archivo winhost.dominio.com.p12 a su máquina MS Windows de forma segura.

9.4. Aplicación ipsec.exe de Marcus Müller

Antes de instalar la aplicación VPN de Marcus Müller, ha de instalar el programa ipeseccmd. Para ello instale las Win XP Support tools que están en el CD de MS Windows XP en el directorio \SUPPORT\TOOLS. Ejecute el archivo setup.exe y seleccione la instalación completa.

Descomprima la aplicación ipsec.exe de Marcus Müller a un directorio de su máquina MS Windows, por ejemplo: c:\ipsec.

9.5. IPSec y certificados MMC

En esta sección se han empleado las capturas de pantalla y la información de esta página: RealTimeEnterprises1.

Ventana de ejecución de MS Windows

1. Haz click sobre el botón inicio -> ejecutar

2. Teclee MMC y pulse OK

Ventana consola

3. Pulse sobre el menú Archivo (o Console) y seleccione Add/Remove Snap-in

Ventana ADD/Remove snap-in

4. Pulse sobre Añadir

Ventana para añadir un snap-in

5. Pulse sobre Certificados y pulse sobre Añadir

Ventana de certificados snap-in

Seleccione Cuenta de ordenador y pulse sobre Next

Ventana de selección de un ordenador

7. Seleccione Ordenador local y pulse sobre Finalizar

Ventana para añadir un snap-in

8. Busque y pulse la opción Administración de las políticas de seguridad IP y luego haga click sobre Añadir

Ventana de selección de un ordenador

9. Seleccione Ordenador local y pulse sobre Finalizar

Ventana de addicción de un snap-in

10. Pulse sobre Cerrar

Ventana de adicción/eliminación de snap-in

11. Pulse sobre Aceptar

9.6. Añadir el certificado

En esta sección se han empleado las capturas de pantalla y la información de esta página: RealTimeEnterprises1.

Ventana de consola

1. Pulse sobre el signo más de la opción Certificados (ordenador local)

Ventana de consola

2. Pulse con el botón derecho sobre Personal y luego sobre Todas las tareas y más tarde sobre Importar

Ayudante para la importación de certificados

3. Pulse sobre Siguiente

Ayudante para la importación de certificados

4. Teclee la ruta al archivo .p12 (o busque y seleccione el archivo), y pulse sobre Siguiente

Ayudante para la importación de certificados

5. Teclee la clave del certificado y luego pulse Siguiente

Ayudante para la importación de certificados

6. Seleccione la opción Selección automática del almacenamiento del certificado basado en el tipo de certificado y pusle sobre Siguiente

Ayudante para la importación de certificados

7. Pulse sobre Finalizar, y diga a cualquier ventana de aviso que se muestre

Ventana de aviso

8. Pulse sobre Aceptar

Ventana de consola

9. Guarde la configuración actual en un archivo, así no tendrá que añadir de nuevo el Snap Ins cada vez

Ventana de Guardar Como...

10. Utilize el nombre por defecto, y pulse sobre Guardar

Ventana de consola de MMC

11. Salga de MMC

9.7. Configuración de la herramienta IPSec

Edite el archivo ipsec.conf (en la máquina MS Windows), reemplace la entrada “RightCA” con la salida obtenida al final de la Sección 9.2, “Obtener el certificado en formato .p12”, tras ejecutar el comando:

# openssl x509 -in demoCA/cacert.pem -noout -subject

Nesecitará reformatear la salida como se muestra a continuación[8]:

conn roadwarrior 
    left=%any 
    right=193.146.99.5
    rightca="C=PT,S=Braganca,L=Braganca,O=Instituto Politecnico de Braganca,
             CN=Sergio Gonzalez Gonzalez,Email=sergio.gonzalez@hispalinux.es" 
    network=auto 
    auto=start 
    pfs=yes 
 
conn roadwarrior-net 
    left=%any 
    right=193.146.99.5 
    rightsubnet=192.168.1.0/24 
    rightca="C=PT,S=Braganca,L=Braganca,O=Instituto Politecnico de Braganca,
             CN=Sergio Gonzalez Gonzalez,Email=sergio.gonzalez@hispalinux.es" 
    network=auto 
    auto=start 
    pfs=yes

9.8. Arrancando el enlace

Ejecute el comando ipsec.exe. A continuación se muestra un ejemplo de salida tras ejecutar dicho comando:

C:\ipsec>ipsec
IPSec Version 2.1.4 (c) 2001,2002 Marcus Mueller 
Getting running Config ... 
Microsoft's Windows XP identified 
Host name is: (local_hostname) 
No RAS connections found. 
LAN IP address: 192.168.1.4 
Setting up IPSec ... 

Deactivating old policy... 
Removing old policy... 

Connection roadwarrior: 
MyTunnel : 192.168.1.4 
MyNet : 192.168.1.4/255.255.255.255 
PartnerTunnel: 193.146.99.5 
PartnerNet : 193.146.99.5/255.255.255.255 
CA (ID) : C=PT,S=Braganca,L=Braganca,O=Instituto Politecnico de Braganca,... 
PFS : y 
Auto : start 
Auth.Mode : MD5 
Rekeying : 3600S/50000K 
Activating policy... 

Connection roadwarrior-net: 
MyTunnel : 192.168.1.4
MyNet : 192.168.1.4/255.255.255.255 
PartnerTunnel: 193.146.99.5 
PartnerNet : 192.168.1.254/255.255.255.255 
CA (ID) : C=PT,S=Braganca,L=Braganca,O=Instituto Politecnico de Braganca,... 
PFS : y 
Auto : start 
Auth.Mode : MD5 
Rekeying : 3600S/50000K 
Activating policy... 

C:\ipsec>

Una vez ha finalizado el arranque de IPSec, haga un ping a su gateway. Este debería decir 'Negotiating IP Security' varias veces, y después dar respuestas al comando ping.

[Note]Nota

Tenga en cuenta que el establecimiento del tunel puede llevar varios intentos; haciendo uso de una red T1 conectándose a un servidor detrás de un cable módem, el establecimiento toma unos 3-4 pings normalmente.

10. Licencia de este documento

Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los términos de la Licencia de Documentación Libre GNU, versión 1.1 o cualquier versión posterior publicada por la Free Software Foundation. Puedes consultar una copia de la licencia en http://www.gnu.org/copyleft/fdl.html

Bibliografía

Documentación

[JaccodeLeeuw1] Using FreeS/WAN with Windows L2TP/IPsec . Jacco de Leeuw.

[DocFreeS/WAN] Documentación acompaña a FreeS/WAN . Linux FreeS/WAN Software Team.

[Andreasson1] Iptables Tutorial . Oskar Andreasson. Copyright © 2001-2002 Oskar Andreasson.

Software relacionado y utilizado

[FreeS/WAN] FreeS/WAN .

[Parches X.509] Parches X.509 .

[MüllerVPN] VPN . Marcus Müller.

[ParchesEncpt] Parches de encriptación .

[OpenSSL] OpenSSL .

[Dia] Dia .

[TheGimp] The Gimp! .

Sistemas Operativos empleados

[DebianGNULinux] Debian GNU/Linux .

Núcleos implicados

[Linux] Linux .

Sin clasificar

[Windows] MS Windows .



[1] Si desea el código fuente original de esta imagen, realizado con Dia, pulse aquí

[2] CA: Certificate Authority

[3] Si está utilizando un sistema Debian GNU/Linux, sólo tendrá que ejecutar:

# apt-get install openssl

[4] Vamos a suponer que estamos trabajando con un sistema Debian GNU/Linux para esta instalación.

[5] Una recomendación sería establecer este número bastante elevado, algo similar a 3650, de esta forma, el certificado tiene una valided de 10 años.

[6] Esto establece la valided de nuestra entidad certificadora

[7] El proceso seguido aquí puede repetirse para todos aquellos equipos que quiera configurar y añadir a la red privada virtual.

[8] Deberá cambiar los caracteres “/” por comas, y cambiar los nombres de algunos de los campos.