IPIP IPsec VPN tunel med Linux strojem in Mikrotikom za NAT ponudnikom

Linux: Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-generično x86_64)

  • Eth0 1.1.1.1/32 zunanji IP
  • ipip-ipsec0 192.168.0.1/30 bo naš tunel

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 notranji IP od ponudnika. Zunanji NAT IP ponudnika je dinamičen.
  • ipip-ipsec0 192.168.0.2/30 bo naš tunel

Ustvarili bomo tunel IPsec na računalniku Linux z racoonom. Ne bom opisoval podrobnosti, obstaja dober članek у vvpoloskin.

Namestite potrebne pakete:

sudo install racoon ipsec-tools

Konfiguriramo racoon, pogojno bo deloval kot strežnik ipsec. Ker mikrotik v glavnem načinu ne more prenesti dodatnega identifikatorja odjemalca in je zunanji naslov IP, prek katerega se povezuje z Linuxom, dinamičen, uporaba ključa v predhodni skupni rabi (avtorizacija gesla) ne bo delovala, saj se mora geslo ujemati z naslovom IP povezovalni gostitelj ali z identifikatorjem.

Uporabili bomo avtorizacijo s ključi RSA.

Racoon daemon uporablja ključe v formatu RSA, mikrotik pa v formatu PEM. Če ključe generirate s pripomočkom plainrsa-gen, ki je priložen racoonu, potem javnega ključa za Mikrotiko ne boste mogli pretvoriti v format PEM z njegovo pomočjo - pretvori samo v eno smer: PEM v RSA. Niti openssl niti ssh-keygen nista mogla prebrati ključa, ki ga je ustvaril plainrsa-gen, zato pretvorba tudi z njuno uporabo ne bo mogoča.

Ustvarili bomo ključ PEM z uporabo openssl in ga nato pretvorili za racoon z uporabo 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

Prejete ključe bomo shranili v mapo: /etc/racoon/certs/server. Ne pozabite nastaviti lastnika uporabnika, pod imenom katerega se zažene racoon daemon (običajno root) na 600 dovoljenj.

Opisal bom nastavitev mikrotika pri povezovanju preko WinBoxa.

Naložite ključ server-name.pub.pem v mikrotik: Meni “Datoteke” - “Naloži”.

Odprite razdelek »IP« - »IP sec« - zavihek »Ključi«. Sedaj generiramo ključe - gumb “Generate Key”, nato izvozimo javni ključ mikrotika “Expor Pub. Ključ«, ga lahko prenesete iz razdelka »Datoteke«, z desno miškino tipko kliknite datoteko - »Prenos«.

Uvozimo javni ključ racoon, »Uvoz«, na spustnem seznamu polja »Ime datoteke« poiščemo ime-strežnika.pub.pem, ki smo ga prenesli prej.

Javni ključ mikrotik je treba pretvoriti

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

in ga postavite v mapo /etc/racoon/certs, pri čemer ne pozabite na lastnika in pravice.

konfiguracija racoon s komentarji: /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 config

Nazaj na razdelek "IP" - "IPsec"

Zavihek "Profili".
Parameter
Vrednost

Ime
Po vaši presoji (privzeto privzeto)

Algoritem razpršitve
sha512

Šifrirni algoritem
aes-128

DH-skupina
modp2048

Proposhal_check
trdijo

Lifetime
1d 00:00:00

Prehod NAT
res (označite polje)

DPD
120

Največja napaka DPD
5

Kartica Vrste
Parameter
Vrednost

Ime
Po vaši presoji (v nadaljevanju MyPeer)

Naslov:
1.1.1.1 (stroji IP Linux)

Lokalni naslov
10.0.0.2 (IP WAN vmesnik mikrotik)

profil
privzeto

Način izmenjave
Glavni

Pasivna
false

Pošlji INITIAL_CONTACT
Res

Zavihek s predlogi
Parameter
Vrednost

Ime
Po vaši presoji (v nadaljevanju MyPeerProposal)

Auth. Algoritmi
sha512

Encr. Algoritmi
aes-128-cbc

Lifetime
08:00:00

Skupina PFS
modp2048

Zavihek "Identitete".
Parameter
Vrednost

Kruška
MyPeer

Atuh. Metoda
ključ rsa

Ključne
mikrotik.privet.key

Daljinski ključ
ime-strežnika.pub.pem

Skupina predlog pravilnika
privzeto

Notrack veriga
prazno

Vrsta moje osebne izkaznice
avto

Vrsta daljinskega ID-ja
avto

Ujemaj po
daljinski id

Konfiguracija načina
prazno

Ustvari pravilnik
št

