IPIP IPsec VPN тунел между машина с Linux и Mikrotik зад NAT на доставчика

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

  • Eth0 1.1.1.1/32 външен IP
  • ipip-ipsec0 192.168.0.1/30 ще бъде нашият тунел

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 вътрешен IP от доставчика. Външният IP на доставчика е динамичен NAT.
  • ipip-ipsec0 192.168.0.2/30 ще бъде нашият тунел

IPsec тунел на Linux машината ще бъде настроен с racoon. Няма да описвам подробности, има добра статия у vvpoloskin.

Инсталираме необходимите пакети:

sudo install racoon ipsec-tools

Конфигурираме racoon, който условно ще играе ролята на ipsec сървър. Тъй като mikrotik в основен режим не може да предава допълнителен идентификатор на клиента, а външният IP адрес, чрез който се свързва с Linux, е динамичен, не можем да използваме preshared key (авторизация по парола), защото паролата трябва да съвпада или с IP адреса на свързващият хост, или с идентификатора.

Ще използваме авторизация по RSA ключове.

Демонът racoon използва ключове в RSA формат, а mikrotik — в PEM формат. Ако генерираме ключовете с помощта на утилита plainrsa-gen, която идва заедно с racoon, не можем да конвертираме публичния ключ за Mikrotik в PEM формат с нея, тъй като тя конвертира само в една посока: PEM в RSA. Сгенерираният plainrsa-gen ключ не можеше да бъде прочетен нито от openssl, нито от ssh-keygen, така че не бихме могли да извършим конверсията и с тях.

Ние ще генерираме PEM ключ с помощта на openssl, а след това ще го конвертираме за racoon с помощта на 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

Получените ключове ще поставим в папката: /etc/racoon/certs/server. Не забравяйте да установите собственика на потребителя, от името на когото се стартира демонът racoon (обикновено root), права 600.

Настройката на mikrotik ще опиша при свързване през WinBox.

Ключът server-name.pub.pem ще качим в mikrotik: Меню „Files“ — „Upload.“

Отваряме раздела „IP“ — „IP sec“ — таб „Keys“. Сега генерираме ключове — бутон „Generate Key“, след това експортираме публичния ключ на mikrotik „Export Pub. Key“, можете да го свалите от раздела „Files“, с десен клик върху файла — „Download.“

Импортираме публичния ключ racoon, „Import“, в падащото меню на полето „File name“ търсим качения преди това server-name.pub.pem.

Публичният ключ на mikrotik трябва да бъде конвертиран

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

и поставен в папката /etc/racoon/certs, не забравяйте за собственика и правата.

Конфигурация на racoon с коментари: /etc/racoon/racoon.conf

информация о журнале; # Ниво на записите, при дебъгване използваме 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 и споразумение с хостовете, които се свързват. Tъй като 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

Връщаме се в раздела "IP" — "IPsec"

Вкладка "Профили"
Параметър
Стойност

Name
По ваше усмотрение (по подразбиране default)

Алгоритъм на хеширане
sha512

Алгоритъм за шифроване
aes-128

DH-Група
modp2048

Proposhal_check
claim

Време на живот
1d 00:00:00

NAT Traversal
вярно (поставете отметка)

DPD
120

DPD Максимален провал
5

Вкладка "Партньори"
Параметър
Стойност

Name
По ваше усмотрение (по-нататък MyPeer)

Address
1.1.1.1 (IP на Linux машината)

Локален адрес
10.0.0.2 (IP на WAN интерфейса на mikrotik)

Профил
по подразбиране

Режим на размяна
main

Пасивен
неверно

Изпращане на INITIAL_CONTACT
истинно

Вкладка "Предложение"
Параметър
Стойност

Name
По ваше усмотрение (по-нататък MyPeerProposal)

Алгоритми на удостоверяване
sha512

Алгоритми на криптиране
aes-128-cbc

Време на живот
08:00:00

PFS Група
modp2048

Вкладка "Идентичности"
Параметър
Стойност

Партньор
MyPeer

Метод на удостоверяване
rsa key

Ключ
mikrotik.privet.key

Отдалечен ключ
server-name.pub.pem

Група по шаблони на политики
по подразбиране

Notrack Chain
празно

Тип на моя ID
auto

Тип на отдалечения ID
auto

