IPIP IPsec VPN tunel între mașina Linux și Mikrotik din spatele furnizorului NAT

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

  • Eth0 1.1.1.1/32 IP extern
  • ipip-ipsec0 192.168.0.1/30 va fi tunelul nostru

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 IP intern de la furnizor. IP-ul NAT extern al furnizorului este dinamic.
  • ipip-ipsec0 192.168.0.2/30 va fi tunelul nostru

Vom crea un tunel IPsec pe o mașină Linux folosind racoon. Nu voi descrie detaliile, există unul bun articol у vvpoloskin.

Instalați pachetele necesare:

sudo install racoon ipsec-tools

Configuram racoon, acesta va acționa condiționat ca un server ipsec. Deoarece mikrotik în modul principal nu poate transmite un identificator de client suplimentar, iar adresa IP externă prin care se conectează la Linux este dinamică, utilizarea unei chei partajate în prealabil (autorizarea parolei) nu va funcționa, deoarece parola trebuie să fie asociată fie cu adresa IP a lui. gazda de conectare sau cu identificator.

Vom folosi autorizarea folosind chei RSA.

Daemonul raton folosește chei în format RSA, iar mikrotik folosește formatul PEM. Dacă generați chei folosind utilitarul plainrsa-gen care vine cu racoon, atunci nu veți putea converti cheia publică pentru Mikrotika în format PEM cu ajutorul acestuia - se convertește doar într-o singură direcție: PEM în RSA. Nici openssl, nici ssh-keygen nu au putut citi cheia generată de plainrsa-gen, așa că nici conversia nu poate fi efectuată folosindu-le.

Vom genera o cheie PEM folosind openssl și apoi o vom converti pentru racoon folosind 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

Vom pune cheile primite în folderul: /etc/racoon/certs/server. Nu uitați să setați proprietarul utilizatorului sub numele căruia este lansat demonul raton (de obicei root) la 600 de permisiuni.

Voi descrie configurația mikrotik atunci când vă conectez prin WinBox.

Încărcați cheia server-name.pub.pem pe mikrotik: Meniu „Fișiere” - „Încărcare”.

Deschideți secțiunea „IP” - „IP sec” - fila „Chei”. Acum generăm chei - butonul „Generează cheia”, apoi exportăm cheia publică mikrotika „Expor Pub. Cheie”, o puteți descărca din secțiunea „Fișiere”, faceți clic dreapta pe fișier - „Descărcare”.

Importăm cheia publică raton, „Import”, în lista derulantă a câmpului „Nume fișier” căutăm server-name.pub.pem pe care l-am descărcat mai devreme.

Cheia publică mikrotik trebuie convertită

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

si pune-l in folderul /etc/racoon/certs, fara a uita de proprietar si drepturi.

racoon config cu comentarii: /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; # Сжимать передаваемые данные, алгоритм сжатия предлагается только один.
}

mikrotik config

Reveniți la secțiunea „IP” - „IPsec”

fila „Profiluri”.
Parametru
Valoare

Nume si Prenume
La discreția dvs. (în mod implicit)

Algoritmul Hash
sha512

Algoritm de criptare
aes-128

DH-Grup
modp2048

Proposhal_check
pretinde

Toată viața
1 zi 00:00:00

Traversarea NAT
adevărat (bifați caseta)

DPD
120

DPD Eșec maxim
5

fila Peers
Parametru
Valoare

Nume si Prenume
La discreția dvs. (denumită în continuare MyPeer)

Adresă
1.1.1.1 (mașini IP Linux)

Adresă locală
10.0.0.2 (interfață IP WAN mikrotik)

Profil
lipsă

Mod schimb
principal

Pasiv
fals

Trimiteți INITIAL_CONTACT
adevărat

Fila Propunere
Parametru
Valoare

Nume si Prenume
La discreția dvs. (denumită în continuare MyPeerProposal)

Auth. Algoritmi
sha512

Encr. Algoritmi
aes-128-cbc

Toată viața
08:00:00

Grupul PFS
modp2048

Fila „Identități”.
Parametru
Valoare

egal
MyPeer

Atuh. Metodă
cheie rsa

Cheie
mikrotik.privet.key

Cheie la distanță
nume-server.pub.pem

Grup de șabloane de politici
lipsă

Lanțul Notrack
gol

Tipul meu de identitate
Auto

Tip ID de la distanță
Auto

Se potrivește după
ID de la distanță

Configurare mod
gol

Generați politică
Nu.

Fila „Politici – General”
Parametru
Valoare

egal
MyPeer

