Tunnel VPN IPsec IPIP tra una macchina Linux e Mikrotik dietro NAT del provider

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

  • Eth0 1.1.1.1/32 IP esterno
  • ipip-ipsec0 192.168.0.1/30 sarà il nostro tunnel

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 IP interno dal fornitore. IP esterno NAT del fornitore è dinamico.
  • ipip-ipsec0 192.168.0.2/30 sarà il nostro tunnel

Stabilirà un tunnel IPsec su una macchina Linux utilizzando racoon. Non entrerò nei dettagli, c'è una buona su Habr. a vvpoloskin.

Installa i pacchetti necessari:

sudo install racoon ipsec-tools

Configuriamo racoon, che agirà come server ipsec. Poiché mikrotik in modalità main non può trasmettere un identificatore cliente aggiuntivo e l'indirizzo IP esterno tramite il quale si connette a Linux è dinamico, non sarà possibile utilizzare la chiave precondivisa (autenticazione tramite password), poiché la password deve corrispondere all'indirizzo IP dell'host connesso o all'identificatore.

Utilizzeremo l'autenticazione tramite chiavi RSA.

Il demone racoon utilizza chiavi in formato RSA, mentre mikrotik in formato PEM. Se generiamo chiavi con l'utilità plainrsa-gen fornita con racoon, non sarà possibile convertire la chiave pubblica per Mikrotik in formato PEM utilizzando questa utility, poiché converte solo in un verso: PEM in RSA. La chiave generata da plainrsa-gen non è stata letta né da openssl né da ssh-keygen, quindi non sarà possibile effettuare la conversione nemmeno con il loro aiuto.

Genereremo una chiave PEM con openssl e poi la convertemo per racoon utilizzando 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

Posizioneremo le chiavi ottenute nella cartella: /etc/racoon/certs/server. Non dimentichiamo di impostare come proprietario l'utente sotto cui viene eseguito il demone racoon (di solito root), con i permessi 600.

Descriverò la configurazione di mikrotik durante la connessione tramite WinBox.

Caricheremo la chiave server-name.pub.pem in mikrotik: Menu «Files» — «Upload».

Apriamo la sezione «IP» — «IP sec» — scheda «Keys». Ora generiamo le chiavi — pulsante «Generate Key», poi esportiamo la chiave pubblica mikrotik «Export Pub. Key», scaricabile dalla sezione «Files», facendo clic destro sul file — «Download».

Importiamo la chiave pubblica racoon, «Import», nel menu a discesa del campo «File name» cerchiamo la server-name.pub.pem che abbiamo caricato precedentemente.

La chiave pubblica di mikrotik deve essere convertita

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

e posizionata nella cartella /etc/racoon/certs, ricordando il proprietario e i permessi.

Config racoon con commenti: /etc/racoon/racoon.conf

log info; # Livello di registrazione, durante il debug utilizziamo Debug o Debug2.

listen {

    isakmp 1.1.1.1 [500]; # Indirizzo e porta su cui ascolterà il demone.
    isakmp_natt 1.1.1.1 [4500]; # Indirizzo e porta su cui ascolterà il demone per i client dietro NAT.
    strict_address; # Eseguire un controllo obbligatorio della corrispondenza con gli IP specificati sopra.
}

path certificate "/etc/racoon/certs"; # Percorso della cartella con i certificati.

