IPIP IPsec VPN-tunelo inter Linukso-maŝino kaj Mikrotik malantaŭ NAT-provizanto

Linukso: Ubuntu 18.04.4 LTS (GNU/Linukso 4.15.0-91-genera x86_64)

  • Eth0 1.1.1.1/32 ekstera IP
  • ipip-ipsec0 192.168.0.1/30 estos nia tunelo

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 interna IP de la provizanto. La ekstera NAT IP de la provizanto estas dinamika.
  • ipip-ipsec0 192.168.0.2/30 estos nia tunelo

Ni kreos IPsec-tunelon sur Linukso-maŝino uzante lavurson. Mi ne priskribos la detalojn, estas bona artikolo у vvpoloskin.

Instalu la necesajn pakaĵojn:

sudo install racoon ipsec-tools

Ni agordas racoon, ĝi kondiĉe funkcios kiel ipsec-servilo. Ĉar mikrotik en ĉefa reĝimo ne povas transdoni aldonan klientidentigilon, kaj la ekstera IP-adreso per kiu ĝi konektas al Linukso estas dinamika, uzi antaŭdividitan ŝlosilon (pasvortpermeso) ne funkcios, ĉar la pasvorto devas esti kongrua aŭ kun la IP-adreso de la kunliganta gastiganto, aŭ kun identigilo.

Ni uzos rajtigon per RSA-ŝlosiloj.

La lavurso-demono uzas ŝlosilojn en la RSA-formato, kaj mikrotik uzas la PEM-formaton. Se vi generas ŝlosilojn per la ilo plainrsa-gen, kiu venas kun lavurso, tiam vi ne povos konverti la publikan ŝlosilon por Mikrotika al formato PEM kun ĝia helpo - ĝi konvertas nur en unu direkto: PEM al RSA. Nek openssl nek ssh-keygen povis legi la generitan ŝlosilon per plainrsa-gen, do la konvertiĝo ankaŭ ne eblos uzante ilin.

Ni generos PEM-ŝlosilon per openssl kaj poste konverti ĝin por racoon uzante 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

Ni metos la ricevitajn ŝlosilojn en la dosierujon: /etc/racoon/certs/server. Ne forgesu agordi la posedanton de la uzanto sub kies nomo la lavurso-demono estas lanĉita (kutime radiko) al 600 permesoj.

Mi priskribos la mikrotik-aranĝon kiam mi konektos per WinBox.

Alŝutu la ŝlosilon server-name.pub.pem al mikrotik: Menuo "Dosieroj" - "Alŝutu".

Malfermu la sekcion "IP" - "IP sek" - langeto "Ŝlosiloj". Nun ni generas ŝlosilojn - la butonon "Generu Ŝlosilon", tiam eksportu la mikrotika publikan ŝlosilon "Expor Pub. Ŝlosilo", vi povas elŝuti ĝin el la sekcio "Dosieroj", dekstre alklaku la dosieron - "Elŝuti".

Ni importas la publikan ŝlosilon de la lavurso, "Importu", en la fallisto de la kampo "Dosieronomo" ni serĉas la server-name.pub.pem, kiun ni elŝutis antaŭe.

La mikrotik publika ŝlosilo devas esti konvertita

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

kaj metu ĝin en la dosierujon /etc/racoon/certs, ne forgesante pri la posedanto kaj rajtoj.

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

mikrotik agordo

Reiru al la sekcio "IP" - "IPsec"

langeto "Profiloj".
Parametro
valoro

Nomo
Laŭ via bontrovo (defaŭlte)

Hash Algoritmo
sha512

Ĉifrada Algoritmo
aes-128

DH-Grupo
modp2048

Proposhal_check
pretendo

vivdaŭro
1d 00:00:00

NAT Traversal
vera (marku la skatolon)

DPD
120

DPD Maksimuma fiasko
5

Samuloj langeto
Parametro
valoro

Nomo
Laŭ via bontrovo (ĉi-poste nomata MyPeer)

Adreso
1.1.1.1 (IP Linuksaj maŝinoj)

Loka Adreso
10.0.0.2 (IP WAN-interfaco mikrotik)

Profilo
defaŭlte

Interŝanĝreĝimo
ĉefa

pasivaj
falsa

Sendu INITIAL_CONTACT
veraj

Propona langeto
Parametro
valoro

Nomo
Laŭ via bontrovo (ĉi-poste MyPeerProposal)

Aŭt. Algoritmoj
sha512

Enkr. Algoritmoj
aes-128-cbc

vivdaŭro
08:00:00

Grupo PFS
modp2048

langeto "Identecoj".
Parametro
valoro

Kunulo
MiaPeer

Atuh. Metodo
rsa klavo

ŝlosilo
mikrotik.privet.key

Fora Ŝlosilo
servilo-nomo.pub.pem

Politika Ŝablona Grupo
defaŭlte

Notrack Ĉeno
malplena

Mia ID-Tipo
aŭto

Fora ID-Tipo
aŭto

Match By
fora id

Reĝima Agordo
malplena

Generu Politikon
ne

Langeto "Politiko - Ĝenerala"
Parametro
valoro

Kunulo
MiaPeer

Tunelo
veraj

Sr. Adreso
192.168.0.0/30

Dest. Adreso
192.168.0.0/30

protokolon
255 (ĉiuj)

template
falsa

Langeto "Politiko - Ago"
Parametro
valoro

ago
ĉifri

nivelo
postuli

IPsec-Protokoloj
esp

Propono
MiaPeerProposal

Plej verŝajne, kiel mi, vi havas snat/masquerade agordita sur via WAN-interfaco; ĉi tiu regulo devas esti alĝustigita por ke elirantaj ipsec-pakoj eniru nian tunelon:
Iru al la sekcio "IP" - "Fajroŝirmilo".
"NAT" langeto, malfermu nian snat/masquerade regulon.

Altnivela Tab
Parametro
valoro

IPsec Politiko
ekstere: neniu

Rekomencante la lavurso-demonon

sudo systemctl restart racoon

Se racoon ne komenciĝas post rekomenco, tiam estas eraro en la agordo; en syslog, racoon montras informojn pri la linionumero en kiu la eraro estis detektita.

Kiam la OS ekfunkciigas, la lavurso-demono komenciĝas antaŭ ol la retaj interfacoj aperas, kaj ni specifis la strict_address-opcion en la aŭskulta sekcio; vi devas aldoni la lavron-unuon al la systemd-dosiero.
/lib/systemd/system/racoon.service, en la sekcio [Unuo], linio After=network.target.

Nun niaj ipsec-tuneloj devus esti supre, rigardu la eligon:

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 la tuneloj ne funkcias, rigardu syslog, aŭ journalctl -u racoon.

Nun vi devas agordi L3-interfacojn por ke trafiko estu direktita. Estas malsamaj opcioj, ni uzos IPIP, ĉar mikrotik subtenas ĝin, mi uzus vti, sed, bedaŭrinde, ĝi ankoraŭ ne estis efektivigita en mikrotik. Ĝi diferencas de IPIP en tio ke ĝi povas aldone enkapsuligi multicast kaj meti fwmarks sur pakaĵetojn, per kiuj ili povas esti filtritaj en iptables kaj iproute2 (politik-bazita vojigo). Se vi bezonas maksimuman funkciecon, tiam, ekzemple, GRE. Sed ne forgesu, ke ni pagas por plia funkcieco kun granda supra kapo.

Vi povas vidi la tradukon de bona recenzo de tunelaj interfacoj tie.

Sur Linukso:

# Создаем интерфейс
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

Nun vi povas aldoni itinerojn por retoj malantaŭ mikrotik

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

Por ke nia interfaco kaj itineroj estu levitaj post rekomenco, ni devas priskribi la interfacon en /etc/network/interfaces kaj aldoni itinerojn tie en la post-up, aŭ skribi ĉion en unu dosiero, ekzemple, /etc/ ipip-ipsec0.conf kaj tiri ĝin tra post-supren, ne forgesu pri la dosierposedanto, rajtoj kaj faru ĝin efektivigebla.

Malsupre estas ekzempla dosiero

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

Sur Mikrotik:

Sekcio "Interfacoj", aldonu novan interfacon "IP-tunelo":

Langeto "IP-tunelo" - "Ĝenerala"
Parametro
valoro

Nomo
Laŭ via bontrovo (ĉi-poste nomata IPIP-IPsec0)

MTU
1480 (se ne specifita, mikrotik komencas tranĉi mtu al 68)

Loka Adreso
192.168.0.2

Fora Adreso
192.168.0.1

IPsec Sekreto
Malaktivigu la kampon (alie nova Samulo estos kreita)

konserviviva
Malaktivigu la kampon (alie la interfaco konstante malŝaltos, ĉar mikrotika havas sian propran formaton por ĉi tiuj pakoj kaj ne funkcias kun Linukso)

DSCP
heredu

Ne Fragmentu
ne

Krampo TCP MSS
veraj

Permesu Rapidan Vojon
veraj

Sekcio "IP" - "Adresoj", aldonu la adreson:

Parametro
valoro

Adreso
192.168.0.2/30

interfaco
IPIP-IPsec0

Nun vi povas aldoni itinerojn al la reto malantaŭ Linukso-maŝino; kiam vi aldonos itineron, enirejo estos nia IPIP-IPsec0-interfaco.

PS

Ĉar nia Linuksa servilo estas transitiva, estas senco agordi la parametron Clamp TCP MSS por ipip-interfacoj sur ĝi:

kreu dosieron /etc/iptables.conf kun la jena enhavo:

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

kaj en /etc/network/interfaces
post-supren iptables-restore < /etc/iptables.conf

Mi havas nginx funkciantan en la reto malantaŭ mikrotik (ip 10.10.10.1), faru ĝin alirebla de la Interreto, aldonu ĝin al /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 

Ne forgesu aldoni la taŭgajn permesojn al iptables se vi havas pakatajn filtrilojn ebligitaj.

Benu vin!

fonto: www.habr.com

Aldoni komenton