Tunnel VPN IPIP IPsec entre la machine Linux et Mikrotik derrière le fournisseur NAT

linux: Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-générique x86_64)

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

Miktoïk : CCR 1009, RouterOS 6.46.5

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

Nous allons créer un tunnel IPsec sur une machine Linux en utilisant racoon. Je ne décrirai pas les détails, il y en a un bon article у vvpoloskin.

Installez les packages requis :

sudo install racoon ipsec-tools

Nous configurons Racoon, il agira conditionnellement comme serveur IPSec. Étant donné que Mikrotik en mode principal ne peut pas transmettre un identifiant client supplémentaire et que l'adresse IP externe par laquelle il se connecte à Linux est dynamique, l'utilisation d'une clé pré-partagée (autorisation par mot de passe) ne fonctionnera pas, car le mot de passe doit correspondre soit à l'adresse IP de l'hôte qui se connecte, ou avec l'identifiant.

Nous utiliserons l'autorisation à l'aide des clés RSA.

Le démon racoon utilise des clés au format RSA et mikrotik utilise le format PEM. Si vous générez des clés à l'aide de l'utilitaire plainrsa-gen fourni avec racoon, vous ne pourrez pas convertir la clé publique de Mikrotika au format PEM avec son aide - elle ne se convertit que dans un seul sens : PEM vers RSA. Ni openssl ni ssh-keygen n'ont pu lire la clé générée par plainrsa-gen, donc la conversion ne sera pas non plus possible en les utilisant.

Nous allons générer une clé PEM en utilisant openssl puis la convertir en racoon en utilisant 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 mettrons les clés reçues dans le dossier : /etc/racoon/certs/server. N'oubliez pas de définir le propriétaire de l'utilisateur sous le nom duquel le démon racoon est lancé (généralement root) sur 600 autorisations.

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

Téléchargez la clé server-name.pub.pem sur mikrotik : Menu « Fichiers » - « Télécharger ».

Ouvrez la section « IP » - « IP sec » - onglet « Clés ». Maintenant, nous générons des clés - le bouton « Générer la clé », puis exportons la clé publique mikrotika « Expor Pub. Clé", vous pouvez le télécharger depuis la section "Fichiers", faites un clic droit sur le fichier - "Télécharger".

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

La clé publique Mikrotik doit être convertie

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

et mettez-le dans le dossier /etc/racoon/certs, sans oublier le propriétaire et les droits.

configuration de racoon avec commentaires : /etc/racoon/racoon.conf

log info; # Уровень логирования, при отладке используем Debug или Debug2.

listen {

    isakmp 1.1.1.1 [500]; # Адрес и порт, на котором будет слушать демон.
    isakmp_natt 1.1.1.1 [4500]; # Адрес и порт, на котором будет слушать демон для клиентов за NAT.
    strict_address; # Выполнять обязательную проверку привязки к указанным выше IP.
}

path certificate "/etc/racoon/certs"; # Путь до папки с сертификатами.

