Archives par mot-clé : strongswan

Configurer un serveur ipsec dans ipfire

Note: on copie et on colle directement dans le shell.

Dans cette page, vous trouvez la procédure pour configurer un serveur ipsec dans ipfire, et mettre en place différent clients comme iphones, Windows (>7 ) et Linux.

tunnel vpn

A) Mise en place du Serveur Ipsec

A.1/ Préparation du shell

Je vous propose de définir quelques variables volatiles, à modifier à sa convenance.

[code lang= »shell »]
TAB= »$(printf ‘\t’) »
NOM_DOMAINE=example.com #peut-être une adresse IP
WORKGROUP=’Internet Group’
PAYS=FR
EMAIL=user@${NOM_DOMAINE}
STATE=’Ma Région’
TOWN=’Ma ville’
NOM_CLIENT=Nom_de_Client_a_choisir
IP_VPN_CLIENT=10.0.0.1
PASSWORD=Motdepasse
#IP_GREEN=`ifconfig green0 | grep ‘inet addr:’ | cut -d: -f2 | awk ‘{ print $1}’`
# NET_GREEN=${IP_GREEN%.*}.0/24
NET_GREEN=0.0.0.0/0 # permet l’accès du VPN à n’importe quel réseau à restreindre si besoin
PATH_INSTALL=/var/ipfire[/code]

!Impératif! NOM_DOMAINE renseigne le nom commun(CN), soit le nom de domaine par lequel votre réseau est accessible Il est possible de mettre une adresse IP.
NET_GREEN est la zone où le VPN va avoir accès, ici dans la zone verte.
IP_VPN_CLIENT est l’adresse IP arbitraire assigné au client.

Pour la suite, y a plus qu’à lire et à copier/coller.

A.2/ Génération de l’autorité de certification (cacert)

Une autorité de certification délivre des certificats en deux parties, une clef privée que le client ou le serveur garde confidentiel et une clef public qui est diffusé à travers le réseau. Le serveur a obligatoirement son jeu de clef.

[code lang= »shell »]ipsec pki –gen –outform pem > ${PATH_INSTALL}/private/cakey.pem
ipsec pki –self –in ${PATH_INSTALL}/private/cakey.pem –dn « C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, OU=CA, CN=${NOM_DOMAINE}, emailAddress=${EMAIL} » –ca –outform pem > ${PATH_INSTALL}/ca/cacert.pem
[/code]

Il faut également renseigné un fichier setting situé dans /var/ipfire/vpn/ pour que les informations correspondent avec l’interface Web d’Ipfire. Attention aux droit d’utilisateur, tout est en nobody!

[code lang= »shell »]cat << EOF >${PATH_INSTALL}/vpn/settings
ROOTCERT_EMAIL=${EMAIL}
ROOTCERT_CITY=${TOWN}
ROOTCERT_STATE=${STATE}
ENABLED=off
ROOTCERT_OU=CA
ROOTCERT_HOSTNAME=${NOM_DOMAINE}
RW_NET=
VPN_IP=%defaultroute
ROOTCERT_COUNTRY=FR
VPN_DELAYED_START=0
ROOTCERT_ORGANIZATION=${WORKGROUP}
EOF[/code]

A.3/ Génération du certificat hôte (hostcert)

Attention au CN, comme expliqué plus haut, il doit absolument correspondre au nom de domaine ou à l’adresse IP par lequel vous êtes accessible via le réseau (Internet ou Intranet).

[code lang= »shell »]ipsec pki –gen –outform pem > ${PATH_INSTALL}/private/hostkey.pem
ipsec pki –pub –in ${PATH_INSTALL}/private/hostkey.pem | ipsec pki –issue –cacert ${PATH_INSTALL}/ca/cacert.pem –cakey ${PATH_INSTALL}/private/cakey.pem –dn « C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_DOMAINE}, OU=Serveur VPN, emailAddress=${EMAIL} » –san= »${NOM_DOMAINE} » –flag serverAuth –flag ikeIntermediate –outform pem > ${PATH_INSTALL}/certs/hostcert.pem
cat << EOF > /etc/ipsec.user.secrets
: RSA /var/ipfire/private/hostkey.pem
EOF[/code]