Tunel
adevărat

Sr. Abordare
192.168.0.0/30

Dest. Abordare
192.168.0.0/30

Protocol
255 (toate)

Format
fals

Fila „Politici – Acțiune”
Parametru
Valoare

Acțiune
criptați

Nivel
cere

Protocoale IPsec
esp

Propunere
MyPeerProposal

Cel mai probabil, ca și mine, ați configurat snat/masquerade pe interfața WAN; această regulă trebuie ajustată astfel încât pachetele ipsec de ieșire să intre în tunelul nostru:
Accesați secțiunea „IP” - „Firewall”.
Fila „NAT”, deschideți regula noastră snat/masquerade.

Filă avansată
Parametru
Valoare

Politica IPsec
afară: niciunul

Repornirea demonului raton

sudo systemctl restart racoon

Dacă racoon nu pornește la repornire, atunci există o eroare în config; în syslog, racoon afișează informații despre numărul liniei în care a fost detectată eroarea.

Când sistemul de operare pornește, demonul racoon pornește înainte ca interfețele de rețea să fie afișate și am specificat opțiunea strict_address în secțiunea de ascultare; trebuie să adăugați unitatea racoon în fișierul systemd
/lib/systemd/system/racoon.service, în secțiunea [Unitate], linia After=network.target.

Acum tunelurile noastre ipsec ar trebui să fie deschise, uitați-vă la rezultat:

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

Dacă tunelurile nu sunt deschise, uitați-vă la syslog sau journalctl -u racoon.

Acum trebuie să configurați interfețele L3, astfel încât traficul să poată fi direcționat. Există diferite opțiuni, vom folosi IPIP, deoarece mikrotik îl acceptă, aș folosi vti, dar, din păcate, nu a fost încă implementat în mikrotik. Diferă de IPIP prin faptul că poate încapsula în plus multicast și pune fwmarks pe pachete, prin care acestea pot fi filtrate în iptables și iproute2 (rutare bazată pe politici). Dacă aveți nevoie de funcționalitate maximă, atunci, de exemplu, GRE. Dar nu uitați că plătim pentru funcționalitate suplimentară cu un cap mare.

Puteți vedea traducerea unei recenzii bune a interfețelor tunelului aici.

Pe 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

Acum puteți adăuga rute pentru rețele în spatele mikrotik

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

Pentru ca interfața și rutele noastre să fie ridicate după o repornire, trebuie să descriem interfața în /etc/network/interfaces și să adăugăm rute acolo în post-up sau să scriem totul într-un singur fișier, de exemplu, /etc/ ipip-ipsec0.conf și trageți-l prin post-up, nu uitați de proprietarul fișierului, drepturi și faceți-l executabil.

Mai jos este un exemplu de fișier

#!/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

Pe Mikrotik:

Secțiunea „Interfețe”, adăugați o nouă interfață „Tunelul IP”:

Fila „Tunel IP” - „General”
Parametru
Valoare

Nume si Prenume
La discreția dvs. (denumită în continuare IPIP-IPsec0)

MTU
1480 (dacă nu este specificat, mikrotik începe să taie mtu la 68)

Adresă locală
192.168.0.2

Adresă de la distanță
192.168.0.1

Secretul IPsec
Dezactivați câmpul (altfel va fi creat un nou Peer)

Ține în viață
Dezactivați câmpul (în caz contrar, interfața se va opri constant, deoarece mikrotika are propriul format pentru aceste pachete și nu funcționează cu Linux)

DSCP
moşteni

Nu fragmentați
Nu.

Clamp TCP MSS
adevărat

Permite calea rapidă
adevărat

Secțiunea „IP” - „Adrese”, adăugați adresa:

Parametru
Valoare

Adresă
192.168.0.2/30

interfaţă
IPIP-IPsec0

Acum puteți adăuga rute în rețea în spatele unei mașini Linux; atunci când adăugați o rută, gateway-ul va fi interfața noastră IPIP-IPsec0.

PS

Deoarece serverul nostru Linux este tranzitiv, este logic să setați parametrul Clamp TCP MSS pentru interfețele ipip pe acesta:

creați un fișier /etc/iptables.conf cu următorul conținut:

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

și în /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

Am nginx care rulează în rețea în spatele mikrotik (ip 10.10.10.1), îl fac accesibil de pe Internet, îl adaugă la /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 

Nu uitați să adăugați permisiunile corespunzătoare la iptables dacă aveți filtre de pachete activate.

Fiți sănătoși!

Sursa: www.habr.com

Adauga un comentariu