IPIP Tunnel VPN IPsec tra la macchina Linux e Mikrotik dietro il provider NAT

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

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

Miktoik: CCR 1009, RouterOS 6.46.5

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

Creeremo un tunnel IPsec su una macchina Linux utilizzando racoon. Non descriverò i dettagli, ce n’è uno buono articolo у vvpoloskin.

Installa i pacchetti richiesti:

sudo install racoon ipsec-tools

Configuriamo racoon, fungerà condizionatamente da server ipsec. Poiché mikrotik in modalità principale non può trasmettere un identificatore client aggiuntivo e l'indirizzo IP esterno attraverso il quale si connette a Linux è dinamico, l'utilizzo di una chiave precondivisa (autorizzazione tramite password) non funzionerà, poiché la password deve corrispondere all'indirizzo IP di l'host che si connette o con l'identificatore.

Utilizzeremo l'autorizzazione utilizzando le chiavi RSA.

Il demone racoon utilizza chiavi nel formato RSA e mikrotik utilizza il formato PEM. Se generi chiavi utilizzando l'utilità plainrsa-gen fornita con racoon, non sarai in grado di convertire la chiave pubblica per Mikrotika in formato PEM con il suo aiuto: converte solo in una direzione: PEM in RSA. Né openssl né ssh-keygen potrebbero leggere la chiave generata da plainrsa-gen, quindi la conversione non sarà possibile neanche utilizzandoli.

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

Metteremo le chiavi ricevute nella cartella: /etc/racoon/certs/server. Non dimenticare di impostare i permessi del proprietario dell'utente con il cui nome viene avviato il demone racoon (solitamente root) su 600.

Descriverò la configurazione di mikrotik quando mi connetto tramite WinBox.

Carica la chiave server-name.pub.pem su mikrotik: Menu “File” - “Carica”.

Aprire la sezione “IP” - “IP sec” - scheda “Chiavi”. Ora generiamo le chiavi: il pulsante “Genera chiave”, quindi esportiamo la chiave pubblica mikrotika “Expor Pub. Key", puoi scaricarlo dalla sezione "File", facendo clic con il tasto destro del mouse sul file - "Download".

Importiamo la chiave pubblica di racoon, “Importa”, nell'elenco a discesa del campo “Nome file” cerchiamo il nome-server.pub.pem che abbiamo scaricato in precedenza.

La chiave pubblica mikrotik deve essere convertita

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

e inseriscilo nella cartella /etc/racoon/certs, senza dimenticare il proprietario e i diritti.

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

configurazione micrometrica

Ritorna alla sezione "IP" - "IPsec"

Scheda "Profili".
Parametro
Valore

Nome
A tua discrezione (per impostazione predefinita)

Algoritmo hash
sha512

Algoritmo di crittografia
aes-128

Gruppo DH
modp2048

Proposta_controllo
rivendicare

Tutta la vita.
1° 00:00:00

NAT Attraversamento
vero (seleziona la casella)

DPD
120

DPD Massimo fallimento
5

Scheda peer
Parametro
Valore

Nome
A tua discrezione (di seguito denominato MyPeer)

Indirizzo
1.1.1.1 (macchine IP Linux)

Indirizzo locale
10.0.0.2 (interfaccia micrometrica IP WAN)

Profilo
difetto

Modalità di scambio
principale

Passivo
falso

Invia INITIAL_CONTACT
vero

Scheda proposta
Parametro
Valore

Nome
A tua discrezione (di seguito denominato MyPeerProposal)

Aut. Algoritmi
sha512

Incr. Algoritmi
aes-128-cbc

Tutta la vita.
08:00:00

Gruppo PFS
modp2048

Scheda "Identità".
Parametro
Valore

Pera
MyPeer

Sì. Metodo
chiave rsa

Le
mikrotik.privet.key

Chiave remota
nome-server.pub.pem

Gruppo di modelli di policy
difetto

Catena NoTrack
è vuoto

Il mio tipo di documento d'identità
auto

Tipo ID remoto
auto

Abbina per
ID remoto

Configurazione modalità
è vuoto

Genera politica
no

Scheda "Politiche - Generale"
Parametro
Valore

Pera
MyPeer

Tunnel
vero

Src. Indirizzo
192.168.0.0/30

Dest. Indirizzo
192.168.0.0/30

Protocollo
255 (tutti)

Modello
falso

Scheda "Politiche - Azione"
Parametro
Valore

Action
cifrare

Livello
richiedere

Protocolli IPsec
esp

Proposta
MyPeerProposal

Molto probabilmente, come me, hai configurato snat/masquerade sulla tua interfaccia WAN; questa regola deve essere modificata in modo che i pacchetti ipsec in uscita entrino nel nostro tunnel:
Vai alla sezione "IP" - "Firewall".
Scheda "NAT", apri la nostra regola snat/masquerade.

Scheda Avanzate
Parametro
Valore

Politica IPsec
fuori: nessuno

Riavviare il demone procione

sudo systemctl restart racoon

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

All'avvio del sistema operativo, il demone racoon si avvia prima che vengano attivate le interfacce di rete e abbiamo specificato l'opzione strict_address nella sezione di ascolto; è necessario aggiungere l'unità racoon al file systemd
/lib/systemd/system/racoon.service, nella sezione [Unit], riga After=network.target.

Ora i nostri tunnel ipsec dovrebbero essere attivi, guarda 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 через который подключается 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

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

Ora è necessario configurare le interfacce L3 in modo che il traffico possa essere instradato. Ci sono diverse opzioni, useremo IPIP, dato che mikrotik lo supporta, userei vti, ma sfortunatamente non è ancora stato implementato in mikrotik. Si differenzia da IPIP in quanto può inoltre incapsulare il multicast e inserire fwmark sui pacchetti, mediante i quali possono essere filtrati in iptables e iproute2 (routing basato su policy). Se hai bisogno della massima funzionalità, quindi, ad esempio, GRE. Ma non dimenticare che per funzionalità aggiuntive paghiamo con una grande testata.

Puoi vedere la traduzione di una buona panoramica delle interfacce dei 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/Prefix via 192.168.255.2

Affinché la nostra interfaccia e i percorsi vengano generati dopo un riavvio, dobbiamo descrivere l'interfaccia in /etc/network/interfaces e aggiungere percorsi lì nel post-up, oppure scrivere tutto in un file, ad esempio /etc/ ipip-ipsec0.conf ed estrailo tramite post-up, non dimenticare il proprietario del file, i diritti e rendilo eseguibile.

Di seguito è riportato un file di esempio

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

Sezione “Interfacce”, aggiungere una nuova interfaccia “Tunnel IP”:

Scheda “Tunnel IP” - “Generale”
Parametro
Valore

Nome
A tua discrezione (di seguito denominato IPIP-IPsec0)

MTU
1480 (se non specificato, mikrotik inizia a tagliare mtu a 68)

Indirizzo locale
192.168.0.2

Indirizzo remoto
192.168.0.1

Segreto IPsec
Disattiva il campo (altrimenti verrà creato un nuovo Peer)

Tieni vivo
Disattiva il campo (altrimenti l'interfaccia si spegnerà costantemente, poiché mikrotika ha un proprio formato per questi pacchetti e non funziona con Linux)

DSCP
ereditare

Non frammentare
no

Morsetto TCP MSS
vero

Consenti percorso veloce
vero

Nella sezione “IP” - “Indirizzi”, aggiungere l'indirizzo:

Parametro
Valore

Indirizzo
192.168.0.2/30

Interfaccia
IPIP-IPsec0

Ora puoi aggiungere percorsi alla rete dietro una macchina Linux; quando aggiungi un percorso, il gateway sarà la nostra interfaccia IPIP-IPsec0.

PS

Dato che il nostro server Linux è transitivo, ha senso impostare su di esso il parametro Clamp TCP MSS per le interfacce ipip:

creare 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

Ho nginx in esecuzione sulla rete dietro mikrotik (ip 10.10.10.1), lo rendo accessibile da Internet, lo aggiungo a /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 

Non dimenticare di aggiungere le autorizzazioni appropriate a iptables se hai abilitato i filtri dei pacchetti.

Rimanere in buona salute!

Fonte: habr.com

Aggiungi un commento