remote anonymous { # Sezione che definisce i parametri per il funzionamento del demone con ISAKMP e la negoziazione dei modi con i host collegati. Poiché l'IP da cui si collega Mikrotik è dinamico, si utilizza anonymous, che consente la connessione da qualsiasi indirizzo. Se l'IP degli host è statico, è possibile specificare un indirizzo e una porta specifici.

    passive on; # Imposta la modalità "server" del demone, non tenterà di iniziare le connessioni.
    nat_traversal on; # Attiva l'uso della modalità NAT-T per i client, se sono dietro NAT. 
    exchange_mode main; # Modalità di scambio dei parametri di connessione, in questo caso - negoziazione.
    my_identifier address 1.1.1.1; # Identifichiamo il nostro host linux tramite il suo indirizzo ip.
    certificate_type plain_rsa "server/server-name.priv.key"; # Chiave privata del server.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Chiave pubblica di Mikrotik.

    proposal_check claim; # Modalità di negoziazione dei parametri del tunnel ISAKMP. Racoon utilizzerà i valori dell'host collegato (iniziatore) per la durata della sessione e la lunghezza della chiave, se la sua durata della sessione è maggiore o la sua lunghezza della chiave è più corta di quella dell'iniziatore. Se la durata della sessione è più corta di quella dell'iniziatore, racoon utilizza il proprio valore della durata della sessione e invierà un messaggio RESPONDER-LIFETIME.
    proposal { # Parametri del tunnel ISAKMP.

        encryption_algorithm aes; # Metodo di crittografia del tunnel ISAKMP.
        hash_algorithm sha512; # Algoritmo di hash utilizzato per il tunnel ISAKMP.
        authentication_method rsasig; # Modalità di autenticazione per il tunnel ISAKMP - basata su chiavi RSA.
        dh_group modp2048; # Lunghezza della chiave per l'algoritmo Diffie-Hellman durante la negoziazione del tunnel ISAKMP.
        lifetime time 86400 sec; # Tempo di validità della sessione.
    }

    generate_policy on; # Creazione automatica di tunnel ESP dalla richiesta ricevuta dall'host collegato.
}

sainfo anonymous { # Parametri dei tunnel ESP, anonymous - i parametri specificati saranno utilizzati come parametri di default. Per diversi client, porte, protocolli è possibile specificare parametri differenti, l'abbinamento avviene in base agli indirizzi ip, porte, protocolli.

    pfs_group modp2048; # Lunghezza della chiave per l'algoritmo Diffie-Hellman per i tunnel ESP.
    lifetime time 28800 sec; # Tempo di validità dei tunnel ESP.
    encryption_algorithm aes; # Metodo di crittografia dei tunnel ESP.
    authentication_algorithm hmac_sha512; # Algoritmo di hash utilizzato per l'autenticazione dei tunnel ESP.
    compression_algorithm deflate; # Comprimere i dati trasmessi, l'algoritmo di compressione proposto è solo uno.
}

Configurazione mikrotik

Torniamo alla sezione "IP" — "IPsec"

Scheda "Profiles"
Parametro
Valore

Name
A tua discrezione (di default default)

Algoritmo Hash
sha512

Algoritmo di crittografia
aes-128

Gruppo DH
modp2048

Proposhal_check
reclamo

Durata
1d 00:00:00

NAT Traversal
vero (mettiamo la spunta)

DPD
120

Massimo errore DPD
5

Scheda "Peers"
Parametro
Valore

Name
A tua discrezione (in seguito MyPeer)

Address
1.1.1.1 (IP della macchina linux)

