Tunel VPN IPIP IPsec între o mașină Linux și Mikrotik sub NAT-ul providerului

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 extern NAT-ul furnizorului este dinamic.
  • ipip-ipsec0 192.168.0.2/30 va fi tunelul nostru

Tunel IPsec pe mașina Linux va fi configurat cu ajutorul racoon. Nu voi detalia, există o bună articol u vvpoloskin.

Instalăm pachetele necesare:

sudo install racoon ipsec-tools

Configurăm racoon, care va acționa ca server ipsec. Deoarece mikrotik în modul principal nu poate transmite un identificator suplimentar al clientului, iar adresa IP externă prin care se conectează la Linux este dinamică, nu vom putea utiliza chei prepartajate (autentificare pe baza parolei), deoarece parola trebuie să corespundă fie cu adresa IP a gazdei conectate, fie cu identifier.

Vom folosi autentificarea prin chei RSA.

Demonul racoon folosește chei în format RSA, iar mikrotik – în format PEM. Dacă generăm cheile cu utilitarul plainrsa-gen, care vine împreună cu racoon, nu vom putea să convertim cheia publică pentru Mikrotik în format PEM cu ajutorul acestuia — se poate converti doar într-o singură direcție: PEM în RSA. Cheia generată prin plainrsa-gen nu a fost citită de nici openssl, nici ssh-keygen, așa că nu va putea fi realizată conversia cu ajutorul lor.

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

Cheile obținute le vom pune în folder: /etc/racoon/certs/server. Nu uitați să setați drepturile de proprietate pentru utilizatorul sub care rulează demonul racoon (de obicei root), cu drepturi 600.

Configurarea mikrotik o voi descrie când se conectez la WinBox.

Cheia server-name.pub.pem o vom încărca în mikrotik: Meniul „Files” — „Upload”.

Deschidem secțiunea „IP” — „IP sec” — fila „Keys”. Acum generăm cheile — butonul „Generate Key”, apoi exportăm cheia publică a mikrotik-ului „Export Pub. Key”, putem să o descărcăm din secțiunea „Files”, cu butonul din dreapta pe fișier — „Download”.

Importăm cheia publică racoon, „Import”, în lista derulantă a câmpului „File name” căutăm server-name.pub.pem încărcat anterior.

Cheia publică mikrotik trebuie să fie convertită

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

și să fie plasată în folderul /etc/racoon/certs, fără a uita de proprietar și drepturi.

Configurația racoon cu comentarii: /etc/racoon/racoon.conf

log info; # Nivelul de înregistrare, pentru depanare folosim Debug sau Debug2.

listen {

    isakmp 1.1.1.1 [500]; # Adresa și portul pe care va asculta demonul.
    isakmp_natt 1.1.1.1 [4500]; # Adresa și portul pe care va asculta demonul pentru clienții din spatele NAT.
    strict_address; # Se efectuează o verificare obligatorie a legăturii cu IP-urile specificate mai sus.
}

path certificate "/etc/racoon/certs"; # Calea către folderul cu certificate.