Sous l’onglet Services->Ipsec dans l’interface web d’Ipfire, le certificat d’autorité (CA) et le certificat hôte doit être visible et consultable.

A.4 Préparation client côté Ipfire

Pour mettre en place un client, notre serveur Ipsec aura été préalablement renseigné par deux fichiers.

  • Le premier fichier, /etc/ipsec/ipsec.conf (qui inclus le fichier /etc/ipsec/ipsec.user.conf), définit la configuration gauche/droite (local relatif/distant relatif).
  • Le deuxième fichier, /etc/ipsec.secret (qui inclus le fichier /etc/ipsec.user.secrets), définit les informations nécessaire pour l’authentification, à savoir, la clé du certificat du serveur et les identifiants avec le mot de passe correspondant.

Lors de l’arrêt et du démarrage du serveur ipsec par les pages web, les fichiers sont réécrit sauf les « user ». Comme les clients sont créés manuellement, il est nécessaire de placer leur configuration dans /etc/ipsec.user.conf et /etc/ipsec.user.secrets.

La ligne de commande suivante renseigne un fichier situé dans /var/ipfire/vpn/ afin que l’interface web d’ipfire affiche les informations sur les clients VPN dans la page Service->IPSEC et Status->Connexion.

[code lang= »shell »]
echo $((`wc -l ${PATH_INSTALL}/vpn/config | awk ‘{ print $1}’`+1)),off,${NOM_CLIENT},CN=${NOM_CLIENT}.${NOM_DOMAINE} OU=Client VPN,host,cert,,,,${NET_GREEN},,,${IP_VPN_CLIENT}/32,,,,,,,,,,,,,,,,,,,,>>${PATH_INSTALL}/vpn/config
[/code]

 

A.4.1) Windows 7 : Attention, c’est soit via certificat clé privé/public ou via eap-mschapv2.

A.4.1.a) Via certificat clé privé/public

Il est demandé un mot de passe lors de la génération du fichier .p12. Il sera demandé au client lors de l’importation du certificat.

[code lang= »shell »]ipsec pki –gen –outform pem > ${PATH_INSTALL}/private/${NOM_CLIENT}key.pem
ipsec pki –pub –in ${PATH_INSTALL}/private/${NOM_CLIENT}key.pem | ipsec pki –issue –cacert ${PATH_INSTALL}/ca/cacert.pem –cakey ${PATH_INSTALL}/private/cakey.pem –dn « C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL} » –flag serverAuth –flag ikeIntermediate –outform pem > ${PATH_INSTALL}/certs/${NOM_CLIENT}cert.pem

# Fichier p12 pour notre client Windows
openssl pkcs12 -export -inkey ${PATH_INSTALL}/private/${NOM_CLIENT}key.pem -in ${PATH_INSTALL}/certs/${NOM_CLIENT}cert.pem -name « ${NOM_CLIENT} » -certfile ${PATH_INSTALL}/ca/cacert.pem -caname « ${NOM_DOMAINE} » -out ${PATH_INSTALL}/certs/${NOM_CLIENT}.p12[/code]

 

Ici, on renseigne uniquement /etc/ipsec.user.conf.

[code lang= »shell »]cat << EOF >> /etc/ipsec.user.conf
conn ${NOM_CLIENT}
${TAB}keyexchange=ikev2
${TAB}left=%any
${TAB}leftsubnet=${NET_GREEN}
${TAB}leftcert=hostcert.pem
${TAB}leftfirewall=yes
${TAB}right=%any
${TAB}rightsourceip=${IP_VPN_CLIENT}
${TAB}eap_identity=${NOM_CLIENT}
${TAB}leftid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_DOMAINE}, OU=Serveur VPN, emailAddress=${EMAIL} »
${TAB}rightid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL} »
EOF
[/code]

A.4.1.b) Via eap-mschapv2

Ici, on renseigne /etc/ipsec.user.conf et /etc/ipsec.user.secret.

[code lang= »shell »]cat << EOF >> /etc/ipsec.user.conf
conn ${NOM_CLIENT}
${TAB}keyexchange=ikev2
${TAB}authby=rsasig
${TAB}left=%any
${TAB}leftsubnet=${NET_GREEN}
${TAB}leftauth=pubkey
${TAB}leftcert=hostcert.pem
${TAB}leftfirewall=yes
${TAB}right=%any
${TAB}rightsourceip=${IP_VPN_CLIENT}
${TAB}rightauth=eap-mschapv2
${TAB}rightsendcert=never
${TAB}eap_identity=%any
${TAB}auto=add
${TAB}leftid=%any # Si défini comme ci dessous, la connexion n’est pas accepté la premier fois.
${TAB}# leftid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_DOMAINE}, OU=Serveur VPN, emailAddress=${EMAIL} »
${TAB}rightid=%any
EOF
cat << EOF >> /etc/ipsec.user.secrets
${NOM_CLIENT} : EAP « ${PASSWORD} »
EOF[/code]

A.4.2) Iphone

Il est demandé un mot de passe lors de la génération du fichier .p12. Il sera demandé au client lors de l’importation du certificat.

[code lang= »shell »]ipsec pki –gen –outform pem > ${PATH_INSTALL}/private/${NOM_CLIENT}key.pem
ipsec pki –pub –in ${PATH_INSTALL}/private/${NOM_CLIENT}key.pem | ipsec pki –issue –cacert ${PATH_INSTALL}/ca/cacert.pem –cakey ${PATH_INSTALL}/private/cakey.pem –dn « C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL} » –flag serverAuth –flag ikeIntermediate –outform pem > ${PATH_INSTALL}/certs/${NOM_CLIENT}cert.pem

# Fichier p12 pour notre client iphone
openssl pkcs12 -export -inkey ${PATH_INSTALL}/private/${NOM_CLIENT}key.pem -in ${PATH_INSTALL}/certs/${NOM_CLIENT}cert.pem -name « ${NOM_CLIENT} » -certfile ${PATH_INSTALL}/ca/cacert.pem -caname « ${NOM_DOMAINE} » -out ${PATH_INSTALL}/certs/${NOM_CLIENT}.p12[/code]

 

Ici, on renseigne /etc/ipsec.user.conf et /etc/ipsec.user.secret.

[code lang= »shell »]cat << EOF >> /etc/ipsec.user.conf
conn ${NOM_CLIENT}
${TAB}keyexchange=ikev1
${TAB}authby=xauthrsasig
${TAB}xauth=server
${TAB}left=%defaultroute
${TAB}leftsubnet=${NET_GREEN}
${TAB}leftcert=hostcert.pem
${TAB}leftfirewall=yes
${TAB}right=%any
${TAB}rightsourceip=${IP_VPN_CLIENT}
${TAB}rightcert=${NOM_CLIENT}cert.pem
${TAB}leftid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_DOMAINE}, OU=Serveur VPN, emailAddress=${EMAIL} »
${TAB}rightid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL} »
${TAB}pfs=no
${TAB}auto=add
EOF

cat << EOF >> /etc/ipsec.user.secrets
${NOM_CLIENT} : XAUTH « ${PASSWORD} »
EOF[/code]

 

A.4.3) Debian : Attention, c’est soit via certificat clé privé/public ou via eap-mschapv2.

A.4.3.a) Via certificat clé privé/public

Il est demandé un mot de passe lors de la génération du fichier .p12. Il sera demandé au client lors de l’importation du certificat.

[code lang= »shell »]ipsec pki –gen –outform pem > ${PATH_INSTALL}/private/${NOM_CLIENT}key.pem
ipsec pki –pub –in ${PATH_INSTALL}/private/${NOM_CLIENT}key.pem | ipsec pki –issue –cacert ${PATH_INSTALL}/ca/cacert.pem –cakey ${PATH_INSTALL}/private/cakey.pem –dn « C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL} » –flag serverAuth –flag ikeIntermediate –outform pem > ${PATH_INSTALL}/certs/${NOM_CLIENT}cert.pem