remote anonymous { # Секция, задающая параметры для работы демона с ISAKMP и согласования режимов с подключающимися хостами. Так как IP, с которого подключается Mikrotik, динамический, то используем anonymous, что разрешает подключение с любого адреса. Если IP у хостов статический, то можно указать конкретный адрес и порт.

    passive on; # Задает "серверный" режим работы демона, он не будет пытаться инициировать подключения.
    nat_traversal on; # Включает использование режима NAT-T для клиентов, если они за NAT. 
    exchange_mode main; # Режим обмена параметрами подключения, в данном случае ---согласование.
    my_identifier address 1.1.1.1; # Идентифицируем наш linux хост по его ip адресу.
    certificate_type plain_rsa "server/server-name.priv.key"; # Приватный ключ сервера.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Публичный ключ Mikrotik.

    proposal_check claim; # Режим согласования параметров ISAKMP туннеля. Racoon будет использовать значения подключающегося хоста (инициатора) для срока действия сессии                   и длины ключа, если его срок действия сессии больше, или длина его ключа короче, чем у инициатора. Если срок действия сессии короче, чем у инициатора, racoon использует собственное значение срока действия сессии и будет отправлять сообщение RESPONDER-LIFETIME.
    proposal { # Параметры ISAKMP туннеля.

        encryption_algorithm aes; # Метод шифрования ISAKMP туннеля.
        hash_algorithm sha512; # Алгоритм хеширования, используемый для ISAKMP туннеля.
        authentication_method rsasig; # Режим аутентификации для ISAKMP туннеля - по RSA ключам.
        dh_group modp2048; # Длина ключа для алгоритма Диффи-Хеллмана при согласовании ISAKMP туннеля.
        lifetime time 86400 sec; Время действия сессии.
    }

    generate_policy on; # Автоматическое создание ESP туннелей из запроса, пришедшего от подключающегося хоста.
}

sainfo anonymous { # Параметры ESP туннелей, anonymous - указанные параметры будут использованы как параметры по умолчанию. Для разных клиентов, портов, протоколов можно              задавать разные параметры, сопоставление происходит по ip адресам, портам, протоколам.

    pfs_group modp2048; # Длина ключа для алгоритма Диффи-Хеллмана для ESP туннелей.
    lifetime time 28800 sec; # Срок действия ESP туннелей.
    encryption_algorithm aes; # Метод шифрования ESP туннелей.
    authentication_algorithm hmac_sha512; # Алгоритм хеширования, используемый для аутентификации ESP туннелей.
    compression_algorithm deflate; # Сжимать передаваемые данные, алгоритм сжатия предлагается только один.
}

configuration du micro

Retour à la rubrique "IP" - "IPsec"

Onglet "Profils"
Paramètre
Valeur

Nom
À votre discrétion (par défaut par défaut)

Algorithme de hachage
sha512

Algorithme de chiffrement
as-128

Groupe DH
modp2048

Proposhal_check
réclamer

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

Traversée NAT
vrai (cochez la case)

DPD
120

Échec maximal DPD
5

Onglet Pairs
Paramètre
Valeur

Nom
À votre discrétion (ci-après dénommé MyPeer)

Adresse
1.1.1.1 (machines Linux IP)

Adresse locale
10.0.0.2 (microinterface IP WAN)

Profil
défaut

Mode d'échange
principal

Revenu
non

Envoyer INITIAL_CONTACT
oui

Onglet Proposition
Paramètre
Valeur

Nom
À votre discrétion (ci-après dénommée MyPeerProposal)

Auth. Algorithmes
sha512

Encré. Algorithmes
aes-128-cbc

Durée de vie
08:00:00

Groupe PSF
modp2048

Onglet "Identités"
Paramètre
Valeur

Poire
Mon pair

Atuh. Méthode
clé rsa

ACTIVITES
mikrotik.privet.key

Clé à distance
nom-du-serveur.pub.pem

Groupe de modèles de stratégie
défaut

Chaîne sans piste
est vide

Mon type d'identification
auto

Type d'identification à distance
auto

Correspondance par
identifiant distant

Configuration du mode
est vide

Générer une stratégie
aucune

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

Poire
Mon pair

Tunnel
oui

Src. Adresse
192.168.0.0/30

Destination Adresse
192.168.0.0/30

Passerelle
255 (tous)

Modèle
non

Onglet "Politiques - Action"
Paramètre
Valeur

Action
crypter

Niveau
exiger

Protocoles IPsec
esp

Proposition
Ma proposition par les pairs

Très probablement, comme moi, vous avez configuré snat/masquerade sur votre interface WAN ; cette règle doit être ajustée pour que les paquets ipsec sortants entrent dans notre tunnel :
Allez dans la rubrique "IP" - "Pare-feu".
Onglet "NAT", ouvrez notre règle snat/mascarade.

