מנהרת IPIP IPsec VPN בין מכונת לינוקס ל-Mikrotik מאחורי ספק NAT

Linux you אובונטו 18.04.4 LTS (GNU/Linux 4.15.0-91-גנרי 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 על מכונת לינוקס באמצעות רקון. אני לא אתאר את הפרטים, יש אחד טוב מאמר у vvpoloskin.

התקן את החבילות הדרושות:

sudo install racoon ipsec-tools

אנו מגדירים את דביבון, הוא יפעל כשרת ipsec על תנאי. מכיוון ש-mikrotik במצב ראשי אינו יכול לשדר מזהה לקוח נוסף, וכתובת ה-IP החיצונית שדרכה הוא מתחבר ללינוקס היא דינמית, שימוש במפתח משותף מראש (הרשאת סיסמה) לא יעבוד, מכיוון שהסיסמה חייבת להיות מותאמת גם עם כתובת ה-IP של המארח המחבר, או עם מזהה.

אנו נשתמש בהרשאה באמצעות מפתחות RSA.

דמון הרקון משתמש במפתחות בפורמט RSA, ו-mikrotik משתמש בפורמט PEM. אם אתה יוצר מפתחות באמצעות כלי השירות plainrsa-gen שמגיע עם racoon, אז לא תוכל להמיר את המפתח הציבורי של 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. אל תשכח להגדיר את הבעלים של המשתמש שתחת שמו מושק דמון הדביבון (בדרך כלל root) ל-600 הרשאות.

אני אתאר את הגדרת mikrotik בעת חיבור דרך WinBox.

העלה את מפתח השרת-name.pub.pem ל-mikrotik: תפריט "קבצים" - "העלה".

פתח את הקטע "IP" - "IP sec" - לשונית "מפתחות". כעת אנו יוצרים מפתחות - כפתור "צור מפתח", ולאחר מכן ייצא את המפתח הציבורי של mikrotika "Expor Pub. מפתח", אתה יכול להוריד אותו מקטע "קבצים", לחץ לחיצה ימנית על הקובץ - "הורד".

אנו מייבאים את המפתח הציבורי של רקון, "ייבוא", ברשימה הנפתחת של השדה "שם קובץ" אנו מחפשים את השרת-name.pub.pem שהורדנו קודם לכן.

יש להמיר את המפתח הציבורי של mikrotik

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

ושם אותו בתיקייה /etc/racoon/certs, בלי לשכוח את הבעלים והזכויות.

תצורת רקון עם הערות: /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-Group
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)

Auth. אלגוריתמים
sha512

Encr. אלגוריתמים
aes-128-cbc

משך חיים
08:00:00

קבוצת PFS
modp2048

כרטיסיית "זהויות".
פרמטר
ערך

Peer
MyPeer

אטו. שיטה
מפתח rsa

מפתח
mikrotik.privet.key

מפתח מרחוק
server-name.pub.pem

קבוצת תבניות מדיניות
ברירת מחדל

שרשרת נוטראק
ריק

סוג תעודת הזהות שלי
המכונית

סוג זיהוי מרחוק
המכונית

התאמה לפי
מזהה מרחוק

תצורת מצב
ריק

צור מדיניות
לא

לשונית "מדיניות - כללי"
פרמטר
ערך

Peer
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 מציג מידע על מספר השורה שבו זוהתה השגיאה.

כאשר מערכת ההפעלה מאתחלת, הדמון הרקיע מתחיל לפני שממשקי הרשת מועלים, וציינו את האפשרות strict_address בקטע ההאזנה; עליך להוסיף את יחידת הרקון לקובץ systemd
/lib/systemd/system/racoon.service, בקטע [יחידה], שורה 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 בכך שהוא יכול בנוסף לקלוט שידור רב ולשים סימני fw על מנות, שבאמצעותם ניתן לסנן אותם ב-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

כעת אתה יכול להוסיף מסלולים לרשתות מאחורי mikrotik

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

כדי שהממשק והמסלולים שלנו יועלו לאחר אתחול מחדש, עלינו לתאר את הממשק ב- /etc/network/interfaces ולהוסיף שם מסלולים בפוסט-אפ, או לכתוב הכל בקובץ אחד, למשל, /etc/ ipip-ipsec0.conf ולמשוך אותו דרך פוסט-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
השבת את השדה (אחרת ייווצר עמית חדש)

להשאיר בחיים
השבת את השדה (אחרת הממשק יכבה כל הזמן, מכיוון של-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 שפועל ברשת מאחורי 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

הוספת תגובה