remote anonymous { # Secțiunea care definește parametrii pentru funcționarea demonului cu ISAKMP și negocierea modurilor cu gazdele conectate. Deoarece IP-ul de la care se conectează Mikrotik este dinamic, folosim anonymous, ceea ce permite conectarea de la orice adresă. Dacă IP-urile gazdelor sunt statice, se poate specifica o adresă și un port concret.

    passive on; # Definește modul de funcționare "server" al demonului, acesta nu va încerca să inițieze conexiuni.
    nat_traversal on; # Activează utilizarea modului NAT-T pentru clienții care se află în spatele NAT. 
    exchange_mode main; # Modul de schimb al parametrilor de conectare, în acest caz --- negociere.
    my_identifier address 1.1.1.1; # Identificăm gazda noastră Linux prin adresa sa IP.
    certificate_type plain_rsa "server/server-name.priv.key"; # Cheia privată a serverului.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Cheia publică a Mikrotik.

    proposal_check claim; # Modul de negociere a parametrilor tunelului ISAKMP. Racoon va folosi valorile gazdei conectate (inițiatorul) pentru durata sesiunii și lungimea cheii, dacă durata sesiunii este mai mare sau lungimea cheii este mai mică decât la inițiator. Dacă durata sesiunii este mai scurtă decât la inițiator, racoon va utiliza propria valoare a duratei sesiunii și va trimite mesajul RESPONDER-LIFETIME.
    proposal { # Parametrii tunelului ISAKMP.

        encryption_algorithm aes; # Metoda de criptare a tunelului ISAKMP.
        hash_algorithm sha512; # Algoritmul de hashare utilizat pentru tunelul ISAKMP.
        authentication_method rsasig; # Modul de autentificare pentru tunelul ISAKMP - pe baza cheilor RSA.
        dh_group modp2048; # Lungimea cheii pentru algoritmul Diffie-Hellman la negocierea tunelului ISAKMP.
        lifetime time 86400 sec; # Timpul de valabilitate al sesiunii.
    }

    generate_policy on; # Crearea automată a tunelurilor ESP din cererea primită de la gazda conectată.
}

sainfo anonymous { # Parametrii tunelurilor ESP, anonymous - parametrii specificați vor fi folosiți ca parametri default. Pentru clienți, porturi, protocoale diferite se pot defini parametri diferiți, asocierea se face pe baza adreselor IP, porturilor, protocoalelor.

    pfs_group modp2048; # Lungimea cheii pentru algoritmul Diffie-Hellman pentru tuneluri ESP.
    lifetime time 28800 sec; # Timpul de valabilitate al tunelurilor ESP.
    encryption_algorithm aes; # Metoda de criptare a tunelurilor ESP.
    authentication_algorithm hmac_sha512; # Algoritmul de hashare utilizat pentru autentificarea tunelurilor ESP.
    compression_algorithm deflate; # Se comprimă datele transmise, algoritmul de compresie propus fiind unul singur.
}

Configurația mikrotik

Ne întoarcem în secțiunea "IP" — "IPsec"

Tab-ul "Profiles"
Parametru
Valoare

Name
La alegerea dumneavoastră (implicit default)

Algoritm de Hash
sha512

Algoritm de criptare
aes-128

Grup DH
modp2048

Proposhal_check
claim

Durată de viață
1z 00:00:00

Traversare NAT
adevărat (bifați căsuța)

DPD
120

DPD Maximum failure
5

Tab-ul "Peers"
Parametru
Valoare

Name
La alegerea dumneavoastră (mai departe MyPeer)

Address
1.1.1.1 (IP-ul mașinii linux)

Adresa Locală
10.0.0.2 (IP-ul interfeței WAN a mikrotik)

Profil
default

Mod de Schimb
main

Pasiv
false

Trimite INITIAL_CONTACT
true

Tab-ul "Proposal"
Parametru
Valoare

Name
La alegerea dumneavoastră (mai departe MyPeerProposal)

Algoritmi de Autentificare
sha512

Algoritmi de Criptare
aes-128-cbc

Durată de viață
08:00:00

Grup PFS
modp2048

Tab-ul "Identities"
Parametru
Valoare

Peer
MyPeer

Metodă de Autentificare
cheie rsa

Cheie
mikrotik.privet.key

Cheie Remote
server-name.pub.pem

Grup de Șablon de Politică
default

Chain Notrack
gol

Tipul ID-ului Meu
auto

Tipul ID-ului Remote
auto

Potrivire După
id remote

Configurare Mod
gol

Generați Politică
no

Tab-ul "Policies — General"
Parametru
Valoare

Peer
MyPeer

Tunel
true

Adresa Src.
192.168.0.0/30

Adresa Dest.
192.168.0.0/30

Protocol
255 (toate)

Șablon
false

Tab-ul "Policies — Action"
Parametru
Valoare

Acțiune
encrypt

Level
requier

Protocoale IPsec
esp

Propunere
MyPeerProposal