Zavihek "Pravilniki - Splošno"
Parameter
Vrednost

Kruška
MyPeer

Predor
Res

Src Naslov
192.168.0.0/30

Cilj Naslov
192.168.0.0/30

Protokol
255 (vse)

predloga
false

Zavihek "Pravilniki - dejanje"
Parameter
Vrednost

Ukrep
šifriranje

Stopnja
zahtevati

Protokoli IPsec
esp

Predlog
MyPeerProposal

Najverjetneje imate, tako kot jaz, na vmesniku WAN konfiguriran snat/masquerade; to pravilo je treba prilagoditi tako, da gredo odhodni paketi ipsec v naš tunel:
Pojdite na razdelek "IP" - "Požarni zid".
Zavihek "NAT", odprite naše pravilo snat/masquerade.

Zavihek Napredno
Parameter
Vrednost

Politika IPsec
ven: nobena

Ponovni zagon racoon demona

sudo systemctl restart racoon

Če se racoon ob ponovnem zagonu ne zažene, je prišlo do napake v konfiguraciji; v sistemskem dnevniku racoon prikaže informacije o številki vrstice, v kateri je bila odkrita napaka.

Ko se operacijski sistem zažene, se demon racoon zažene, preden se prikažejo omrežni vmesniki, v razdelku poslušanja pa smo določili možnost strict_address; v datoteko systemd morate dodati enoto racoon
/lib/systemd/system/racoon.service, v razdelku [Enota], vrstica After=network.target.

Zdaj bi morali naši tuneli ipsec delovati, poglejte izhod:

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

Če tuneli niso odprti, poglejte syslog ali journalctl -u racoon.

Zdaj morate konfigurirati vmesnike L3, da bo promet lahko usmerjen. Možne so različne možnosti, uporabili bomo IPIP, ker ga mikrotik podpira, jaz bi uporabil vti, a žal še ni implementiran v mikrotik. Od IPIP-a se razlikuje po tem, da zna dodatno inkapsulirati multicast in na pakete postavljati oznake fwmark, s katerimi jih je mogoče filtrirati v iptables in iproute2 (policy-based routing). Če potrebujete največjo funkcionalnost, potem na primer GRE. Vendar ne pozabite, da plačujemo dodatno funkcionalnost z velikimi režijskimi stroški.

Ogledate si lahko prevod dobrega pregleda tunelskih vmesnikov tukaj.

V sistemu 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

Zdaj lahko dodate poti za omrežja za mikrotik

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

Da bi se naš vmesnik in poti dvignili po ponovnem zagonu, moramo vmesnik opisati v /etc/network/interfaces in tja dodati poti v post-upu ali vse napisati v eno datoteko, na primer /etc/ ipip-ipsec0.conf in jo potegnite skozi post-up, ne pozabite na lastnika datoteke, pravice in jo naredite izvršljivo.

Spodaj je primer datoteke

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

Na Mikrotiku:

V razdelku »Vmesniki« dodajte nov vmesnik »IP tunel«:

Zavihek “IP tunel” - “Splošno”
Parameter
Vrednost

Ime
Po vaši presoji (v nadaljevanju IPIP-IPsec0)

MTU
1480 (če ni podano, začne mikrotik rezati mtu na 68)

Lokalni naslov
192.168.0.2

Oddaljeni naslov
192.168.0.1

Skrivnost IPsec
Deaktiviraj polje (sicer bo ustvarjen nov Peer)

Obdržati pri življenju
Deaktiviraj polje (sicer se bo vmesnik nenehno izklapljal, saj ima mikrotika svoj format za te pakete in ne deluje z Linuxom)

DSCP
dediščino

Ne fragmentiraj
št

Sponka TCP MSS
Res

Dovoli hitro pot
Res

V razdelek »IP« - »Naslovi« dodajte naslov:

Parameter
Vrednost

Naslov:
192.168.0.2/30

vmesnik
IPIP-IPsec0

Zdaj lahko dodate poti v omrežje za računalnikom Linux; pri dodajanju poti bo prehod naš vmesnik IPIP-IPsec0.

PS

Ker je naš strežnik Linux tranzitiven, je smiselno na njem nastaviti parameter Clamp TCP MSS za vmesnike ipip:

ustvarite datoteko /etc/iptables.conf z naslednjo vsebino:

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

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

Imam nginx, ki teče v omrežju za mikrotikom (ip 10.10.10.1), naredim ga dostopnega iz interneta, dodam ga v /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 pozabite dodati ustreznih dovoljenj za iptables, če imate omogočene paketne filtre.

Ostanite zdravi!

Vir: www.habr.com

Dodaj komentar