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 у main рэжыме не можа перадаваць дадатковы ідэнтыфікатар кліента, а вонкавы ip адрас праз які ён канэкціцца да Linux дынамічны, выкарыстоўваць preshared key (аўтарызацыю па паролі) не атрымаецца, бо пароль павінен супастаўляцца або з ip адрасам які падключаецца хаста, або з ідэнтыфікатарам.

Будзем выкарыстоўваць аўтарызацыю па RSA ключах.

Дэман racoon выкарыстоўвае ключы ў фармаце RSA, а mikrotik - у фармаце PEM. Калі генераваць ключы ўтылітай plainrsa-gen ідучай разам з racoon, то канвертаваць публічны ключ для Mikrotika ў фармат 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», затым экспартуем публічны ключ mikrotika «Expor 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

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"

Укладка "Profiles"
Параметр
Значэнне

Імя
На ваша меркаванне (па змаўчанні default)

Алгарытм хэшавання
sha512

Алгарытм шыфравання
AES-128

DH-Group
modp2048

Proposhal_check
сцвярджаць

Тэрмін
1 д 00:00:00

Праходжанне NAT
true (ставім галачку)

DPD
120

DPD Maximum failure
5

Укладка "Peers"
Параметр
Значэнне

Імя
На ваша меркаванне (далей MyPeer)

Адрас
1.1.1.1 (IP linux машыны)

Мясцовы адрас
10.0.0.2 (IP WAN інтэрфейсу mikrotik)

Профіль
дэфолт

Рэжым абмену
асноўнай

пасіўны
ілжывы

Send INITIAL_CONTACT
праўда

Укладка "Proposal"
Параметр
Значэнне

Імя
На ваша меркаванне (далей MyPeerProposal)

Auth. Algorithms
sha512

Encr. Algorithms
aes-128-cbc

Тэрмін
08:00:00

Група PFS
modp2048

Укладка "Identities"
Параметр
Значэнне

Роўны
MyPeer

Atuh. Method
rsa key

Ключ
mikrotik.privet.key

Аддалены ключ
server-name.pub.pem

Policy Tamplate Group
дэфолт

Notrack Chain
пуста

My ID Type
аўтаматычны

Выдалены тып ID
аўтаматычны

Match By
remote id

Канфігурацыя рэжыму
пуста

Generate Policy
Няма.

Укладка "Policies — General"
Параметр
Значэнне

Роўны
MyPeer

Тунэль
праўда

Src. Address
192.168.0.0/30

Прызначэнне Адрас
192.168.0.0/30

пратакол
255 (усе)

Шаблон
ілжывы

Укладка "Policies - Action"
Параметр
Значэнне

дзеянне
шыфраваць

Узровень
патрабаваць

IPsec Protocols
esp

прапанова
MyPeerProposal

Хутчэй за ўсё ў вас, як і ў мяне, на WAN інтэрфейсе наладжаны snat/masquerade, гэтае правіла трэба скарэктаваць, каб выходныя пакеты ipsec сыходзілі ў наш тунэль:
Пераходзім у раздзел "IP" - "Firewall".
Укладка "NAT", адчыняны наша правіла snat/masquerade.

Укладка "Advanced"
Параметр
Значэнне

IPsec Policy
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 (policy-based routing). Калі патрэбна максімальная функцыянальнасць - тады, напрыклад, 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"
Параметр
Значэнне

Імя
На ваша меркаванне (далей IPIP-IPsec0)

MTU
1480 (калі не паказваць, то mikrotik пачынае рэзаць mtu да 68)

Мясцовы адрас
192.168.0.2

Аддалены адрас
192.168.0.1

Ipsec Secret
Дэактывуем поле (інакш будзе створаны новы Peer)

падтрымліваць жывы
Дэактывуем поле (інакш інтэрфейс будзе ўвесь час выключацца, бо ў mikrotika нейкі свой фармат гэтых пакетаў і з linux не працуе)

DSCP
ўспадкаваць

Dont Fragment
Няма.

Clamp TCP MSS
праўда

Allow Fast Path
праўда

Раздзел "IP" - "Addresses", дадаем адрас:

Параметр
Значэнне

Адрас
192.168.0.2/30

інтэрфейс
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

Дадаць каментар