Indirizzo locale
10.0.0.2 (IP dell'interfaccia WAN di mikrotik)

Profilo
default

Modalità di scambio
main

Passivo
false

Invia INITIAL_CONTACT
true

Scheda "Proposal"
Parametro
Valore

Name
A tua discrezione (in seguito MyPeerProposal)

Algoritmi di autenticazione
sha512

Algoritmi di crittografia
aes-128-cbc

Durata
08:00:00

Gruppo PFS
modp2048

Scheda "Identities"
Parametro
Valore

Peer
MyPeer

Metodo di autenticazione
chiave rsa

Key
mikrotik.privet.key

Chiave remota
server-name.pub.pem

Gruppo modello di policy
default

Catena Notrack
vuoto

Tipo ID
auto

Tipo ID remoto
auto

Corrispondenza per
id remoto

Configurazione della modalità
vuoto

Genera policy
no

Scheda "Policies — General"
Parametro
Valore

Peer
MyPeer

Tunnel
true

Indirizzo sorgente
192.168.0.0/30

Indirizzo di destinazione
192.168.0.0/30

Protocollo
255 (tutti)

Modello
false

Scheda "Policies — Action"
Parametro
Valore

Azione
encrypt

Livello
richiesta

Protocolli IPsec
esp

Proposta
MyPeerProposal

Probabilmente hai, come me, impostato snat/masquerade sull'interfaccia WAN, questa regola deve essere corretta affinché i pacchetti ipsec in uscita vengano inviati attraverso il nostro tunnel:
Passiamo alla sezione "IP" — "Firewall".
Scheda "NAT", apriamo la nostra regola snat/masquerade.

Scheda "Avanzate"
Parametro
Valore

Policy IPsec
uscita: nessuno

Riavviamo il demone racoon

sudo systemctl restart racoon

Se al riavvio racoon non si avvia, significa che nel file di configurazione c'è un errore; nel syslog racoon visualizza informazioni sul numero di riga in cui è stato riscontrato l'errore.

Il demone racoon all'avvio del sistema operativo si avvia prima che le interfacce di rete siano attive, e abbiamo specificato nell'opzione listen l'opzione strict_address; è necessario aggiungere nel file dell'unità systemd di racoon
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Ora i nostri tunnel ipsec dovrebbero essere attivi, vediamo l'output:

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 attraverso il quale si collega 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 attraverso il quale si collega 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 attraverso il quale si collega mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Se i tunnel non si sono attivati, controlla il syslog oppure journalctl -u racoon.

È ora necessario configurare le interfacce L3 per poter instradare il traffico. Ci sono diverse opzioni, utilizzeremo IPIP, poiché è supportato da MikroTik. Io avrei usato VTI, ma sfortunatamente MikroTik non lo ha ancora implementato. A differenza di IPIP, VTI può incapsulare multicanale e applicare etichette (fwmark) ai pacchetti, tramite i quali è possibile filtrarli in iptables e iproute2 (instradamento basato su policy). Se è necessaria la massima funzionalità, ad esempio, GRE. Ma non dimentichiamo che per funzionalità aggiuntive si paga un overhead maggiore.

Puoi vedere una traduzione di una buona panoramica delle interfacce tunnel qui.

Su 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

Ora puoi aggiungere percorsi per le reti dietro MikroTik

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

Per far sì che la nostra interfaccia e i percorsi si attivino dopo un riavvio, è necessario descrivere l'interfaccia in /etc/network/interfaces e aggiungere lì anche i percorsi in post-up, oppure scrivere tutto in un unico file, ad esempio, /etc/ipip-ipsec0.conf e chiamarlo tramite post-up. Non dimenticare di impostare il proprietario del file, i permessi e renderlo eseguibile.

Di seguito un esempio di file

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

Su MikroTik:

Sezione "Interfacce", aggiungi una nuova interfaccia "IP tunnel":

Tab "IP tunnel" — "Generale"
Parametro
Valore

Name
A tua discrezione (di seguito IPIP-IPsec0)

MTU
1480 (se non specificato, MikroTik inizia a ridurre l'MTU a 68)

Indirizzo locale
192.168.0.2

Indirizzo remoto
192.168.0.1

Ipsec Secret
Disabilitiamo il campo (altrimenti verrà creato un nuovo Peer)

Keepalive
Disabilitiamo il campo (altrimenti l'interfaccia si spegnerà continuamente, poiché MikroTik utilizza un formato diverso per questi pacchetti e non funziona con Linux)

DSCP
eredita

Non frammentare
no

Limita TCP MSS
true

Consenti Fast Path
true

Sezione "IP" — "Indirizzi", aggiungi un indirizzo:

Parametro
Valore

Address
192.168.0.2/30

Interfaccia
IPIP-IPsec0

Ora puoi aggiungere percorsi nelle reti dietro la macchina Linux. Quando aggiungi un percorso, il gateway sarà la nostra interfaccia IPIP-IPsec0.

PS

Poiché il nostro server Linux funge da transito, ha senso impostare il parametro Limita TCP MSS per le interfacce IPIP:

creiamo un file /etc/iptables.conf con il seguente contenuto:

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

e in /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

Nella rete dietro MikroTik ho nginx in esecuzione (ip 10.10.10.1), rendiamolo accessibile da internet, aggiungiamo in /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
#Su mikrotik, nella tabella mangle, è necessario aggiungere una regola route con destinazione 192.168.0.1 per i pacchetti con indirizzo sorgente 10.10.10.1 e porte 80, 443.

# Inoltre, su Linux funziona il server OpenVPN 172.16.0.1/24, per i clienti che utilizzano la connessione verso di esso come gateway diamo accesso a Internet
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

Non dimenticate di aggiungere i permessi appropriati in iptables, se avete attivi i filtri dei pacchetti.

Salute!

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster