Tunnel VPN IPIP IPsec entre une machine Linux et Mikrotik derrière un NAT de fournisseur.

Linux : Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-generic x86_64)

  • Eth0 1.1.1.1/32 IP externe
  • ipip-ipsec0 192.168.0.1/30 sera notre tunnel

Miktoik : CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 IP interne de notre fournisseur. L'IP externe NAT du fournisseur est dynamique.
  • ipip-ipsec0 192.168.0.2/30 sera notre tunnel

Le tunnel IPsec sur la machine Linux sera mis en place avec racoon. Je ne vais pas décrire les détails, il y a un bon article au vvpoloskin.

Installons les paquets nécessaires :

sudo install racoon ipsec-tools

Configurons racoon, qui servira d’IPsec serveur. Comme Mikrotik en mode principal ne peut pas transmettre d'identifiant client supplémentaire, et que l'adresse IP externe par laquelle il se connecte à Linux est dynamique, il ne sera pas possible d'utiliser une clé pré-partagée (authentification par mot de passe), car le mot de passe doit correspondre soit à l'adresse IP de l'hôte se connectant, soit à l'identifiant.

Nous allons utiliser une authentification par clés RSA.

Le démon racoon utilise des clés au format RSA, tandis que Mikrotik utilise le format PEM. Si vous générez des clés avec l'outil plainrsa-gen inclus avec racoon, vous ne pourrez pas convertir la clé publique pour Mikrotik en format PEM avec cet outil — il ne convertit que dans un sens : PEM en RSA. La clé générée par plainrsa-gen n'a été lisible ni par openssl, ni par ssh-keygen, donc vous ne pourrez pas non plus effectuer la conversion avec eux.

Nous allons générer une clé PEM avec openssl, puis la convertir pour racoon avec plainrsa-gen :

#  Генерируем ключ
openssl genrsa -out server-name.pem 1024
# Извлекаем публичный ключ
openssl rsa -in server-name.pem -pubout > server-name.pub.pem
# Конвертируем
plainrsa-gen -i server-name.pem -f server-name.privet.key
plainrsa-gen -i server-name.pub.pem -f server-name.pub.key

Nous placerons les clés obtenues dans le dossier : /etc/racoon/certs/server. N'oubliez pas de définir le propriétaire à l'utilisateur sous lequel le démon racoon s'exécute (en général root), avec les droits 600.

Je décrirai la configuration de Mikrotik lors de la connexion via WinBox.

Nous allons télécharger la clé server-name.pub.pem dans Mikrotik : Menu « Fichiers » — « Téléverser ».

Ouvrez la section « IP » — « IP sec » — onglet « Clés ». Maintenant, générons les clés — bouton « Générer la clé », puis exportons la clé publique de Mikrotik « Exporter la clé publique », vous pouvez la télécharger à partir de la section « Fichiers », clic droit sur le fichier — « Télécharger ».

Nous importons la clé publique de racoon, « Importer », dans la liste déroulante du champ « Nom de fichier », nous recherchons le server-name.pub.pem que nous avons téléchargé précédemment.

La clé publique de Mikrotik doit être convertie

plainrsa-gen -i mikrotik.pub.pem -f mikrotik.pub.key

et placée dans le dossier /etc/racoon/certs sans oublier le propriétaire et les droits.

Configuration de racoon avec des commentaires : /etc/racoon/racoon.conf

log info; # Niveau de journalisation, utilisez Debug ou Debug2 pour le débogage.

listen {

    isakmp 1.1.1.1 [500]; # Adresse et port sur lesquels le démon écoutera.
    isakmp_natt 1.1.1.1 [4500]; # Adresse et port sur lesquels le démon écoutera pour les clients derrière un NAT.
    strict_address; # Effectuer la vérification obligatoire de liaison à l'adresse IP spécifiée ci-dessus.
}

path certificate "/etc/racoon/certs"; # Chemin vers le dossier contenant les certificats.