Onglet Avancé
Paramètre
Valeur

Politique IPsec
sortie : aucune

Redémarrer le démon raton laveur

sudo systemctl restart racoon

Si racoon ne démarre pas au redémarrage, alors il y a une erreur dans la configuration ; dans syslog, racoon affiche des informations sur le numéro de ligne dans lequel l'erreur a été détectée.

Lorsque le système d'exploitation démarre, le démon racoon démarre avant que les interfaces réseau ne soient affichées, et nous avons spécifié l'option strict_address dans la section d'écoute ; vous devez ajouter l'unité racoon au fichier systemd.
/lib/systemd/system/racoon.service, dans la section [Unit], ligne After=network.target.

Maintenant, nos tunnels IPSec devraient être opérationnels, regardez 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 через который подключается 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 через который подключается 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 через который подключается mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Si les tunnels ne sont pas opérationnels, consultez syslog ou journalctl -u racoon.

Vous devez maintenant configurer les interfaces L3 afin que le trafic puisse être acheminé. Il existe différentes options, nous utiliserons IPIP, puisque Mikrotik le prend en charge, j'utiliserais vti, mais malheureusement, il n'a pas encore été implémenté dans Mikrotik. Il diffère d'IPIP en ce sens qu'il peut en outre encapsuler la multidiffusion et mettre des fwmarks sur les paquets, grâce auxquels ils peuvent être filtrés dans iptables et iproute2 (routage basé sur des politiques). Si vous avez besoin d'un maximum de fonctionnalités, alors, par exemple, GRE. Mais n’oubliez pas que nous payons pour des fonctionnalités supplémentaires avec une grosse tête aérienne.

Vous pouvez voir la traduction d'une bonne revue des interfaces de tunnel ici.

Sous 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 désormais ajouter des itinéraires 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 nos routes soient activées après un redémarrage, nous devons décrire l'interface dans /etc/network/interfaces et y ajouter des routes dans la publication, ou tout écrire dans un seul fichier, par exemple, /etc/ ipip-ipsec0.conf et extrayez-le via la post-up, n'oubliez pas le propriétaire du fichier, les 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 », ajouter une nouvelle interface « Tunnel IP » :

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

Nom
À votre discrétion (ci-après dénommé IPIP-IPsec0)

MTU
1480 (si non spécifié, Mikrotik commence à réduire le mtu à 68)

Adresse locale
192.168.0.2

Adresse distante
192.168.0.1

Secret IPsec
Désactivez le champ (sinon un nouveau Peer sera créé)

Rester en vie
Désactivez le champ (sinon l'interface s'éteindra constamment, puisque mikrotika a son propre format pour ces packages et ne fonctionne pas avec Linux)

DSCP
hériter

Ne fragmentez pas
aucune

Pince TCP MSS
oui

Autoriser le chemin rapide
oui

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

Paramètre
Valeur

Adresse
192.168.0.2/30

Interfaces
IPIP-IPsec0

Vous pouvez désormais ajouter des routes au réseau derrière une machine Linux ; lors de l'ajout d'une route, la passerelle sera notre interface IPIP-IPsec0.

PS

Étant donné que notre serveur Linux est transitif, il est logique d'y définir le paramètre Clamp TCP MSS pour les interfaces ipip :

créez un 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

J'ai nginx exécuté sur le réseau derrière mikrotik (ip 10.10.10.1), rendez-le accessible depuis Internet, ajoutez-le à /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
#На mikrotik, в таблице mangle, надо добавить правило route с назначением 192.168.0.1 для пакетов с адресом источника 10.10.10.1 и портов 80, 443.

# Так же на linux работает OpenVPN сервер 172.16.0.1/24, для клиентов которые используют подключение к нему в качестве шлюза даем доступ в интернет
-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 autorisations appropriées à iptables si les filtres de paquets sont activés.

Être en bonne santé!

Source: habr.com

Ajouter un commentaire