# Fichier p12 pour notre client Debian
openssl pkcs12 -export -inkey ${PATH_INSTALL}/private/${NOM_CLIENT}key.pem -in ${PATH_INSTALL}/certs/${NOM_CLIENT}cert.pem -name « ${NOM_CLIENT} » -certfile ${PATH_INSTALL}/ca/cacert.pem -caname « ${NOM_DOMAINE} » -out ${PATH_INSTALL}/certs/${NOM_CLIENT}.p12[/code]

 

Ici, on renseigne uniquement /etc/ipsec.user.conf.

[code lang= »shell »]cat << EOF >> /etc/ipsec.user.conf

conn ${NOM_CLIENT}
${TAB}keyexchange=ikev2
${TAB}left=%any
${TAB}leftsubnet=${NET_GREEN}
${TAB}leftcert=hostcert.pem
${TAB}leftfirewall=yes
${TAB}right=%any
${TAB}rightsourceip=${IP_VPN_CLIENT}
${TAB}rightfirewall=yes
${TAB}leftid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_DOMAINE}, OU=Serveur VPN, emailAddress=${EMAIL} »
${TAB}rightid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL} »
${TAB}auto=add
EOF

[/code]

 

A.4.3.b) Via eap-mschapv2

Ici, on renseigne /etc/ipsec.user.conf et /etc/ipsec.user.secret.

[code lang= »shell »]cat << EOF >> /etc/ipsec.user.conf
conn ${NOM_CLIENT}
${TAB}keyexchange=ikev2
${TAB}authby=rsasig
${TAB}left=%any
${TAB}leftsubnet=${NET_GREEN}
${TAB}leftauth=pubkey
${TAB}leftcert=hostcert.pem
${TAB}leftfirewall=yes
${TAB}right=%any
${TAB}rightsourceip=${IP_VPN_CLIENT}
${TAB}rightauth=eap-mschapv2
${TAB}rightsendcert=never
${TAB}eap_identity=${NOM_CLIENT}
${TAB}auto=add
${TAB}leftid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_DOMAINE}, OU=Serveur VPN, emailAddress=${EMAIL} »
${TAB}rightid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL} »
${TAB}rightfirewall=yes
EOF

cat << EOF >> /etc/ipsec.user.secrets
‘C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_DOMAINE}, OU=Serveur VPN, emailAddress=${EMAIL}’ – ‘C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL}’ : EAP « ${PASSWORD} »
EOF[/code]

B) Mise en place côté client

Se connecter sur la page d’ipfire Service->IPSEC avec le futur client, activer le serveur et télécharger soit le fichier p12 ou que le certificat d’autorité dans le cas de eap-mschapv2.

B.1.a) Windows 7: Import de certificat

Dans la console mmc, ajouter à la racine de la console le logiciel certificat(ordinateur) et se placer dans Certificat->Personnel->Certificat(ordinateur).

ipsecVia eap-mschapv2 : importer le fichier cacert.pem puis déplacer sous Certificats (ordinateur local) -> Autorité de certification racines de confiance -> Certificats.

Via certificat clé privé/public : Importer le fichier .p12, renseigner le mot de passe choisit lors de la génération du certificat et déplacer cacert.pem sous Certificats (ordinateur local) -> Autorité de certification racines de confiance -> Certificats.

B.1.b) Windows 7: Création de la connexion

Dernière étape, Ouvrir le centre réseau et partage, configurer une nouvelle connexion ou un nouveau réseau, Connexion à votre espace de travail. Dans l’adresse Internet, renseigner ce que vous avez mis au début dans les variables en nom de domaine et valider.

Via eap-mschapv2: dans la fenêtre suivante renseigné le nom d’utilisateur et le mot de passe, si problème vérifié que l’authentification est EAP-MSCHAP version 2.

Via certificat clé privé/public: si problème vérifié que l’authentification utilise les certificats de l’ordinateur.

B.2) Iphone

Avec l’iphone, il suffit de se connecter à la page du serveur et de télécharger le certificat racine et le certificat correspondant à l’appareil. Il est demandé le mot de passe lors de la génération du certificat.

Dernière étape, dans réglage->Général->VPN, Ajouter une configuration VPN… Sous l’onglet IPSec, le serveur correspond au CN du serveur VPN, le compte est le nom du client et le mot de passe. Utiliser le certificat et dans la liste selectionner celui que vous venez d’ajouter. Revenir au menu VPN et lancer la connexion.

B.3) Debian

Pour commencer il faut s’assurer que le paquet strongswan soit bien installé et dans le cas de mschapv2, le paquet libcharon-extra-plugins. Il faut redéfinir exactement les mêmes variables volatiles qu’au début.

[code lang= »shell »]NOM_DOMAINE=example.com #peut-être une adresse IP
WORKGROUP=’Internet Group’
PAYS=FR
EMAIL=user@${NOM_DOMAINE}
STATE=’Ma Région’
TOWN=’Ma ville’
NOM_CLIENT=Nom_de_Client_a_choisir
IP_VPN_CLIENT=10.0.0.1
PASSWORD=Motdepasse
NET_GREEN=0.0.0.0/0 # permet l’accès du VPN à n’importe quel réseau à restreindre si besoin
[/code]

Importer directement depuis le shell.

[code lang= »shell »]scp ipfire:/etc/ipsec.d/cacerts/cacert.pem /etc/ipsec.d/cacerts/cacert.pem
scp ipfire:/etc/ipsec.d/certs/${NOM_CLIENT}cert.pem /etc/ipsec.d/certs/${NOM_CLIENT}cert.pem
scp ipfire:/var/ipfire/private/${NOM_CLIENT}key.pem /etc/ipsec.d/private/${NOM_CLIENT}key.pem
[/code]

B.3.a) Via certificat clé privé/public

Ici, on renseigne uniquement /etc/ipsec.user.conf.

[code lang= »shell »]cat << EOF >> /etc/ipsec.conf
conn ${NOM_CLIENT}
${TAB}auto=add
${TAB}keyexchange=ikev2
${TAB}leftcert=${NOM_CLIENT}cert.pem
${TAB}leftfirewall=yes
${TAB}leftsourceip=${IP_VPN_CLIENT}
${TAB}right=${NOM_DOMAINE}
${TAB}rightsubnet=${NET_GREEN}
${TAB}rightfirewall=yes
${TAB}rightid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_DOMAINE}, OU=Serveur VPN, emailAddress=${EMAIL} »
${TAB}leftid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL} »
EOF
cat << EOF >> /etc/ipsec.secrets
: RSA /etc/ipsec.d/private/${NOM_CLIENT}key.pem
EOF
[/code]

B.3.b) Via eap-mschapv2

Ici, on renseigne /etc/ipsec.user.conf et /etc/ipsec.user.secret.

[code lang= »shell »]cat << EOF >> /etc/ipsec.conf
conn ${NOM_CLIENT}
${TAB}auto=add
${TAB}keyexchange=ikev2
${TAB}leftfirewall=yes
${TAB}leftsourceip=${IP_VPN_CLIENT}
${TAB}right=${NOM_DOMAINE}
${TAB}rightsubnet=${NET_GREEN}
${TAB}leftid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL} »
${TAB}rightid= »C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_DOMAINE}, OU=Serveur VPN, emailAddress=${EMAIL} »
${TAB}rightauth=pubkey
${TAB}leftauth=eap
${TAB}eap_identity=${NOM_CLIENT}
EOF
cat << EOF >> /etc/ipsec.secrets
‘C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_DOMAINE}, OU=Serveur VPN, emailAddress=${EMAIL}’ – ‘C=${PAYS}, ST=${STATE}, L=${TOWN}, O=${WORKGROUP}, CN=${NOM_CLIENT}.${NOM_DOMAINE}, OU=Client VPN, emailAddress=${EMAIL}’ : EAP « ${PASSWORD} »
EOF[/code]

On redemarre le serveur ipsec et lance la connexion ipsec.

[code lang= »shell »]/etc/init.d/ipsec restart
ipsec up ${NOM_CLIENT}[/code]

Attention, par ssh, si la connexion se fait bien, vous perdez le contrôle de la session.