remote anonymous { # Section définissant les paramètres pour le fonctionnement du démon avec ISAKMP et la négociation des modes avec les hôtes connectés. Comme l'adresse IP à partir de laquelle Mikrotik se connecte est dynamique, nous utilisons anonymous, ce qui permet une connexion depuis n'importe quelle adresse. Si les IP des hôtes sont statiques, une adresse et un port spécifiques peuvent être spécifiés.

    passive on; # Définit le mode "serveur" pour le démon, il ne tentera pas d'initier des connexions.
    nat_traversal on; # Active l'utilisation du mode NAT-T pour les clients, s'ils sont derrière un NAT.
    exchange_mode main; # Mode d'échange pour les paramètres de connexion, dans ce cas --- négociation.
    my_identifier address 1.1.1.1; # Nous identifions notre hôte Linux par son adresse IP.
    certificate_type plain_rsa "server/server-name.priv.key"; # Clé privée du serveur.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Clé publique de Mikrotik.

    proposal_check claim; # Mode de négociation des paramètres du tunnel ISAKMP. Racoon utilisera les valeurs de l'hôte connectant (initiateur) pour la durée de session et la longueur de la clé, si sa durée de session est plus longue ou si sa clé est plus courte que celle de l'initiateur. Si la durée de session est plus courte que celle de l'initiateur, Racoon utilisera sa propre valeur de durée de session et enverra un message RESPONDER-LIFETIME.
    proposal { # Paramètres du tunnel ISAKMP.

        encryption_algorithm aes; # Méthode de chiffrement du tunnel ISAKMP.
        hash_algorithm sha512; # Algorithme de hachage utilisé pour le tunnel ISAKMP.
        authentication_method rsasig; # Méthode d'authentification pour le tunnel ISAKMP - par clés RSA.
        dh_group modp2048; # Longueur de clé pour l'algorithme de Diffie-Hellman lors de la négociation du tunnel ISAKMP.
        lifetime time 86400 sec; # Durée de vie de la session.
    }

    generate_policy on; # Création automatique de tunnels ESP à partir de la demande reçue de l'hôte connectant.
}

sainfo anonymous { # Paramètres des tunnels ESP, anonymous - les paramètres spécifiés seront utilisés par défaut. Pour différents clients, ports, protocoles, divers paramètres peuvent être définis, la correspondance se fait par adresses IP, ports, protocoles.

    pfs_group modp2048; # Longueur de clé pour l'algorithme de Diffie-Hellman pour les tunnels ESP.
    lifetime time 28800 sec; # Durée de vie des tunnels ESP.
    encryption_algorithm aes; # Méthode de chiffrement des tunnels ESP.
    authentication_algorithm hmac_sha512; # Algorithme de hachage utilisé pour l'authentification des tunnels ESP.
    compression_algorithm deflate; # Comprimer les données transmises, un seul algorithme de compression est proposé.
}

Configuration mikrotik

Revenons à la section "IP" — "IPsec"

Onglet "Profils"
Paramètre
Valeur

Nom
À votre convenance (par défaut default)

Algorithme de hachage
sha512

Algorithme de chiffrement
aes-128

Groupe DH
modp2048

Proposhal_check
réclamation

Durée de vie
1d 00:00:00

NAT Traversal
true (cochez la case)

DPD
120

Échec maximum de DPD
5

Onglet "Pairs"
Paramètre
Valeur

Nom
À votre convenance (plus loin MyPeer)

Address
1.1.1.1 (IP de la machine linux)

Adresse locale
10.0.0.2 (IP de l'interface WAN de mikrotik)

Profil
default

Mode d'échange
main

Passif
faux

Envoyer INITIAL_CONTACT
true

Onglet "Proposition"
Paramètre
Valeur

Nom
À votre convenance (plus loin MyPeerProposal)

Algorithmes d'authentification
sha512

Algorithmes de chiffrement
aes-128-cbc

Durée de vie
08:00:00

Groupe PFS
modp2048

Onglet "Identités"
Paramètre
Valeur

Pair
MyPeer

Méthode d'authentification
clé rsa

Clé
mikrotik.privet.key

Clé distante
server-name.pub.pem

Groupe de modèles de politique
default

Chaîne Notrack
vide

Mon type d'ID
auto

Type d'ID distant
auto

Correspondre par
id distant

Configuration du mode
vide

Générer une politique
non

Onglet "Politiques — Général"
Paramètre
Valeur

Pair
MyPeer

Tunnel
true

Adresse source
192.168.0.0/30

Adresse de destination
192.168.0.0/30

Protocole
255 (tout)

Modèle
faux

Onglet "Politiques — Action"
Paramètre
Valeur

Action
encrypt

Niveau
requis

Protocoles IPsec
esp

Proposition
MyPeerProposal

Il est probable que vous ayez, comme moi, configuré snat/masquerade sur l'interface WAN, cette règle doit être ajustée pour que les paquets sortants ipsec passent par notre tunnel :
Allons dans la section "IP" — "Firewall".
Onglet "NAT", ouvrez notre règle snat/masquerade.

Onglet "Avancé"
Paramètre
Valeur

Politique IPsec
out : none

Redémarrez le démon racoon

sudo systemctl restart racoon

Si lors du redémarrage racoon ne démarre pas, cela signifie qu'il y a une erreur dans la configuration, dans le syslog racoon affiche des informations sur le numéro de la ligne où l'erreur a été trouvée.

Le démon racoon démarre au moment du chargement du système d'exploitation avant que les interfaces réseau ne soient levées, et nous avons indiqué dans la section listen l'option strict_address, il faut ajouter au fichier systemd de l'unité racoon
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

À présent, nos tunnels ipsec devraient être en ligne, voyons le résultat :

sudo ip xfrm policy

src 192.168.255.0/30 dst 192.168.255.0/30 
    dir out priority 2147483648 
    tmpl src 1.1.1.1 dst "IP NAT par lequel se connecte mikrotik"
        proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
    dir fwd priority 2147483648 
    tmpl src "IP NAT par lequel se connecte mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
    dir in priority 2147483648 
    tmpl src "IP NAT par lequel se connecte mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Si les tunnels ne se sont pas activés, consultez le syslog ou journalctl -u racoon.

Il est maintenant nécessaire de configurer les interfaces L3 afin de pouvoir router le trafic. Diverses options sont disponibles, nous allons utiliser IPIP, car il est pris en charge par Mikrotik. J'aurais utilisé VTI, mais, malheureusement, cela n'a pas encore été implémenté sur Mikrotik. IPIP se distingue par sa capacité à encapsuler des multicasts et à ajouter des balises (fwmark) aux paquets, qui peuvent ensuite être filtrés avec iptables et iproute2 (routing basé sur la politique). Si vous avez besoin d'une fonctionnalité maximale, vous pouvez opter pour GRE. Mais n'oubliez pas que cette fonctionnalité supplémentaire a un coût en termes de surcharge.

Vous pouvez consulter une bonne traduction de l'examen des interfaces de tunnel. ici.

Sur Linux :

# Создаем интерфейс
sudo ip tunnel add ipip-ipsec0 local 192.168.255.1 remote 192.168.255.2 mode ipip
# Активируем
sudo ip link set ipip-ipsec0 up
# Назначаем адрес
sudo ip addr add 192.168.255.1/30 dev ipip-ipsec0

Vous pouvez maintenant ajouter des routes pour les réseaux derrière Mikrotik.

sudo ip route add A.B.C.D/Prefix via 192.168.255.2

Pour que notre interface et les routes se relèvent après un redémarrage, il est nécessaire de décrire l'interface dans /etc/network/interfaces et d'ajouter les routes dans la section post-up, ou de tout rédiger dans un seul fichier, par exemple, /etc/ipip-ipsec0.conf, puis l'exécuter via post-up. N'oubliez pas le propriétaire du fichier, ses droits et rendez-le exécutable.

Ci-dessous un exemple de fichier.

#!/bin/bash
ip tunnel add ipip-ipsec0 local 192.168.255.1 remote 192.168.255.2 mode ipip
ip link set ipip-ipsec0 up
ip addr add 192.168.255.1/30 dev ipip-ipsec0

ip route add A.B.C.D/Prefix via 192.168.255.2

Sur Mikrotik :

Section « Interfaces », ajoutez une nouvelle interface « Tunnel IP » :

Onglet « Tunnel IP » — « Général »
Paramètre
Valeur

Nom
À votre convenance (ci-après IPIP-IPsec0)

MTU
1480 (si non spécifié, alors Mikrotik commencera à réduire la MTU à 68)

Adresse locale
192.168.0.2

Adresse distante
192.168.0.1

Secret Ipsec
Désactivez le champ (sinon, un nouveau pair sera créé)

Keepalive
Désactivez le champ (sinon, l'interface sera constamment désactivée, car Mikrotik a un format propre à ces paquets qui ne fonctionne pas avec Linux)

DSCP
hériter

Ne pas fragmenter
non

Clamp TCP MSS
true

Autoriser le chemin rapide
true

Section « IP » — « Adresses », ajoutez l'adresse :

Paramètre
Valeur

Address
192.168.0.2/30

Interface
IPIP-IPsec0

Vous pouvez maintenant ajouter des routes vers les réseaux derrière la machine Linux. Lors de l'ajout d'une route, la passerelle sera notre interface IPIP-IPsec0.

PS

Étant donné que notre serveur Linux est transit, il est judicieux de définir le paramètre Clamp TCP MSS pour les interfaces IPIP :

créez le fichier /etc/iptables.conf avec le contenu suivant :

*mangle
-A POSTROUTING -o ipip+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
COMMIT

et dans /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

Derrière Mikrotik, j'ai nginx (ip 10.10.10.1) qui fonctionne, faisons-le accessible depuis Internet, ajoutons dans /etc/iptables.conf :

*nat
-A PREROUTING -d 1.1.1.1/32 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.10.10.1
#Sur Mikrotik, dans la table mangle, il faut ajouter une règle route avec la destination 192.168.0.1 pour les paquets avec l'adresse source 10.10.10.1 et les ports 80, 443.

# Un serveur OpenVPN fonctionne également sous Linux avec 172.16.0.1/24, pour les clients qui l'utilisent comme passerelle, nous donnons l'accès Internet
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

N'oubliez pas d'ajouter les permissions appropriées dans iptables si vous avez activé les filtres de paquets.

Soyez en bonne santé !

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster