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

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

Imposteremo un tunnel IPsec su una macchina Linux usando racoon. Non descriverò i dettagli, c'è una buona articolo у vvpoloskin.

Installa i pacchetti richiesti:

sudo install racoon ipsec-tools

Configuriamo Racoon, che agirà in modo condizionale come server IPsec. Poiché Mikrotik in modalità principale non può trasmettere un identificativo client aggiuntivo e l'indirizzo IP esterno tramite cui si connette a Linux è dinamico, non sarà possibile utilizzare una chiave precondivisa (autorizzazione tramite password), poiché la password deve corrispondere all'indirizzo IP dell'host che si connette o all'identificativo.

Utilizzeremo l'autorizzazione tramite chiave RSA.

Il demone Racoon utilizza chiavi in ​​formato RSA, mentre Mikrotik utilizza chiavi in ​​formato PEM. Se si generano chiavi con l'utility plainrsa-gen inclusa in Racoon, non sarà possibile convertire la chiave pubblica di Mikrotika in formato PEM: la conversione avviene in un solo modo: da PEM a RSA. Né OpenSSL né SSH-KeyGen possono leggere la chiave generata da PlainRSA-Gen, quindi non sarà possibile convertirla.

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

Copia le chiavi ricevute nella cartella /etc/racoon/certs/server. Non dimenticare di impostare come proprietario l'utente per conto del quale viene avviato il demone racoon (solitamente root), con diritti pari a 600.

Descriverò la configurazione di Mikrotik quando ci si connette tramite WinBox.

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

Apri la sezione "IP" - "IP sec" - scheda "Chiavi". Ora genera le chiavi - pulsante "Genera chiave", quindi esporta la chiave pubblica mikrotika "Esporta chiave pubblica". Puoi scaricarla dalla sezione "File", fai clic con il pulsante destro del mouse sul file - "Scarica".

Importiamo la chiave pubblica racoon, “Importa”, nell’elenco a discesa del campo “Nome file” cerchiamo il server-name.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 inserirlo nella cartella /etc/racoon/certs, senza dimenticare il proprietario e i diritti.

configurazione 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 mikrotik

Torna alla sezione "IP" - "IPsec"

Scheda "Profili"
Parametro
Valore

Nome
A tua discrezione (impostazione predefinita)

Algoritmo hash
sha512

Algoritmo di crittografia
aes-128

Gruppo DH
modp2048

Verifica proposta
rivendicare

Per sempre.
1° 00:00:00

NAT Attraversamento
vero (seleziona la casella)

DPD
120

DPD Massimo Guasto
5

Scheda Peer
Parametro
Valore

Nome
A tua discrezione (di seguito MyPeer)

Indirizzo
1.1.1.1 (macchine IP Linux)

Indirizzo locale
10.0.0.2 (interfaccia micrometrica IP WAN)

Profile
difetto

Modalità di scambio
principale

Passivo
falso

Invia INITIAL_CONTACT
vero

Scheda Proposta
Parametro
Valore

Nome
A tua discrezione (di seguito MyPeerProposal)

Algoritmi di autenticazione
sha512

Algoritmi Encr.
aes-128-cbc

Per sempre.
08:00:00

Gruppo PFS
modp2048

Scheda Identità
Parametro
Valore

Pera
Il mio peer

Atuh. Metodo
chiave RSA

Le
mikrotik.privet.key

Chiave remota
nome-server.pub.pem

PolicyTampaGrupp
difetto

Catena Notrack
è vuoto

Il mio tipo di ID
auto

Tipo di ID remoto
auto

Abbinamento per
ID remoto

Configurazione della modalità
è vuoto

Genera politica
no

Scheda "Criteri — Generale"
Parametro
Valore

Pera
Il mio peer

Tunnel
vero

Indirizzo di origine
192.168.0.0/30

Indirizzo di destinazione
192.168.0.0/30

Protocollo
255 (tutti)

Modello
falso

Criteri — Scheda Azione
Parametro
Valore

Action
cifrare

Livella
necessario

Protocolli IPsec
esp

Proposta
MyPeerProposal

Molto probabilmente, anche tu, come me, hai configurato snat/masquerade sull'interfaccia WAN; questa regola deve essere modificata in modo che i pacchetti IPsec in uscita vengano inseriti nel nostro tunnel:
Andare 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; racoon visualizza informazioni sul numero di riga in cui è stato rilevato l'errore in syslog.

Il demone racoon si avvia prima che le interfacce di rete vengano sollevate all'avvio del sistema operativo e abbiamo specificato l'opzione strict_address nella sezione listen; è necessario aggiungerla al file systemd dell'unità racoon.
/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, controllare syslog o journalctl -u racoon.

Ora dobbiamo configurare le interfacce L3 per poter instradare il traffico. Ci sono diverse opzioni: useremo IPIP, poiché Mikrotik lo supporta; io userei VTI, ma sfortunatamente Mikrotik non lo ha ancora implementato. Si differenzia da IPIP in quanto può incapsulare ulteriormente il multicast e applicare marcatori (fwmark) ai pacchetti, con cui possono essere filtrati in iptables e iproute2 (routing basato su policy). Se si necessita della massima funzionalità, allora, ad esempio, GRE. Ma non dimentichiamo che pagare per funzionalità aggiuntive comporta un overhead elevato.

È possibile visualizzare una traduzione di una buona panoramica delle interfacce del 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

Per far sì che la nostra interfaccia e i nostri percorsi siano attivi dopo il riavvio, dobbiamo descrivere l'interfaccia in /etc/network/interfaces e aggiungere i percorsi lì in post-up, oppure scrivere tutto in un file, ad esempio /etc/ipip-ipsec0.conf ed eseguirlo tramite post-up, senza dimenticare il proprietario del file, i diritti e renderlo eseguibile.

Un file di esempio è riportato sotto il taglio.

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

Inserisci "Tunnel IP" - "Generale"
Parametro
Valore

Nome
A tua discrezione (di seguito IPIP-IPsec0)

MTU
1480 (se non specificato, Mikrotik inizia a ridurre MTU a 68)

Indirizzo locale
192.168.0.2

Indirizzo remoto
192.168.0.1

Segreto IPSec
Disattivare il campo (altrimenti verrà creato un nuovo Peer)

Mantieni vivo
Disattivare il campo (altrimenti l'interfaccia sarà costantemente disattivata, poiché mikrotika ha un suo formato per questi pacchetti e non funziona con Linux)

DSCP
ereditare

Non frammentare
no

Morsetto TCP MSS
vero

Consenti percorso veloce
vero

Sezione "IP" - "Indirizzi", aggiungere l'indirizzo:

Parametro
Valore

Indirizzo
192.168.0.2/30

Interfaccia
IPIP-IPsec0

Ora puoi aggiungere percorsi alla rete dietro la macchina Linux. Quando aggiungi un percorso, 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:

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), rendiamolo accessibile da Internet, aggiungendo 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