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

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

  • Eth0 1.1.1.1/32 IP pubblico 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 provider. IP esterno NAT del provider è dinamico.
  • ipip-ipsec0 192.168.0.2/30 sarà il nostro tunnel

Il tunnel IPsec sulla macchina Linux verrà creato con racoon. Non descriverò i dettagli, c'è una buona articolo a vvpoloskin.

Installiamo i pacchetti necessari:

sudo install racoon ipsec-tools

Configuriamo racoon, che fungerà condizionalmente da server ipsec. Poiché mikrotik in modalità principale non può trasmettere un identificatore client aggiuntivo, e l'indirizzo IP esterno tramite cui si connette a Linux è dinamico, non sarà possibile utilizzare la chiave condivisa (autenticazione tramite password), poiché la password deve corrispondere o 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 usa il formato PEM. Se generiamo le chiavi utilizzando l'utilità plainrsa-gen fornita con racoon, non sarà possibile convertire la chiave pubblica per Mikrotika in formato PEM — converte solo in una direzione: da PEM a RSA. La chiave generata con plainrsa-gen non è stata letta né da openssl né da ssh-keygen, quindi non sarà possibile eseguire la conversione con i loro aiuti.

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

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

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

Caricheremo la chiave server-name.pub.pem in Mikrotik: Menù «Files» — «Upload».

Apriamo la sezione «IP» — «IP sec» — scheda «Keys». Ora generiamo le chiavi — pulsante «Generate Key», poi esportiamo la chiave pubblica di Mikrotik «Export Pub. Key», che possiamo scaricare dalla sezione «Files», cliccando con il tasto destro sul file — «Download».

Importiamo la chiave pubblica di racoon, «Import», nel menu a tendina del campo «File name» cerchiamo il server-name.pub.pem che abbiamo caricato in precedenza.

La chiave pubblica di Mikrotik deve essere convertita.

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

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

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

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

listen {

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

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

remote anonymous { # Sezione che definisce i parametri per il lavoro del demone con ISAKMP e la negoziazione delle modalità con gli host connessi. Poiché l'IP da cui si connette Mikrotik è dinamico, utilizziamo anonymous, consentendo la connessione da qualsiasi indirizzo. Se l'IP degli host è statico, è possibile specificare un indirizzo e una porta specifici.

    passive on; # Imposta la modalità di lavoro "server" del demone; non tenterà di iniziare le connessioni.
    nat_traversal on; # Abilita 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 con 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 connesso (iniziatore) per la durata della sessione e la lunghezza della chiave; se la durata della sessione è maggiore o la lunghezza della chiave è più corta rispetto all'iniziatore. Se la durata della sessione è più breve rispetto all'iniziatore, racoon utilizza il proprio valore di 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 hashing 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 di Diffie-Hellman nella negoziazione del tunnel ISAKMP.
        lifetime time 86400 sec; # Durata della sessione.
    }

    generate_policy on; # Creazione automatica di tunnel ESP sulla base della richiesta ricevuta dall'host connesso.
}

sainfo anonymous { # Parametri dei tunnel ESP, anonymous - i parametri indicati saranno usati come parametri predefiniti. Per diversi client, porte, protocolli è possibile definire parametri diversi, il matching avviene per indirizzi IP, porte, protocolli.

    pfs_group modp2048; # Lunghezza della chiave per l'algoritmo di Diffie-Hellman per i tunnel ESP.
    lifetime time 28800 sec; # Durata dei tunnel ESP.
    encryption_algorithm aes; # Metodo di crittografia dei tunnel ESP.
    authentication_algorithm hmac_sha512; # Algoritmo di hashing utilizzato per l'autenticazione dei tunnel ESP.
    compression_algorithm deflate; # Compressare i dati trasmessi; solo un algoritmo di compressione è proposto.
}

Configurazione mikrotik

Torniamo alla sezione "IP" — "IPsec"

Scheda "Profiles"
Caratteristica
Significato

Name
A tuo piacimento (di default default)

Algoritmo di hash
sha512

Algoritmo di crittografia
aes-128

Gruppo DH
modp2048

Controllo proposta
rivendicazione

Durata
1d 00:00:00

NAT Traversal
true (metti il segno di spunta)

DPD
120

Massimo errore DPD
5

Scheda "Peers"
Caratteristica
Significato

Name
A tuo piacimento (poi MyPeer)

Indirizzo
1.1.1.1 (IP della macchina Linux)

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

Profile
default

Modalità di scambio
main

Passiva
false

Invia INITIAL_CONTACT
true

Scheda "Proposal"
Caratteristica
Significato

Name
A tuo piacimento (poi MyPeerProposal)

