IPIP IPsec VPN تونل بین ماشین لینوکس و Mikrotik پشت ارائه دهنده NAT

لینوکس: اوبونتو 18.04.4 LTS (GNU/Linux 4.15.0-91-generic x86_64)

  • IP خارجی Eth0 1.1.1.1/32
  • ipip-ipsec0 192.168.0.1/30 تونل ما خواهد بود

Miktoik: CCR 1009، RouterOS 6.46.5

  • IP داخلی Eth0 10.0.0.2/30 از ارائه دهنده. IP NAT خارجی ارائه دهنده پویا است.
  • ipip-ipsec0 192.168.0.2/30 تونل ما خواهد بود

ما یک تونل IPsec روی یک ماشین لینوکس با استفاده از راکون ایجاد خواهیم کرد. من جزئیات را شرح نمی دهم، یک مورد خوب وجود دارد مقاله у vvpoloskin.

بسته های لازم را نصب کنید:

sudo install racoon ipsec-tools

ما Racoon را پیکربندی می کنیم، به طور مشروط به عنوان یک سرور ipsec عمل می کند. از آنجایی که mikrotik در حالت اصلی نمی تواند شناسه کلاینت اضافی را منتقل کند و آدرس IP خارجی که از طریق آن به لینوکس متصل می شود پویا است، استفاده از یک کلید از پیش به اشتراک گذاشته شده (مجوز رمز عبور) کار نخواهد کرد، زیرا رمز عبور باید یا با آدرس IP مطابقت داشته باشد. میزبان اتصال یا با شناسه.

ما از مجوز با استفاده از کلیدهای RSA استفاده خواهیم کرد.

Racoon Daemon از کلیدهایی با فرمت RSA استفاده می کند و mikrotik از فرمت PEM استفاده می کند. اگر کلیدها را با استفاده از ابزار plainrsa-gen که با راکون ارائه می‌شود تولید کنید، نمی‌توانید کلید عمومی Mikrotika را با کمک آن به فرمت PEM تبدیل کنید - این کلید فقط در یک جهت تبدیل می‌شود: PEM به RSA. نه openssl و نه ssh-keygen نتوانستند کلید تولید شده توسط plainrsa-gen را بخوانند، بنابراین با استفاده از آنها نیز تبدیل امکان پذیر نخواهد بود.

ما یک کلید PEM را با استفاده از openssl تولید می کنیم و سپس آن را با استفاده از 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 قرار می دهیم. فراموش نکنید که مالک کاربری که دیمون راکون تحت نام او راه اندازی می شود (معمولاً روت) روی 600 مجوز تنظیم کنید.

من تنظیمات mikrotik را هنگام اتصال از طریق WinBox توضیح خواهم داد.

کلید server-name.pub.pem را در mikrotik آپلود کنید: منوی "Files" - "Upload".

بخش "IP" - "IP sec" - "Keys" را باز کنید. اکنون کلیدها را تولید می کنیم - دکمه "Generate Key"، سپس کلید عمومی mikrotika "Expor Pub" را صادر می کنیم. کلید، می توانید آن را از بخش "Files" دانلود کنید، روی فایل کلیک راست کنید - "دانلود".

ما کلید عمومی راکون، "Import" را وارد می کنیم، در لیست کشویی فیلد "نام فایل" به دنبال 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; # Сжимать передаваемые данные, алгоритм сжатия предлагается только один.
}

تنظیمات میکروتیک

بازگشت به بخش "IP" - "IPsec"

برگه "پروفایل".
پارامتر
ارزش

نام
به صلاحدید شما (به طور پیش فرض)

الگوریتم هش
sha512

الگوریتم رمزگذاری
aes-128

DH-Group
modp2048

Proposhal_check
ادعا

عمر
1 روز 00:00:00

پیمایش NAT
درست (کادر را علامت بزنید)

DPD
120

DPD حداکثر شکست
5

برگه همتایان
پارامتر
ارزش

نام
به صلاحدید شما (از این پس MyPeer نامیده می شود)

نشانی:
1.1.1.1 (ماشین های IP Linux)

آدرس محلی
10.0.0.2 (IP WAN رابط میکروتیک)

مشخصات
به طور پیش فرض

حالت تبادل
اصلی

غیر فعال
غلط

ارسال INITIAL_CONTACT
درست

برگه پیشنهاد
پارامتر
ارزش

نام
به صلاحدید شما (از این پس MyPeerProposal نامیده می شود)

احراز هویت الگوریتم ها
sha512

Encr الگوریتم ها
aes-128-cbc

عمر
08:00:00

گروه PFS
modp2048

برگه "هویت".
پارامتر
ارزش

همتا
MyPeer

آتوح. روش
کلید rsa

کلید
mikrotik.privet.key

کلید از راه دور
server-name.pub.pem

گروه الگوی سیاست
به طور پیش فرض

زنجیره نوتراک
خالی

نوع شناسه من
خودکار

نوع شناسه از راه دور
خودکار

مطابقت با
شناسه از راه دور

پیکربندی حالت
خالی

ایجاد خط مشی
نه

برگه "خط مشی ها - عمومی"
پارامتر
ارزش

همتا
MyPeer

تونل
درست

Src. نشانی
192.168.0.0/30

مقصد نشانی
192.168.0.0/30

پروتکل
255 (همه)

قالب
غلط

برگه "خط مشی ها - اقدام"
پارامتر
ارزش

عمل
رمزگذاری

سطح
درخواست کننده

پروتکل های IPsec
ESP

پیشنهاد
MyPeerProposal

به احتمال زیاد، شما نیز مانند من، snat/masquerade را روی رابط WAN خود پیکربندی کرده‌اید؛ این قانون باید طوری تنظیم شود که بسته‌های ipsec خروجی وارد تونل ما شوند:
به بخش "IP" - "Firewall" بروید.
برگه "NAT"، قانون snat/masquerade ما را باز کنید.

تب پیشرفته
پارامتر
ارزش

خط مشی IPsec
خارج: هیچ

راه اندازی مجدد شیطان راکون

sudo systemctl restart racoon

اگر راکون با راه اندازی مجدد شروع نشود، در پیکربندی خطایی وجود دارد؛ در syslog، راکون اطلاعاتی درباره شماره خطی که خطا در آن شناسایی شده است را نمایش می دهد.

هنگامی که سیستم عامل بوت می شود، شبح راکون قبل از بالا آمدن رابط های شبکه شروع می شود و ما در قسمت listen گزینه strict_address را مشخص کردیم؛ باید واحد راکون را به فایل 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. اما فراموش نکنید که ما برای عملکرد اضافی با سربار بزرگ هزینه می کنیم.

می توانید ترجمه یک نمای کلی خوب از رابط های تونل را مشاهده کنید اینجا.

در لینوکس:

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

اکنون می توانید مسیرهایی را برای شبکه های پشت میکروتیک اضافه کنید

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

در میکروتیک:

بخش "Interfaces"، یک رابط جدید "IP tunnel" اضافه کنید:

برگه "IP tunnel" - "General"
پارامتر
ارزش

نام
به صلاحدید شما (از این پس IPIP-IPsec0 نامیده می شود)

MTU
1480 (اگر مشخص نشده باشد، mikrotik شروع به کاهش mtu به 68 می کند)

آدرس محلی
192.168.0.2

آدرس از راه دور
192.168.0.1

راز IPsec
فیلد را غیرفعال کنید (در غیر این صورت یک Peer جدید ایجاد می شود)

زنده بمان
فیلد را غیرفعال کنید (در غیر این صورت رابط دائماً خاموش می شود، زیرا mikrotika فرمت خاص خود را برای این بسته ها دارد و با لینوکس کار نمی کند)

DSCP
به ارث می برند

تکه تکه نکنید
نه

TCP MSS را گیره دهید
درست

اجازه دادن به مسیر سریع
درست

بخش "IP" - "آدرس ها"، آدرس را اضافه کنید:

پارامتر
ارزش

نشانی:
192.168.0.2/30

رابط
IPIP-IPsec0

اکنون می توانید مسیرهایی را به شبکه پشت یک ماشین لینوکس اضافه کنید؛ هنگام افزودن مسیر، دروازه رابط IPIP-IPsec0 ما خواهد بود.

PS

از آنجایی که سرور لینوکس ما انتقالی است، منطقی است که پارامتر 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 را روی شبکه پشت میکروتیک (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

اضافه کردن نظر