Probabil că și dumneavoastră, ca și mine, ați configurat snat/masquerade pe interfața WAN, această regulă trebuie ajustată pentru a permite pachetele ipsec să treacă prin tunel:
Trecem la secțiunea "IP" — "Firewall".
Tab-ul "NAT", deschidem regula noastră snat/masquerade.

Tab-ul "Advanced"
Parametru
Valoare

Politica IPsec
out: none

Restartăm demonul racoon

sudo systemctl restart racoon

Dacă racoon nu pornește la restart, înseamnă că există o eroare în configurare, în syslog racoon va afișa informații despre numărul liniei în care a fost găsită eroarea.

Demonul racoon pornește la bootul sistemului înainte ca interfețele de rețea să fie active, iar noi am specificat opțiunea strict_address în secțiunea listen, este necesar să adăugați în fișierul unității systemd pentru racoon
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Acum tunelurile noastre ipsec ar trebui să fie funcționale, verificăm ieșirea:

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 prin care se conectează 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 prin care se conectează 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 prin care se conectează mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Dacă tunelurile nu s-au activat, verificați syslog sau jurnalctl -u racoon.

Acum este necesar să configurăm interfețele L3 pentru a putea ruteza traficul. Există diferite opțiuni, vom folosi IPIP, deoarece acesta este suportat de mikrotik, aș fi utilizat vti, dar, din păcate, nu a fost implementat încă în mikrotik. Spre deosebire de IPIP, acesta poate, de asemenea, să încapsuleze multicast și să adauge etichete (fwmark) pachetelor, care pot fi filtrate în iptables și iproute2 (routing bazat pe politică). Dacă aveți nevoie de funcționalitate maximă - atunci, de exemplu, GRE. Dar nu trebuie să uităm că plătim un overhead mai mare pentru funcționalitate suplimentară.

Puteți viziona o traducere a unei recenziei bune despre interfețele tunel. 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 putem adăuga rute pentru rețelele din spatele mikrotik-ului.

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

Pentru ca interfața și rutele noastre să pornească după repornire, trebuie să descriem interfața în /etc/network/interfaces și acolo să adăugăm rutele în post-up, sau putem scrie totul într-un singur fișier, de exemplu, /etc/ipip-ipsec0.conf și să-l apelăm prin post-up, nu uitați de proprietarul fișierului, permisiuni și asigurați-vă că este 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ăugăm o nouă interfață „IP tunnel”:

Tab-ul „IP tunnel” - „General”
Parametru
Valoare

Name
La discreția dumneavoastră (apoi IPIP-IPsec0)

MTU
1480 (dacă nu se specifică, mikrotik începe să scadă mtu la 68)

Adresa Locală
192.168.0.2

Adresa Remote
192.168.0.1

Ipsec Secret
Dezactivăm câmpul (altfel va fi creat un nou Peer)

Keepalive
Dezactivăm câmpul (altfel interfața se va opri constant, deoarece mikrotik are un format propriu pentru aceste pachete și nu funcționează cu linux)

DSCP
inherit

Dont Fragment
no

Clamp TCP MSS
true

Allow Fast Path
true

Secțiunea „IP” - „Addresses”, adăugăm adresa:

Parametru
Valoare

Address
192.168.0.2/30

Interfață
IPIP-IPsec0

Acum putem adăuga rute în rețelele din spatele mașinii linux, la adăugarea rutei, gateway-ul va fi interfața noastră IPIP-IPsec0.

PS

Deoarece serverul nostru linux este tranzițional, are sens să setăm parametrul Clamp TCP MSS pentru interfețele ipip:

creăm 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

În rețeaua din spatele mikrotik am un nginx (ip 10.10.10.1), facem-l accesibil din internet, adăugăm în /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
#Pe Mikrotik, în tabelul mangle, trebuie să adăugăm o regulă route cu destinația 192.168.0.1 pentru pachetele cu adresa sursă 10.10.10.1 și porturile 80, 443.

# De asemenea, pe Linux funcționează serverul OpenVPN 172.16.0.1/24, pentru clienții care utilizează conexiunea ca gateway, le oferim acces la internet
-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 în iptables, dacă aveți activate filtrele de pachete.

Să fiți sănătoși!

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster