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 ще бъде нашият тунел

Миктоик: CCR 1009, RouterOS 6.46.5

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

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

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

sudo install racoon ipsec-tools

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

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

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

Ще генерираме 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 daemon (обикновено root) на 600 разрешения.

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

Качете ключа server-name.pub.pem в mikrotik: Меню “Файлове” - “Качване”.

Отворете секцията „IP“ - „IP sec“ - раздел „Ключове“. Сега генерираме ключове - бутонът „Генериране на ключ“, след което експортираме публичния ключ mikrotika „Expor Pub. Ключ", можете да го изтеглите от секцията "Файлове", щракнете с десния бутон върху файла - "Изтегляне".

Импортираме публичния ключ на racoon, „Импортиране“, в падащия списък на полето „Име на файл“ търсим името на сървъра.pub.pem, което изтеглихме по-рано.

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

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

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

конфигурация на racoon с коментари: /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

Върнете се към секцията "IP" - "IPsec"

Раздел "Профили".
Параметър
Стойност

Име
По ваша преценка (по подразбиране)

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

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

DH-група
modp2048

Предложи_проверка
иск

Човешки живот
1 ден 00:00:00

NAT преминаване
вярно (поставете отметка в квадратчето)

DPD
120

DPD Максимален отказ
5

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

Име
По ваша преценка (наричан по-долу MyPeer)

Адрес
1.1.1.1 (IP Linux машини)

Местен адрес
10.0.0.2 (IP WAN интерфейс mikrotik)

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

Режим на обмен
основен

Пасивен
фалшив

Изпратете INITIAL_CONTACT
вярно

Раздел Предложение
Параметър
Стойност

Име
По ваша преценка (наричано по-долу MyPeerProposal)

авт. Алгоритми
sha512

Encr. Алгоритми
aes-128-cbc

Човешки живот
08:00:00

PFS Group
modp2048

Раздел "Самоличности".
Параметър
Стойност

Круша
MyPeer

Атух. Метод
RSA ключ

ключ
mikrotik.privet.key

Дистанционен ключ
име-на-сървър.pub.pem

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

Notrack верига
празен

Моят тип ID
автоматичен

Тип отдалечен ID
автоматичен

Съвпадение по
отдалечен идентификатор

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

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

Раздел „Правила – Общи“
Параметър
Стойност

Круша
MyPeer

Тунел
вярно

Src Адрес
192.168.0.0/30

Цел. Адрес
192.168.0.0/30

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

Шаблон
фалшив

Раздел „Правила – действие“
Параметър
Стойност

действие
криптиране

ниво
изискват

IPsec протоколи
ESP

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

Най-вероятно, като мен, имате конфигуриран snat/masquerade на вашия WAN интерфейс; това правило трябва да се коригира, така че изходящите ipsec пакети да влизат в нашия тунел:
Отидете в секцията "IP" - "Защитна стена".
Раздел "NAT", отворете нашето правило за snat/masquerade.

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

Правила за IPsec
извън: няма

Рестартиране на демона миеща мечка

sudo systemctl restart racoon

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

Когато операционната система се зарежда, демонът на racoon се стартира преди извеждането на мрежовите интерфейси и ние посочихме опцията strict_address в секцията за слушане; трябва да добавите модула racoon към файла systemd
/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 по това, че може допълнително да капсулира мултикаст и да поставя 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

На Микротик:

Раздел „Интерфейси“, добавете нов интерфейс „IP тунел“:

Раздел „IP тунел“ - „Общи“
Параметър
Стойност

Име
По ваша преценка (наричано по-долу IPIP-IPsec0)

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

Местен адрес
192.168.0.2

Отдалечен адрес
192.168.0.1

IPsec Secret
Деактивирайте полето (в противен случай ще бъде създаден нов Peer)

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

DSCP
наследят

Не фрагментирайте
Не.

Захванете TCP MSS
вярно

Разрешаване на бърз път
вярно

Раздел „IP“ - „Адреси“, добавете адреса:

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

Адрес
192.168.0.2/30

Interface
IPIP-IPsec0

Сега можете да добавяте маршрути към мрежата зад Linux машина; когато добавяте маршрут, шлюзът ще бъде нашият 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

Имам nginx, работещ в мрежата зад mikrotik (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, ако имате активирани филтри за пакети.

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

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

Добавяне на нов коментар