Algoritmi di autenticazione
sha512

Algoritmi di crittografia
aes-128-cbc

Durata
08:00:00

Gruppo PFS
modp2048

Scheda "Identities"
Caratteristica
Significato

Peer
MyPeer

Metodo di autenticazione
chiave rsa

Chiave
mikrotik.privet.key

Chiave remota
server-name.pub.pem

Gruppo Template Policy
default

Catena no track
vuoto

Il mio tipo ID
auto

Tipo ID remoto
auto

Corrispondenza per
id remoto

Configurazione della modalità
vuoto

Genera policy
no

Scheda "Policies — General"
Caratteristica
Significato

Peer
MyPeer

Tunnel
true

Indirizzo di origine
192.168.0.0/30

Indirizzo di destinazione
192.168.0.0/30

Protocollo
255 (tutti)

Template
false

Scheda "Policies — Action"
Caratteristica
Significato

Action
encrypt

Livello
richiesta

Protocollo IPsec
esp

Proposta
MyPeerProposal

Probabilmente anche tu, come me, hai configurato snat/masquerade sull'interfaccia WAN, questa regola deve essere corretta affinché i pacchetti ipsec in uscita vadano nel nostro tunnel:
Andiamo alla sezione "IP" — "Firewall".
Scheda "NAT", apriamo la nostra regola snat/masquerade.

Scheda "Advanced"
Caratteristica
Significato

Politica IPsec
out: none

Riavviamo il demone racoon

sudo systemctl restart racoon

Se racoon non si avvia dopo il riavvio, significa che c'è un errore nella configurazione; nel syslog racoon fornisce informazioni sul numero di riga in cui è stato trovato l'errore.

Il demone racoon si avvia prima che vengano attivati gli interfacciali di rete, e abbiamo specificato nell'opzione listen strict_address; è necessario aggiungere al file del servizio systemd di racoon.
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Ora i nostri tunnel ipsec dovrebbero essere attivi, controlliamo 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 connette 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 connette 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 connette mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Se i tunnel non sono attivi, controllare syslog o journalctl -u racoon.

Ora è necessario configurare le interfacce L3 per poter instradare il traffico. Ci sono diverse opzioni, utilizzeremo IPIP, in quanto supportato dal mikrotik; avrei usato vti, ma sfortunatamente non è ancora stato implementato nel mikrotik. Rispetto a IPIP, vti ha la capacità di incapsulare multicast e di applicare etichette (fwmark) ai pacchetti, così da poterli filtrare in iptables e iproute2 (instradamento basato su policy). Se è necessaria la massima funzionalità, si potrebbe considerare GRE. Tuttavia, non bisogna dimenticare che ciò comporta un sovraccarico maggiore.

Puoi consultare la traduzione di una buona panoramica sulle interfacce tunneling. 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 è possibile aggiungere le rotte per le reti dietro il mikrotik.

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

Affinché la nostra interfaccia e le rotte si attivino dopo il riavvio, è necessario descrivere l'interfaccia in /etc/network/interfaces e aggiungere lì le rotte in post-up, oppure scrivere tutto in un unico file, ad esempio, /etc/ipip-ipsec0.conf e richiamarlo tramite post-up; non dimenticare 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», aggiungere una nuova interfaccia «Tunnel IP»:

Inserimento «IP tunnel» — «Generale»
Caratteristica
Significato

Name
A vostra 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

Segreto Ipsec
Disattiviamo il campo (altrimenti verrà creato un nuovo Peer)

Keepalive
Disattiviamo il campo (altrimenti l'interfaccia si spegnerà continuamente, poiché il Mikrotik ha un formato proprietario di questi pacchetti che non funziona con Linux)

DSCP
ereditiamo

Non frammentare
no

Clamp TCP MSS
true

Consenti Fast Path
true

Sezione «IP» — «Indirizzi», aggiungiamo l'indirizzo:

Caratteristica
Significato

Indirizzo
192.168.0.2/30

Interfaccia
IPIP-IPsec0

Ora puoi aggiungere rotte nelle reti dietro la macchina Linux; aggiungendo la rotta, il gateway sarà la nostra interfaccia IPIP-IPsec0.

PS

Poiché il nostro server Linux è di transito, ha senso impostare il parametro Clamp TCP MSS per le interfacce IPIP:

creiamo il 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 un nginx (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, bisogna aggiungere una regola route con destinazione 192.168.0.1 per i pacchetti con indirizzo sorgente 10.10.10.1 e porte 80, 443.

# Anche su Linux funziona il server OpenVPN 172.16.0.1/24, per i client che usano la connessione 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 le relative autorizzazioni in iptables se sono attivi i filtri 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