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

Tunel IPsec pe mașina Linux o vom ridica cu ajutorul racoon. Nu voi detalia, există un bun articol u vvpoloskin.

Instalăm pachetele necesare:

sudo install racoon ipsec-tools

Configurăm racoon, acesta va acționa în mod condiționat ca server IPsec. Deoarece mikrotik în modul principal nu poate transmite un identificator suplimentar de client, iar IP-ul extern prin care se conectează la Linux este dinamic, nu vom putea utiliza cheia prepartajată (autentificare pe parolă), deoarece parola trebuie să corespundă fie cu IP-ul host-ului conectat, fie cu identificatorul.

Vom folosi autentificarea pe baza cheilor RSA.

Demonul racoon utilizează 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 converti cheia publică pentru Mikrotik în format PEM cu aceasta — convertește doar într-o direcție: PEM în RSA. Cheia generată de plainrsa-gen nu a putut fi citită nici de openssl, nici de ssh-keygen, astfel încât nu vom putea efectua conversia cu ajutorul lor.

Vom genera o cheie PEM cu ajutorul openssl, iar 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

Cheile obținute le vom pune în folder: /etc/racoon/certs/server. Nu uităm să stabilim ca proprietar utilizatorul sub numele căruia pornește demonul racoon (de obicei root), cu permisiuni 600.

Configurarea mikrotik o voi descrie la conectarea prin WinBox.

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

Deschidem secțiunea „IP” — „IP sec” — tab-ul „Keys”. Acum generăm cheile — butonul „Generate Key”, apoi exportăm cheia publică a mikrotik-ului „Export Pub. Key”, o putem descărca din secțiunea „Files”, clic 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 pe care l-am încărcat anterior.

Cheia publică a mikrotik-ului trebuie convertită

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

și trebuie plasată în folderul /etc/racoon/certs, fără a uita de proprietar și permisiuni.

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

log info; # Nivelul de înregistrare, pentru depanare folosiți 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 va efectua verificarea obligatorie a legăturii la IP-urile specificate mai sus.
}

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

remote anonymous { # Secțiune care stabilește parametrii pentru funcționarea demonului 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; # Setează modul "server" al demonului, acesta nu va încerca să inițieze conexiuni.
    nat_traversal on; # Activează utilizarea modului NAT-T pentru clienți, dacă aceștia sunt în spatele NAT.
    exchange_mode main; # Modul de schimb al parametrilor de conectare, în acest caz - negociere.
    my_identifier address 1.1.1.1; # Ne identificăm linux host-ul 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 acestuia este mai mare sau lungimea cheii este mai mică decât cea a inițiatorului. Dacă durata sesiunii este mai mică decât cea a inițiatorului, racoon folosește propria valoare pentru durata sesiunii și va trimite mesaj RESPONDER-LIFETIME.
    proposal { # Parametrii tunelului ISAKMP.

        encryption_algorithm aes; # Metoda de criptare a tunelului ISAKMP.
        hash_algorithm sha512; # Algoritmul de hashing utilizat pentru tunelul ISAKMP.
        authentication_method rsasig; # Modul de autentificare pentru tunelul ISAKMP - prin chei RSA.
        dh_group modp2048; # Lungimea cheii pentru algoritmul Diffie-Hellman în timpul negocierii tunelului ISAKMP.
        lifetime time 86400 sec; # Timpul de valabilitate al sesiunii.
    }

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

sainfo anonymous { # Parametrii tunelurilor ESP, anonymous - parametrii specificați vor fi utilizați ca parametrii implicit. Pentru diferiți clienți, porturi, protocoale se pot stabili parametrii diferiți, potrivirea se face în funcție de adresele IP, porturile, protocoalele.

    pfs_group modp2048; # Lungimea cheii pentru algoritmul Diffie-Hellman pentru tunelurile ESP.
    lifetime time 28800 sec; # Durata de valabilitate a tunelurilor ESP.
    encryption_algorithm aes; # Metoda de criptare a tunelurilor ESP.
    authentication_algorithm hmac_sha512; # Algoritmul de hashing utilizat pentru autentificarea tunelurilor ESP.
    compression_algorithm deflate; # Se comprima datele transmise, algoritmul de compresie propus este unul singur.
}

Configurare Mikrotik

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

Tab-ul "Profiles"
Parametru
Valoare

Name
La alegerea dumneavoastră (implicit default)

Hash Algorithm
sha512

Algoritm de criptare
aes-128

DH-Group
modp2048

Proposhal_check
claim

Lifetime
1d 00:00:00

Traversare NAT
true (bifați)

DPD
120

DPD Maximum failure
5

Tab-ul "Peers"
Parametru
Valoare

Name
La alegerea dumneavoastră (următorul MyPeer)

Address
1.1.1.1 (IP-ul mașinii Linux)

Local Address
10.0.0.2 (IP-ul interfeței WAN a Mikrotik)

Profile
default

Exchange Mode
main

Passive
false

Send INITIAL_CONTACT
true

Tab-ul "Proposal"
Parametru
Valoare

Name
La alegerea dumneavoastră (următorul MyPeerProposal)

Auth. Algorithms
sha512

Encr. Algorithms
aes-128-cbc

Lifetime
08:00:00

PFS Group
modp2048

Tab-ul "Identities"
Parametru
Valoare

Peer
MyPeer

Atuh. Method
rsa key

Cheie
mikrotik.privet.key

Remote Key
server-name.pub.pem

Policy Template Group
default

Notrack Chain
gol

My ID Type
auto

Remote ID Type
auto

Match By
remote id

Mode Configuration
gol

Generate Policy
no

Tab-ul "Policies — General"
Parametru
Valoare

Peer
MyPeer

Tunnel
true

Src. Address
192.168.0.0/30

Dest. Address
192.168.0.0/30

Protocol
255 (toate)

Template
false

Tab-ul "Policies — Action"
Parametru
Valoare

Acțiune
encrypt

Level
requier

IPsec Protocols
esp

Proposal
MyPeerProposal

Cel mai probabil, aveți, ca și mine, pe interfața WAN setat snat/masquerade, această regulă trebuie corectată pentru ca pachetele ipsec ieșite să treacă prin tunelul nostru:
Trecem în secțiunea "IP" — "Firewall".
Tab-ul "NAT", deschidem regula noastră snat/masquerade.

Tab-ul "Advanced"
Parametru
Valoare

IPsec Policy
out: none

Reporniți demonul racoon

sudo systemctl restart racoon

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

Demonul racoon pornește la încărcarea sistemului de operare, înainte de a ridica interfețele de rețea, iar noi am specificat în secțiunea listen opțiunea strict_address, trebuie să adăugăm în fișierul unității systemd a racoon.
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Acum tunelurile noastre ipsec ar trebui să se ridice, 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 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 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 conectează Mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

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

Acum trebuie să configurăm interfețele L3 pentru a putea ruti traficul. Există diferite opțiuni, noi vom folosi IPIP, deoarece este suportat de mikrotik; aș fi folosit 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ă marcheze (fwmark) pachetele, permițându-ne să le filtrăm în iptables și iproute2 (rutare bazată pe politici). Dacă aveți nevoie de funcționalitate maximă, de exemplu, GRE. Dar nu trebuie să uităm că funcționalitatea suplimentară vine cu un overhead mai mare.

O traducere a unei recenzii bune despre interfețele de tunel poate fi consultată 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

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

Pentru ca interfața noastră și rutele să fie activate după repornire, trebuie să descriem interfața în /etc/network/interfaces și acolo, în post-up, să adăugăm rutele, sau să le scriem pe toate î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 să-l faceți executabil.

Sub acest punct, 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 „Interfaces”, adăugăm o nouă interfață „IP tunnel”:

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

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

MTU
1480 (dacă nu specificați, atunci mikrotik începe să reducă mtu la 68)

Local Address
192.168.0.2

Adresa Remote
192.168.0.1

Ipsec Secret
Dezactivăm câmpul (altfel se va crea un nou Peer)

Keepalive
Dezactivăm câmpul (altfel interfața se va opri constant, deoarece mikrotik are un anumit format al acestor pachete care 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ța
IPIP-IPsec0

Acum putem adăuga rute pentru rețelele din spatele serverului linux; la adăugarea rutei, gateway-ul va fi interfața noastră IPIP-IPsec0.

PS

Dat fiind că serverul nostru linux este unul de tranzit, 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-ului meu, am nginx (ip 10.10.10.1); îl facem accesibil din internet, adăugând î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ă de rutare 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ă un server OpenVPN 172.16.0.1/24, pentru clienții care folosesc conexiunea la acesta ca gateway, 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 filtre de pachete activate.

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