Créer un tunnel VPN IPSec point à point (en mode transport) sur Debian
IPSec est un protocole de chiffrement de la couche IP des communications Internet. Ce guide crée un tunnel chiffré sécurisant les communications entre deux hôtes.
Ce guide est testé sur:
- Debian 7.0 Wheezy
Paramètres
Renseignez l'adresse IP du pair distant:
REMOTE_IP="xx.xx.xx.xx"
Renseignez le nom de l'interface réseau connectée au réseau du pair distant:
LOCAL_INET="eth0"
Renseignez les clefs de chiffrement hmac-md5 du protocole AH (optionnel, doit être partagé entre les deux pairs):
# AH_KEY_LR="0x70f83693013f5b12b30a893dce771198"
# AH_KEY_RL="0x70f83693013f5b12b30a893dce771198"
Renseignez les Security Parameter Index (SPI) pour le protocole AH (optionnel, doit être partagé entre les deux pairs):
# AH_SPI_LR="15700"
# AH_SPI_RL="24500"
Renseignez les clefs de chiffrement 3des-cbc du protocole ESP (optionnel, doit être partagé entre les deux pairs):
# ESP_KEY_LR="0xb2dd4108a04b0c7dd087f1dd169036565ce4d7cb3549ed92"
# ESP_KEY_RL="0xb2dd4108a04b0c7dd087f1dd169036565ce4d7cb3549ed92"
Renseignez les Security Parameter Index (SPI) pour le protocole ESP (optionnel, doit être partagé entre les deux pairs):
# ESP_SPI_LR="15701"
# ESP_SPI_RL="24501"
Installation
Détectez l'adresse IP du pair local:
if [ -z "${LOCAL_IP}" ]; then
LOCAL_IP="$(command ifconfig "${LOCAL_INET}" \
| command grep 'inet ' \
| command sed -e 's/^.*inet [^:]*:\([^ ]*\) .*$/\1/')"
fi
Générez les clefs de chiffrement hmac-md5 pour le protocole AH, si nécessaire:
if [ -z "${AH_KEY_RL}" -a -z "${AH_KEY_LR}" ]; then
AH_KEY_RL="0x$(command hexdump -e '1/1 "%02x"' '/dev/urandom' -n 16)"
AH_KEY_LR="0x$(command hexdump -e '1/1 "%02x"' '/dev/urandom' -n 16)"
fi
Générez les Security Parameter Index (SPI) pour le protocole AH, si nécessaire:
if [ -z "${AH_SPI_RL}" -a -z "${AH_SPI_LR}" ]; then
AH_SPI_RL="$((((${RANDOM} + ${RANDOM}) % 63488) + 256))"
AH_SPI_LR="$((((${RANDOM} + ${RANDOM}) % 63488) + 256))"
fi
Générez les clefs de chiffrement 3des-cbc pour le protocole ESP, si nécessaire:
if [ -z "${ESP_KEY_RL}" -a -z "${ESP_KEY_LR}" ]; then
ESP_KEY_RL="0x$(command hexdump -e '1/1 "%02x"' '/dev/urandom' -n 24)"
ESP_KEY_LR="0x$(command hexdump -e '1/1 "%02x"' '/dev/urandom' -n 24)"
fi
Générez les Security Parameter Index (SPI) pour le protocole ESP, si nécessaire:
if [ -z "${ESP_SPI_RL}" -a -z "${ESP_SPI_LR}" ]; then
ESP_SPI_RL="$((((${RANDOM} + ${RANDOM}) % 63488) + 256))"
ESP_SPI_LR="$((((${RANDOM} + ${RANDOM}) % 63488) + 256))"
fi
Déterminez le nom du fichier de configuration:
CONFIG_FILE="/etc/ipsec-tools.d/transport-${REMOTE_IP//\./-}.conf"
Préparation de l'environnement
Installez les logiciels nécessaires:
command apt-get install ipsec-tools
Mise en place du tunnel
Activez les règles d'initialisation de la configuration:
command sed -i \
-e 's/# flush/flush/' \
-e 's/# spdflush/spdflush/' \
'/etc/ipsec-tools.conf'
Initialisez le fichier de configuration d'IPSec:
echo "#"\!"/usr/sbin/setkey
" > "${CONFIG_FILE}"
Configurez le protocole AH:
echo "
# AH SAs using 128 bit long keys
add ${REMOTE_IP} ${LOCAL_IP} ah ${AH_SPI_RL} -A hmac-md5 ${AH_KEY_RL};
add ${LOCAL_IP} ${REMOTE_IP} ah ${AH_SPI_LR} -A hmac-md5 ${AH_KEY_LR};
" >> "${CONFIG_FILE}"
Configurez le protocole ESP:
echo "
# ESP SAs using 192 bit long keys (168 + 24 parity)
add ${REMOTE_IP} ${LOCAL_IP} esp ${ESP_SPI_RL} -E 3des-cbc ${ESP_KEY_RL};
add ${LOCAL_IP} ${REMOTE_IP} esp ${ESP_SPI_LR} -E 3des-cbc ${ESP_KEY_LR};
" >> "${CONFIG_FILE}"
Configurez le tunnel utilisant les transports AH et ESP:
echo "# Tunnel setup
spdadd ${LOCAL_IP} ${REMOTE_IP} any -P out ipsec esp/transport//require ah/transport//require; spdadd ${REMOTE_IP} ${LOCAL_IP} any -P in ipsec esp/transport//require ah/transport//require;
" >> "${CONFIG_FILE}"
Sécurisez le fichier de configuration:
command chmod 750 "${CONFIG_FILE}"
Démarrez le tunnel:
/etc/init.d/setkey start
Configuration du pair distant
Exécutez la procédure d'installation de ce guide sur le pair distant avec les paramètres fournis par:
echo "# Remote peer setup parameters:
REMOTE_IP='${LOCAL_IP}'
LOCAL_IP='${REMOTE_IP}'
AH_KEY_RL='${AH_KEY_LR}'
AH_KEY_LR='${AH_KEY_RL}'
AH_SPI_RL='${AH_SPI_LR}'
AH_SPI_LR='${AH_SPI_RL}'
ESP_KEY_RL='${ESP_KEY_LR}'
ESP_KEY_LR='${ESP_KEY_RL}'
ESP_SPI_RL='${ESP_SPI_LR}'
ESP_SPI_LR='${ESP_SPI_RL}'
"
Une fois le pair distant configuré, les communications entre les deux hôtes sont chiffrées.
Remerciements
- Merci à GuiguiAbloc (fr) pour Cluster Haute-Disponibilité chez OVH, avec IpFailover, Heartbeat et DRBD via IPSEC (fr).
- Merci aux auteurs de IPSecHowTo (en) dans la documentation Ubuntu (en).