Сравнение по
отдалечен ID

Конфигурация на режима
празно

Генериране на политика
не

Вкладка "Политики — Общи"
Параметър
Стойност

Партньор
MyPeer

Тунел
истинно

Изходящ адрес
192.168.0.0/30

Целеви адрес
192.168.0.0/30

Протокол
255 (всички)

Шаблон
неверно

Вкладка "Политики — Действие"
Параметър
Стойност

Action
encrypt

Ниво
изисква

IPsec Протоколи
esp

Предложение
MyPeerProposal

Вероятно имате, както и аз, на WAN интерфейса настроен snat/masquerade, това правило трябва да се коригира, за да изходящите пакети ipsec преминат през нашия тунел:
Преминаваме в раздела "IP" — "Firewall".
Вкладка "NAT", отворете правилото ни snat/masquerade.

Вкладка "Разширени"
Параметър
Стойност

Политика на IPsec
out: none

Рестартиране на демона racoon

sudo systemctl restart racoon

Ако при рестартиране racoon не се стартира, значи в конфигурацията има грешка, в syslog racoon извежда информация за номера на реда, в който е открита грешката.

Демонът racoon при зареждане на ОС стартира преди повдигането на мрежовите интерфейси, а ние указахме в секцията listen опция strict_address, необходимо е да добавим в файла systemd юнита racoon
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Сега нашите ipsec тунели трябва да са активни, наблюдаваме извода:

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

Ако тунелите не са активни, погледнете syslog, или journalctl -u racoon.

Сега е необходимо да настроим L3 интерфейсите, за да може да маршрутизиране трафика. Има различни опции, ние ще използваме IPIP, тъй като Mikrotik го поддържа. Бих използвал VTI, но за съжаление в Mikrotik все още не е реализирано. IPIP се отличава с това, че допълнително може да инкапсулира multicast и да поставя етикети (fwmark) на пакетите, по които може да се филтрират в iptables и iproute2 (маршрутизиране, базирано на политики). Ако е необходима максимална функционалност — например GRE. Но не трябва да забравяме, че за допълнителната функционалност плащаме с голям оверхед.

Можете да видите добър превод на прегледа на тунелните интерфейси. тук.

На 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

Сега можем да добавим маршрути за мрежите зад Mikrotik.

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

За да се уверим, че нашият интерфейс и маршрути ще се активират след рестартиране, трябва да опишем интерфейса в /etc/network/interfaces и там да добавим маршрутите с post-up, или да запишем всичко в един файл, например, /etc/ipip-ipsec0.conf и да го извикаме чрез post-up. Не забравяйте за собственика на файла, правата и да го направите изпълняем.

Под катай е пример на файл.

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

На Mikrotik:

Раздел «Interfaces», добавяме нов интерфейс «IP tunnel»:

Вкладка «IP tunnel» — «General»
Параметър
Стойност

Name
На ваше усмотрение (по-нататък IPIP-IPsec0)

MTU
1480 (ако не указвате, Mikrotik започва да намалява mtu до 68)

Локален адрес
192.168.0.2

Remote Address
192.168.0.1

Ipsec Secret
Деактивираме полето (иначе ще се създаде нов Peer)

Keepalive
Деактивираме полето (иначе интерфейсът постоянно ще се изключва, тъй като Mikrotik има свой формат на тези пакети и не работи с Linux)

DSCP
наследяване

Dont Fragment
не

Clamp TCP MSS
истинно

Позволи Fast Path
истинно

Раздел «IP» — «Addresses», добавяме адрес:

Параметър
Стойност

Address
192.168.0.2/30

Interface
IPIP-IPsec0

Сега можем да добавим маршрути за мрежите зад Linux машината, при добавяне на маршрута, gateway ще бъде нашият интерфейс IPIP-IPsec0.

PS

Тъй като нашият Linux сървър е транзитен, има смисъл да зададем параметъра Clamp TCP MSS за ipip интерфейсите:

създаваме файл /etc/iptables.conf със следното съдържание:

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

и в /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

В мрежата зад Mikrotik имам работещ nginx (ip 10.10.10.1), правим го достъпен от интернет, добавяме в /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 

Не забравяйте да добавите съответните разрешения в iptables, ако имате включени филтри на пакетите.

Бъдете здрави!

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster