
المعلمات الأولية:
- المكتب الرئيسي للمؤسسة مع اثنين من وكلاء الحدود Kerio Control v.9.2.9 build 3171 (خلف Kerio يوجد مفتاح Cisco 3550 الذي يحدد تكوين الشبكة المحلية للمكتب).
- كل Kerio لديه قناتان مع موازنة تحميل تصل إلى ISP (في الرسم البياني - ISP # 1 و ISP # 2) مع IPs ثابت أبيض.
- من جانب المكتب البعيد ، تم تثبيت MikroTik 951G-2HnD (OS v.6.43.11).
- يأتي مزودو خدمات الإنترنت إلى MikroTik (في المخطط هما ISP # 3 و ISP # 4).
في وقت كتابة هذا التقرير ، سواء في المكتب الرئيسي أو في المكتب البعيد ، كان الاتصال مع مقدمي الخدمات زوجًا ملتويًا.
قائمة المهام:
- قم بتأسيس اتصال IPSec VPN بين MikroTik و Kerio Control ، حيث سيكون MikroTik هو البادئ.
- ضمان التسامح مع الخطأ لاتصال VPN ، أي بالإضافة إلى حقيقة أن MikroTik يجب أن تراقب أداء مزودي خدمات الإنترنت (المقالة هنا ) ، يجب عليها أيضًا مراقبة مدى توفر كل خادم Kerio وتحديد الوصول عبر أي قناة (من خلالها ISP من Kerio) سيتم الاتصال.
- وفر القدرة على تغيير عنوان الشبكة الذي يتصل به MikroTik مع Kerio. هذا يرجع إلى حقيقة أن كيريو ، وليس جهاز التوجيه ، موجودون في مقر "الحدود".
ماذا نحصل على الانتاج؟
- عند بدء تشغيل MikroTik (schedStartup) ، سيتم تنظيم قناة لشبكة المؤسسة (سيتم تشغيل القناة بواسطة MikroTik) ، مما يسمح للمستخدم عن بعد بالعمل مع موارد الشركة دون بدء Kerio Client وبدون إعداد اتصال VPN إضافي باستخدام نظام التشغيل ؛
- سوف تقوم MikroTik بتطبيق تجاوز الفشل ، والذي ينتقل تلقائيًا إلى مزود خدمة الإنترنت المباشر ؛
- يمكنك تعيين الأولويات لنقاط الاتصال بشبكة المؤسسة عن طريق تغيير انتماء أقرانهم الذين تم تكوينهم للاتصال بـ Kerio Control إلى مجموعة أو أخرى من قوالب السياسات في MikroTik ؛
- سيكون بإمكان MikroTik مراقبة أداء خوادم Kerio Control تلقائيًا ، وإذا تم قطع الاتصال بنقطة الأولوية ، انتقل إلى القناة المباشرة بشكل مستقل ؛
- إذا تم نشر خوادم Kerio Control على خوادم DNS الخارجية ، فستتمكن MikroTik من تتبع التغييرات في عناوين IP الخاصة بها (على سبيل المثال ، في حالة تغيير الموفر الخاص بك) وإجراء تغييرات بشكل مستقل على التكوين الخاص به (scriptSetIPSecSADstAddrFromDNS).
يجب أن أقول على الفور أن هذا المقال ليس تعليميًا (من حيث المبدأ ، لقد تعرفت على أجهزة التوجيه وخاصةً مع MikroTik بعد شهرين فقط (نهاية عام 2017) قبل إنشاء التكوين) ولن يتناول الأسئلة "لماذا؟" ، سيكون هنا ويرد وصف لتكوين العمل من MikroTik ، والذي يستخدم في مؤسسة حقيقية.
ملاحظة:- للاحتفاظ بتعليقات باللغة الروسية عند نقل رمز البرنامج النصي إلى MikroTik ، قبل نسخ النص إلى المخزن المؤقت وقبل الإدراج من المخزن المؤقت ، تأكد من تشغيل تخطيط لوحة المفاتيح الروسية ؛
- إذا وجدت أن البرامج النصية لتسجيل الدخول غير ضرورية ، فيمكنك التعليق أو حذف الأسطر التي تحتوي على "تحذير السجل" و "خطأ في السجل" ؛
- قد تلاحظ أيضًا تعليق "تحذير السجل" و "خطأ السجل" في الكود ، وهذه محاولة لإضافة إمكانية استخدام التسجيل باللغة الإنجليزية ...
لذلك دعونا نبدأ:
المعلمات الأساسية:- شبكة المؤسسة الأم (خلف كيريو) هي 192.168.77.0/24 (هنا نستخدم عنوان الشبكة حيث يوجد كيريو في شبكة المؤسسة)
- شبكة الفروع (خلف MikroTik) - 192.168.11.0/24
- الشبكة التي سيتم تعيين الشبكة الفرعية إليها عند الاتصال بـ Kerio Control # 1 - 192.168.22.0/24
- الشبكة التي سيتم تعيين الشبكة الفرعية عليها عند الاتصال بـ Kerio Control # 2 - 192.168.33.0/24
- عنوان IP من تجمع ISP # 1 (Kerio # 1) - 11.11.11.111
- عنوان IP من تجمع ISP # 2 (Kerio # 1) - 22.22.22.111
- عنوان IP من تجمع ISP # 1 (Kerio # 2) - 11.11.11.222
- عنوان IP من تجمع ISP # 2 (Kerio # 2) هو 22.22.22.222
- عنوان IP من تجمع ISP # 3 (MikroTik) - 33.33.33.111
- عنوان IP من تجمع ISP # 4 (MikroTik) - 44.44.44.111
أول شيء فعله هو تمكين DDNS على MikroTik:
/ip cloud set ddns-enabled=yes
نظرًا لحقيقة أن MikroTik لن يكون له عنوان IP ثابت أبيض ، فإن العمل الإضافي للتكوين والبرامج النصية يعتمد على استخدام DDNS.
وأيضًا --- --- يتم استخدام السحابة لتحديد عنوان IP الخارجي لميكروتك ، والذي يظهر منه على الإنترنت.
الآن ، دعونا نقوم بتهيئة Kerio Control # 1 ، بحيث لا نعود إليه لاحقًا:
نذهب إلى قسم "واجهات" ونضيف واجهة "نفق VPN" الجديدة ...
تكوين النفق في كيريو كونترول1. في حقل الاسم ، قم بتعيين اسم للواجهة ؛
2. ضع المفتاح في الموضع "السلبي - يقبل فقط الاتصالات الواردة" ؛
3. اكتب إجازة "IPSec" ؛
4. علامة التبويب "المصادقة":
- 4.1 في الحقل "مفتاح محدد مسبقًا:" أدخل عبارة المفتاح التي سيتم استخدامها للاتصال ؛
- ملاحظة:
أوصي بشكل قاطع بتعيين جميع العبارات الرئيسية على جميع أنفاق VPN التي تم إنشاؤها على خادم Kerio محدد واحد!
هذا يرجع إلى حقيقة أن كيريو لديه خطأ عائم ، والذي يتم التعبير عنه في ما يلي.
تخيل أنه في تكوين Kerio ، كما في حالتي ، هناك عدة واجهات "نفق VPN" تم تكوينها للاتصال بـ MikroTik ، والتي تختلف عن بعضها البعض فقط في الإعدادات الموجودة في حقل "المعرف المحلي:" (سيتم مناقشتها أدناه).
لذلك ، عند إنشاء (سأطلق عليه ذلك) نفق وارد ، بغض النظر عن عنوان IP الخارجي الذي ستتصل به Kerio مع MikroTik ، سيقوم Kerio (لسبب ما) بتنشيط الواجهة الأولى التي تظهر ، وإذا كان عنوان IP المحدد في الإعدادات النفق على جانب كيريو يختلف عن النفق الذي يشير إليه MikroTik ، النفق غير منظم.
وفي حالة الإشارة إلى عبارات رئيسية مختلفة لجميع الأنفاق ، تتوقف هذه المشكلة. - 4.2 في حقل "المعرف المحلي:" ، أدخل عنوان IP من تجمع عناوين ISP # 1 (في المثال 11.11.11.111) المعين لواجهة Keran Control # 1 WAN ، التي ستصل إليها MikroTik ؛
- 4.3 في حقل "المعرف البعيد:" ، أدخل FQDN ، والذي تم الحصول عليه بواسطة MikroTik من DDNS (IP ---> Cloud ---> DNS Name). يسمح لنا هذا الإعداد بعدم الاهتمام بكيفية وصول ISP MikroTik إلى Kerio ؛
- 4.4 في حقل "تشفير المرحلة الأولى (IKE):" حدد aes128-sha1-modp2048 من القائمة ؛
- 4.5 في حقل "المرحلة الثانية من التشفير (ESP):" حدد 3des-sha1-modp2048 من القائمة ؛
- ملاحظة:
تحرير الإعدادات الافتراضية المستخدمة من خلال زر "تغيير ..." ؛
يتم اختيار كل من الأصفار باستخدام "أسلوب بدس العلمية".
5. علامة التبويب "الشبكات البعيدة":
سنقوم هنا بإدخال عنوان IP الخاص بالشبكة المحلية الذي ستستخدمه MikroTik عند الاتصال بخادم Kerio Control المحدد (في المثال - 192.168.22.0/24).
مهم! في كل الباقي (في حالتي يتم تحديدها بواسطة عدد مزودي خدمة الإنترنت من كيريو) في الأنفاق على MikroTik ، على خادم كيريو ، يجب الإشارة إلى نفس عنوان IP!
اسمحوا لي أن أذكرك بأن هذا يرجع إلى الحاجة إلى تكوين الطريق إلى هذه الشبكة من شبكة المكتب الرئيسي.
6. علامة التبويب "شبكات المناطق المحلية":
- 6.1 ألغ تحديد المربع "استخدام الشبكات المحلية المكتشفة تلقائيًا" ؛
- 6.2 قم بتعيين خانة الاختيار "استخدام الشبكات المخصصة:" ، وأضف عنوان الشبكة "يغطي" مجموعة كاملة من العناوين المستخدمة في الشبكة المحلية وراء Kerio Control إلى قائمة الشبكات (في المثال - 192.168.0.0/16).
نكرر جميع الخطوات المذكورة أعلاه للنفق الثاني على نفس خادم كيريو.
سيختلف تكوين النفق الثاني فقط عن طريق استخدام عبارة مرور مختلفة (الفقرة 4.1) وعنوان IP خارجي مختلف عن تجمع عناوين ISP # 2 (الفقرة 4.2) (في المثال 22.22.22.111).
تتشابه إعدادات Kerio Control # 2 مع تلك الموضحة أعلاه ، باستثناء عنوان الشبكة المشار إليه في علامة تبويب الشبكات البعيدة (الصفحة 5) (في المثال ، 192.168.33.0/24) ، وبناءً على ذلك ، عناوين IP في المعرف المحلي: الحقل ( الفقرة 4.2) ، والتي يجب تحديدها من عناوين IP المعينة لواجهات Kerio Control # 2 WAN (في المثال ، 11.11.11.222 و 22.22.22.222).
بعد ذلك ، نقوم بإنشاء قاعدة السماح لاختبار الاتصال بنا على Kerio من MikroTik ...
بينغ القاعدة في كيريو التحكمنذهب إلى قسم "قواعد المرور" وننشئ قاعدة جديدة مع المعلمات التالية:
- المصدر - تشير إلى FQDN التي تلقاها MikroTik لدينا من DDNS ؛
- الوجهة - جدار الحماية
- خدمة - بينغ.
- يمكنك أيضًا تحديد إصدار IP (IPv4) ، لكن هذا ليس ضروريًا.
نقوم بحفظ القاعدة باسم مفهومة لك وسحبها إلى أعلى قائمة القواعد.
نكرر نفس الإجراء على خادم كيريو الثاني.
لا تنس تسجيل المسارات على الشبكة خلف MikroTik في المحولات أو أجهزة التوجيه على جانب المكتب الرئيسي حتى تعرف شبكة المكتب الرئيسي مكان توجيه حركة المرور (في حالتي ، فهذه طريقتان ثابتتان على الشبكات 192.168.22.0/24 و 192.168.33.0/24).
من المكتب الرئيسي ، قمنا بكل شيء ، والآن ننتقل إلى MikroTik.
لنبدأ بإنشاء كائنات التكوين الأساسية لتنظيم واختبار نفق VPN.
الخطوة الأولى هي إنشاء قائمة عناوين شبكة فرعية محلية. سوف نستخدمها في قواعد جدار الحماية.
/ip firewall address-list # MikroTik, # IP- DHCP add address=192.168.11.0/24 list="Local subnet" # , MikroTik # VPN- Kerio Control #1 # ( VPN- Kerio Control #1, # " ") add address=192.168.22.0/24 list="Local subnet" # , MikroTik # VPN- Kerio Control #2 # ( VPN- Kerio Control #2, # " ") add address=192.168.33.0/24 list="Local subnet"
بعد ذلك ، قم بإنشاء قاعدة السماح لحركة مرور IKE ووضعها في أعلى قائمة القواعد.
add action=accept chain=input comment="VPN Allow IKE" dst-port=500 protocol=udp
ثم أضف قاعدتين إلى "عامل تصفية جدار الحماية" للعمل مع حركة مرور VPN ...
/ip firewall filter add action=accept chain=forward comment="VPN In IpSec" dst-address-list=\ "Local subnet" ipsec-policy=in,ipsec src-address=192.168.0.0/16 \ src-address-list="!Local subnet" add action=accept chain=forward comment="VPN Out" dst-address=192.168.0.0/16 \ dst-address-list="!Local subnet" src-address-list="Local subnet"
... ونقلهم إلى موضع
أعلى مباشرة
من قاعدة الإسقاط ، والذي يحظر حركة المرور الواردة من خارج الشبكة المحلية. في التكوين الافتراضي الخاص بي ، كان مع التعليق "defconf: إفلات كل شيء لا يأتي من LAN"
انتقل إلى Firewall Mangle وقم بإنشاء القواعد التالية:
/ip firewall mangle # , # ... add action=mark-connection chain=prerouting comment="VPN In" \ new-connection-mark=VPN_conn_in passthrough=no src-address=192.168.0.0/16 \ src-address-list="!Local subnet" # ... add action=mark-routing chain=output comment="VPN In" connection-mark=\ VPN_conn_in new-routing-mark=VPN_route_in passthrough=yes # MikroTik . # NAT. add action=mark-connection chain=postrouting comment="VPN Out" dst-address=\ 192.168.0.0/16 dst-address-list="!Local subnet" new-connection-mark=\ VPN_conn_out passthrough=no
بعد ذلك ، نلاحظ في جدار الحماية NAT:
/ip firewall nat # MikroTik # , # Kerio- (: Kerio Control #1 - 192.168.22.0/24, Kerio Control #2 - 192.168.33.0/24) # ! # comment=KerioVpnNatOut ! add action=netmap chain=srcnat comment=KerioVpnNatOut connection-mark=\ VPN_conn_out to-addresses=192.168.22.0/24 # MikroTik # MikroTik add action=netmap chain=dstnat comment=KerioVpnNatIn connection-mark=\ VPN_conn_in to-addresses=192.168.11.0/24 # MikroTik Kerio- add action=accept chain=srcnat comment=KerioVpnNatPing out-interface-list=WAN protocol=icmp
مهم! يجب وضع هذه القواعد فوق قواعد التنكر.
ننتقل الآن إلى قسم IP ---> IPSec ، حيث نحتاج إلى إنشاء مجموعات قالب سياسة أو نظير أو سياسة (سأناقش الغرض منها لاحقًا) واقتراح لإعداد تشفير المرحلة 2.
اقتراح IP IPSEC /ip ipsec proposal add enc-algorithms=3des name=KerioVPNProposal#01 pfs-group=modp2048
مجموعة سياسة IP IPSEC /ip ipsec policy group add name=1 add name=2 add name=3 add name=4
IP IPSEC الأقران /ip ipsec peer add address=11.11.11.111/32 comment=vs01-i01-01.domain.ru exchange-mode=\ main-l2tp local-address=33.33.33.111 my-id=\ fqdn:mikrotik.sn.mynetname.net policy-template-group=1 profile=\ profile_4 secret=pass1111
سياسة IP IPSEC /ip ipsec policy add comment=KerioVPNPolicy dst-address=192.168.77.0/24 proposal=KerioVPNProposal#01 \ sa-dst-address=11.11.11.111 sa-src-address=33.33.33.111 src-address=\ 192.168.22.0/24 tunnel=yes
التعليق:
1. / ip ipsec المقترح - أدخل نفس معلمات التشفير التي حددناها عند تكوين Kerio Control في حقل "Phase 2 Encryption (ESP):".
ملاحظة:انتبه إلى المعلمة "name = KerioVPNProposal # 01".
ليس من الضروري استخدام هذا الاسم على وجه التحديد ، ولكن إذا قررت استخدام اسم آخر ، فبعد تغييره ، ستحتاج إلى التحقق ، وإذا لزم الأمر ، قم بتغيير إعداد سياسة IPSec المرتبطة ، بالإضافة إلى تغيير القيمة المعينة لمتغير DefKerioPropName في البرنامج النصي scriptCheckActiveVpnServer ، والذي سيتم مناقشته الكلام كذلك.
(في الواقع ، يتم استخدام معظم أسماء وتعليقات الكائنات في التوصيف الموصوف في البرامج النصية ، لذا فإن إعادة تسميتها قد تسبب لك بعض الإزعاج بسبب الحاجة إلى إجراء تغييرات على شفرة البرنامج النصي. سأحاول تقديم ملاحظات مناسبة في النص لتسهيل البحث عن هذه الكائنات.)
2. / IP IPSEC سياسة المجموعة
يرجع إنشاء المجموعات إلى حقيقة أننا في المستقبل سنقوم بمعالجة أسمائهم (1 ، 2 ، ... ن) في البرامج النصية واستخدامها لتحديد أولويات عناوين IP لخوادم كيريو التي سنصل إليها.
أنا خلق أربع مجموعات في وقت واحد ل لدي مزودان لخدمات الإنترنت ، مع وجود اثنين من عناوين IP الخارجية على كل من كيريو. في هذه المرحلة ، نحن نستخدم مجموعة واحدة فقط حتى الآن.
3. / IP IPSEC الأقران
في النظير ، حدد:
- العنوان - عنوان IP لكيريو ، والذي سيتم الاتصال به مع MikroTik. يجب تحديد نفس العنوان الذي أدخلناه في / ip ipsec policy sa-dst-address ، فقط مع القناع "/ 32" ؛
- العنوان المحلي - عنوان IP الخاص بـ MikroTik ، والذي سيتم الوصول إلى Kerio منه. يجب تحديد نفس العنوان الذي أدخلناه في / ip ipsec policy sa-src-address ؛
- المصادقة الطريقة - حدد "المفتاح المشترك مسبقًا" من القائمة ؛
- وضع التبادل - حدد main-l2tp من القائمة ؛
- إذا تم ضبطه ، قم بإلغاء تحديد المربع "السلبي" ؛
- سر - أدخل عبارة المرور التي أدخلناها عندما قمنا بتهيئة واجهة VPN على كيريو ، في علامة التبويب "المصادقة" ، في الحقل "مفتاح محدد مسبقًا:" ؛
- مجموعة قوالب السياسات - اختر من القائمة المجموعة التي أنشأناها سابقًا باسم "1" ؛
- قم بإلغاء تحديد NAT Traversal ؛
- نوع هويتي - حدد القيمة "fqdn" من القائمة ؛
- هويتي - أدخل FQDN المعين من قبل MikroTik في DDNS ؛
- في علامة التبويب "التشفير" ، حدد معلمات التشفير التي أدخلناها عندما قمنا بتكوين واجهة VPN على كيريو ، في علامة التبويب "المصادقة" ، في حقل "المرحلة الأولى (IKE):" ؛
- تعليق ( تحذير! تستخدم في البرامج النصية! ).
في التعليق ، أشير إلى FQDN الفني الكامل للخوادم الخاصة بي ، والتي يتم نشرها على خوادم DNS التي تخدم منطقتي الخارجية.
بالإضافة إلى استخدام هذا التكوين ، يتيح لي هذا الاحتفاظ بمعلومات محدثة عن عناوين IP الخارجية لخوادم Kerio المستخدمة (أريد فقط تغيير عنوان IP على خادم DNS الخارجي وسيتم تغييره تلقائيًا إلى MikroTik (المقالة
هنا )).
بالنسبة لأولئك الذين هم كسول للغاية لفهم ، أقتبس رمز العمل:
/system script add dont-require-permissions=no name=scriptSetIPSecSADstAddrFromDNS owner=\ admin policy=read,write
البرنامج النصي سرد البرنامج النصي SetIPSecSADstAddrFromDNS :if ([:len [/system script job find script=SetIPSecSADstAddrFromDNS]]>1) do={ :error } :local DnsNameFromComment :local ResolvedIpFromComment :local ResolvedIpWithMaskFromComment :local IpPeerAddr :foreach IpSecPeerCount in=[/ip ipsec peer find] do={ :set DnsNameFromComment [/ip ipsec peer get $IpSecPeerCount comment] :if ($DnsNameFromComment!="") do={ :do { :set ResolvedIpFromComment [:resolve $DnsNameFromComment] :set ResolvedIpWithMaskFromComment ($ResolvedIpFromComment . "/32") :set IpPeerAddr [/ip ipsec peer get $IpSecPeerCount address] :if ($ResolvedIpWithMaskFromComment!=$IpPeerAddr) do={ :log warning ("[SetIPSecSADstAddrFromDNS] " . DnsNameFromComment . " IP- " . $IpPeerAddr . " " . $ResolvedIpFromComment) #:log warning ("[SetIPSecSADstAddrFromDNS] In the peer to the server " . DnsNameFromComment . " changed IP address from " . $IpPeerAddr . " on " . $ResolvedIpFromComment) /ip ipsec peer set $IpSecPeerCount address=$ResolvedIpWithMaskFromComment } } on-error={ :set ResolvedIpFromComment "unknown" :log error ("[SetIPSecSADstAddrFromDNS] " . $DnsNameFromComment) #:log error ("[SetIPSecSADstAddrFromDNS] Cant resolve name " . $DnsNameFromComment) } } } :log warning ("[SetIPSecSADstAddrFromDNS] IP- VPN- ") #:log warning ("[SetIPSecSADstAddrFromDNS] The IP-addresses of the VPN-servers are checked")
القاعدة الأساسية التي تنطبق على التعليق في الأقران هي أن الاسم يجب أن يبدأ بأية أحرف و / أو أرقام ، بدون مسافات ، متبوعًا
واصلة إلزامية ("-") ، متبوعة بأي عدد من الأحرف التعسفية.
أنا استخدم التنسيق التالي:
vsNN-pNN-NN.domain.ru
حيث:
vsNN - vpn-server #NN (تتم معالجة هذا الجزء من التعليق في البرامج النصية واستخدامه في IP ---> جدار الحماية ---> قوائم العناوين (انظر أدناه)) ؛
pNN - ISP #NN؛
NN - الرقم التسلسلي لعنوان IP الخارجي في مجموعة العناوين التي أصدرها لي المزود على Kerio ؛
4. / IP IPSEC السياسة
في السياسة ، نعرّف:
- التوقيت الصيفي العنوان - عنوان الشبكة وراء كيريو (عنوان التوقيت الصيفي) ؛
- Src. العنوان - عنوان الشبكة الذي ستحجبه MikroTik (راجع إعدادات IP ---> جدار الحماية ---> NAT أدناه) شبكتها المحلية (عنوان src). سيكون عنوان الشبكة مرئيًا من جانب كيريو (حددناه عند تهيئة واجهة VPN على كيريو ، في علامة التبويب الشبكات البعيدة) ؛
- البروتوكول - 255 (الكل) ؛
- العمل - تشفير.
- المستوى - تتطلب ؛
- بروتوكولات IPSec - esp؛
- ضبط نفق المعلمة = نعم ؛
- SA Src. العنوان - عنوان IP الخارجي الخاص بـ MikroTik ، والذي سيتم الوصول إلى Kerio منه (عنوان sa-src) ؛
- SA Dst. العنوان - عنوان IP لـ Kerio ، والذي سيتم الاتصال به MikroTik (sa-dst-address) ؛
- Proposal - أدخل القيمة المعينة لمعلمة الاسم في قسم اقتراح ip / ip ipsec (في هذا التكوين - KerioVPNProposal # 01) ؛
- تعليق ( تحذير! يستخدم في البرامج النصية! ) - KerioVPNPolicy.
إذا تم كل شيء بشكل صحيح ، ثم بعد حفظ السياسة ، يجب أن تظهر القيمة "المحددة" في حقل "PH2 State" ، مما يشير إلى تثبيت قناة VPN بين MikroTik و Kerio.
يمكنك التحقق من ذلك عن طريق التحقق من حالة واجهة VPN في Kerio Control. هناك ، في حقل "المعلومات" ، مقابل الواجهة التي تم إجراء الاتصال بها ، يجب أن يظهر النقش "اتصال IP_your_MikroTik".
نواصل ...
الآن سننشئ نظراء لجميع عناوين IP المتبقية لخوادم Kerio (في التكوين الخاص بي ، من الضروري إنشاء ثلاثة نظائر أخرى).
للقيام بذلك ، نحتاج إلى تكرار جميع الخطوات المشار إليها في الفقرة 3 (/ ip ipsec peer) ، ولكن يجب الانتباه إلى التغييرات التالية:
- العنوان - تغيير عنوان IP كيريو.
- سر - أدخل عبارة المرور المتعلقة بالاتصال الجاري إنشاؤه (pass2222، pass3333، ... passNNNN)؛
- مجموعة قوالب السياسة - حدد المجموعة التالية في القائمة من القائمة (2 ، 3 ، ... ن).
ملاحظة:ثم يمكنك تغيير أولوية الخوادم الخاصة بك في أي وقت عن طريق تغيير المجموعة في إعدادات النظير.
- تعليق - في حالتي يتغير إلى خادم Kerio آخر FQDN.
يتم إدخال جميع المعلمات الأخرى كما في العيد الأول. تتم معالجة تلك التي ستحتاج إلى تغيير بواسطة البرامج النصية ويمكنك نسخها دون تغيير في الوقت الحالي.
الخطوة الأخيرة للتكوين قبل توصيل البرامج النصية بالعمل هي جعل MikroTik يعمل كمستودع للثوابت ، والتي سوف نستخدمها في البرامج النصية ...
أضف قائمتين إلى قوائم عناوين جدار الحماية (
تحذير! مستخدم في البرامج النصية! ):
/ip firewall address-list add address=192.168.22.0/24 list=vs01 add address=192.168.33.0/24 list=vs02
فيها ، نشير إلى عناوين الشبكات مع الإشارة إلى بادئات اسم خادم كيريو ، حيث سنقوم بتعيين حركة مرور VPN الصادرة.
حسنًا ، من أجل أتمتة عمل كل هذا العيب ، نضيف نصين وثلاثة جداول
(إذا قررت إعادة تسمية البرامج النصية ، فلا تنس إجراء التغييرات المناسبة على الشفرة) .
/system script add dont-require-permissions=no name=scriptFunctionsList owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon
قائمة سرد البرنامج النصيوظائف # IP --> Cloud DNS- # : # # $start (true/false); # # "" "updated" :global subUpdateCloudDns do={ put ($start); :if ($start=false) do={ set $CloudDnsStatus; # set $m 1; log warning ("[subUpdateCloudDns] ---> DDNS ---> "); #log warning ("[subUpdateCloudDns] ---> DDNS status ---> CHECK STARTED"); do { log warning ("[subUpdateCloudDns] ---> DDNS , ---> " . $m); [/ip cloud force-update]; delay 30000ms; set $CloudDnsStatus ([/ip cloud get status]); set $m ($m+1); :if ($CloudDnsStatus="updated") do={ log warning ("[subUpdateCloudDns] ---> DDNS ---> " . $CloudDnsStatus); #log warning ("[subUpdateCloudDns] ---> DDNS status ---> " . $CloudDnsStatus); } else={ log error ("[subUpdateCloudDns] ---> DDNS ---> " . $CloudDnsStatus); #log error ("[subUpdateCloudDns] ---> DDNS status ---> " . $CloudDnsStatus); } } while=(($CloudDnsStatus!="updated") and ($m<10)); return ($CloudDnsStatus); } } # IP --> Cloud # : # # 0 - ; # 1 - , ; # 2 - :global subCheckCloudDDNS do={ set $CloudDnsActive ([/ip cloud get ddns-enabled]); # - ( $m=0 ) set $m 0; :if ($CloudDnsActive=yes) do { # IP--->Cloud ( $m=1 ) set $m ($m+1); set $CloudDnsStatus ([/ip cloud get status]); # IP- ( IP--->Cloud DNS) set $CloudDnsIP ([/ip cloud get public-address]); set $CheckIpAddr ([resolve [/ip cloud get dns-name]]); :if ($CloudDnsIP!=$CheckIpAddr) do={ # IP ( MikroTik )... set $CloudDnsStatus "updating..."; } :if ($CloudDnsStatus="updated") do { # IP--->Cloud ( $m=2 ) set $m ($m+1); } } return ($m); } # # : # # $ScriptName ( ) :global subRepeatScript do={ put ($ScriptName); :if ($ScriptName!="") do { [/system script run $ScriptName]; } } # VPN- # # IP- VPN- :global subGetVpnServers do={ # IP- VPN- :foreach IpSecPeerId in=[/ip ipsec peer find passive!=yes] do={ set $CheckIpAddr [/ip ipsec peer get $IpSecPeerId address]; :if ($CheckIpAddr!="") do={ set $MaskPos [find $CheckIpAddr "/"]; set $GroupFromPeer ([/ip ipsec peer get $IpSecPeerId policy-template-group]); set $IpFromPeer ([pick $CheckIpAddr 0 $MaskPos]); set $VpnServersList ($VpnServersList, {{$GroupFromPeer; $IpFromPeer}}); } } return ($VpnServersList); } # # # ID :global subDisableIpSecPeers do={ # ... , (passive=false) ... :foreach IpSecPeerId in=[/ip ipsec peer find passive!=yes] do={ log warning ("[IP IPSec Peer] ---> ---> " . [/ip ipsec peer get $IpSecPeerId comment]); #log warning ("[IP IPSec Peer] ---> processed peer on ---> " . [/ip ipsec peer get $IpSecPeerId comment]); # address ... set $CheckIpAddr [/ip ipsec peer get $IpSecPeerId address]; :if ($CheckIpAddr!="") do={ # address , IP- ... set $MaskPos ([find $CheckIpAddr "/"]); set $CheckIpAddr ([pick $CheckIpAddr 0 $MaskPos]); # ... IPSec- :foreach IpSecPolicyId in=[/ip ipsec policy find sa-dst-address=$CheckIpAddr] do={ :if ($IpSecPolicyId!="") do={ :if ([/ip ipsec policy get $IpSecPolicyId disabled]!=yes) do={ [/ip ipsec policy disable $IpSecPolicyId]; log warning ("[IP IPSec Policy] ---> " . [/ip ipsec policy get $IpSecPolicyId comment] . " "); #log warning ("[IP IPSec Policy] ---> policy " . [/ip ipsec policy get $IpSecPolicyId comment] . " deactivated"); } # ID set $IdList ($IdList, $IpSecPolicyId); } } } # : , :if ([/ip ipsec peer get $IpSecPeerId disabled]!=yes) do={ [/ip ipsec peer disable $IpSecPeerId]; log warning ("[IP IPSec Peer] ---> " . [/ip ipsec peer get $IpSecPeerId comment] . " ---> "); #log warning ("[IP IPSec Peer] ---> " . [/ip ipsec peer get $IpSecPeerId comment] . " ---> deactivated"); } } return ($IdList); } # # : # # $PeerID (ID VPN-); # $PolIdList ( ID $subDisableIpSecPeers); # $CloudIP (IP MikroTik DDNS); # $SrcIP (src-address VPN-) :global subEnableIpSecPeers do={ put ($PeerID); put ($PolIdList); put ($CloudIP); :if (($PeerID!="")&&($PeerID!=nil)&&($PolIdList!="")&&($PolIdList!=nil)&&($CloudIP!="")&&($CloudIP!=nil)) do={ # VPN- set $ActiveVPN [/ip ipsec peer get $PeerID address]; :if ($ActiveVPN!="") do={ # , IP- set $MaskPos [find $ActiveVPN "/"]; set $ActiveVPN ([pick $ActiveVPN 0 $MaskPos]); } # , :if ([/ip ipsec peer get $PeerID disabled]=yes) do={ delay 5000ms; [/ip ipsec peer enable $PeerID]; log warning ("[IP IPSec Peer] ---> peer ---> " . [/ip ipsec peer get $PeerID address]); #log warning ("[IP IPSec Peer] ---> activated peer on ---> " . [/ip ipsec peer get $PeerID address]); } # ID PolIdList, , Src. Address, SA Src. Address SA Dst. Address, :foreach IpSecPolicyId in=$PolIdList do={ :if ($IpSecPolicyId!="") do={ :if ([/ip ipsec policy get $IpSecPolicyId src-address]!=$SrcIP) do={ [/ip ipsec policy set $IpSecPolicyId src-address=$SrcIP]; log warning ("[IP IPSec Policy] ---> src-address"); #log warning ("[IP IPSec Policy] ---> src-address changed"); } :if ([/ip ipsec policy get $IpSecPolicyId sa-src-address]!=$CloudIP) do={ [/ip ipsec policy set $IpSecPolicyId sa-src-address=$CloudIP]; log warning ("[IP IPSec Policy] ---> sa-src-address"); #log warning ("[IP IPSec Policy] ---> sa-src-address changed"); } :if ([/ip ipsec policy get $IpSecPolicyId sa-dst-address]!=$ActiveVPN) do={ [/ip ipsec policy set $IpSecPolicyId sa-dst-address=$ActiveVPN]; log warning ("[IP IPSec Policy] ---> sa-dst-address"); #log warning ("[IP IPSec Policy] ---> sa-dst-address changed"); } :if ([/ip ipsec policy get $IpSecPolicyId disabled]=yes) do={ delay 3000ms; [/ip ipsec policy enable $IpSecPolicyId]; log warning ("[IP IPSec Policy] ---> "); #log warning ("[IP IPSec Policy] ---> policy activated"); # DNS- [/ip dns cache flush] } } } } } # ID # : # # $PeerIP (IP ); # $CloudIP (IP MikroTik DDNS); # $action (enable/disable/skip) # # ID, , :global subGetPoliciesByPeer do={ put ($PeerIP); put ($CloudIP); put ($action); :if (($action="")||($action=nil)) do={ set $action "skip"; } :foreach IpSecPolicyId in=[/ip ipsec policy find sa-dst-address=$PeerIP] do={ :if ($IpSecPolicyId!="") do={ # $action=disable, :if (([/ip ipsec policy get $IpSecPolicyId disabled]!=yes)&&($action="disable")) do={ [/ip ipsec policy disable $IpSecPolicyId]; log warning ("[IP IPSec Policy] ---> "); #log warning ("[IP IPSec Policy] ---> policy deactivated"); } # $CloudIP sa-src-address!=$CloudIP ( ISP), sa-src-address :if (($CloudIP!="")&&($CloudIP!=nil)&&([/ip ipsec policy get $IpSecPolicyId sa-src-address]!=$CloudIP)) do={ [/ip ipsec policy disable $IpSecPolicyId]; [/ip ipsec policy set $IpSecPolicyId sa-src-address=$CloudIP]; log warning ("[IP IPSec Policy] ---> ---> sa-src-address ---> " . $CloudIP); #log warning ("[IP IPSec Policy] ---> policy deactivated ---> new sa-src-address ---> " . $CloudIP); # , Kerio delay 30000ms; } # $action=enable, :if (([/ip ipsec policy get $IpSecPolicyId disabled]=yes)&&($action="enable")) do={ [/ip ipsec policy enable $IpSecPolicyId]; log warning ("[IP IPSec Policy] ---> "); #log warning ("[IP IPSec Policy] ---> policy activated"); # DNS- [/ip dns cache flush] } # ID set $IdList ($IdList, $IpSecPolicyId); } } return ($IdList); } # local-address # : # # $PeerID (ID VPN-); # $CloudIP (IP MikroTik DDNS) :global subCheckPeerLocalIp do={ put ($PeerID); put ($CloudIP); :if (($PeerID!="")&&($PeerID!=nil)&&($CloudIP!="")&&($CloudIP!=nil)) do={ # DDNS-IP :if ([/ip ipsec peer get $PeerID local-address]!=$CloudIP) do={ [/ip ipsec peer set $PeerID local-address=$CloudIP]; log warning ("[IP IPSec Peer] ---> local-address"); #log warning ("[IP IPSec Peer] ---> local-address changed"); } } }
/system script add dont-require-permissions=no name=scriptCheckActiveVpnServer owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon
scriptCheckActiveVpnServer :if ([:len [/system script job find script=scriptCheckActiveVpnServer]]>1) do={ :error } # scheduleStartup # , :global subCheckCloudDDNS :global subCheckPeerLocalIp :global subDisableIpSecPeers :global subEnableIpSecPeers :global subGetPoliciesByPeer :global subGetVpnServers :global subUpdateCloudDns :local CheckIP :local CheckPeer # DDNS ( ) :local CloudDnsStatus ([:put [$subCheckCloudDDNS]]) :local Exit false :local DefMikroTikSrcNet 192.168.11.0/24 :local DefKerioDstNet 192.168.77.0/24 :local DefKerioPropName KerioVPNProposal#01 :local DefKerioPolName KerioVPNPolicy :local IpSecPolicyId :local KerioName :local KerioVpnNatRuleName KerioVpnNatOut :local m :local n 1 :local PeerCount 0 :local PeerDisabled :local PingCount 3 :local PingResult :local PoliciesList :local PublicIp :local VpnServersList # DDNS , , IP- MikroTik :if ($CloudDnsStatus=0) do={ # Cloud DDNS , :log error ("[schedule CheckActiveVpnServer] ---> VPN- Cloud DDNS! (IP -> Cloud)") # :log error ("[schedule CheckActiveVpnServer] ---> to connect to the VPN server, you need to activate Cloud DDNS! (IP -> Cloud)") :error } :if ($CloudDnsStatus=1) do={ # Cloud DDNS , , ( ) :set CloudDnsStatus [:put [$subUpdateCloudDns start=false]] :if ($CloudDnsStatus="updated") do={ :set CloudDnsStatus 2 } } :if ($CloudDnsStatus=2) do { # Cloud DDNS ... # IP DDNS :set PublicIp [/ip cloud get public-address] # VPN- , ( ) :set VpnServersList ([:put [$subGetVpnServers]]) # :foreach VpnIpId in=$VpnServersList do={ :set PeerCount ($PeerCount+1) } # VPN- DDNS-IP ( , VPN- ) :while (($Exit!=true)&&$n<=$PeerCount) do={ :foreach VpnIpId in=$VpnServersList do={ # IP- VPN- :if (($VpnIpId->0)=$n) do={ :set CheckIP ($VpnIpId->1) :if ($CheckIP!="") do={ # IP :set PingResult ([:put [/ping address=$CheckIP count=$PingCount src-address=$PublicIp]]) :if ($PingResult=$PingCount) do={ :log warning ("[schedule CheckActiveVpnServer] ---> DDNS-IP ---> " . $PublicIp . " ---> VPN-IP ---> " . $CheckIP . " ---> Ping Result ---> " . $PingResult) # IP , IP- :set CheckPeer (:put [/ip ipsec peer find address=($CheckIP . "/32")]) :if ($CheckPeer!="") do={ # , src- (IP ---> Firewall ---> Address Lists), Kerio # Kerio :set KerioName [/ip ipsec peer get $CheckPeer comment] # ( , FQDN Kerio KerioName-Parameter1-...-Parameter_n :if ($KerioName!="") do={ # :set m ([find $KerioName "-"]) # KerioName :set KerioName ([pick $KerioName 0 $m]) # Firewall -> Address List ( : # Name ---> KerioName (eg srv1) # Address ---> DefMikroTikSrcNet (eg 192.168.99.0/24)) :set m [/ip firewall address-list find list=$KerioName] :set DefMikroTikSrcNet ([/ip firewall address-list get $m address]) } # ... Kerio :set IpSecPolicyId (:put [/ip ipsec policy find comment="$DefKerioPolName"]) # , # ( ) :if ($IpSecPolicyId="") do={ [/ip ipsec policy add disabled=yes dst-address=$DefKerioDstNet proposal=$DefKerioPropName sa-dst-address=$CheckIP sa-src-address=$PublicIp src-address=$DefMikroTikSrcNet tunnel=yes comment=$DefKerioPolName place-before=0] :log warning ("[schedule CheckActiveVpnServer] ---> " . $DefKerioPolName . " ---> ") #:log warning ("[schedule CheckActiveVpnServer] ---> created policy " . $DefKerioPolName . " ---> default parameters used") } else={ # , src-address, . :if ($DefMikroTikSrcNet!=[/ip ipsec policy get $IpSecPolicyId src-address]) do={ [/ip ipsec policy set $IpSecPolicyId src-address=$DefMikroTikSrcNet]; :log warning ("[schedule CheckActiveVpnServer] ---> " . $DefKerioPolName . " ---> src-address ---> " . $DefMikroTikSrcNet) #:log warning ("[schedule CheckActiveVpnServer] ---> policy " . $DefKerioPolName . " changed ---> src-address changed to ---> " . $DefMikroTikSrcNet) } } # :set m # NAT- Kerio :set m [/ip firewall nat find comment=$KerioVpnNatRuleName] :if ($m!="") do={ # src-address ipsec, Kerio :if ([/ip firewall nat get $m to-addresses]!=$DefMikroTikSrcNet) do={ [/ip firewall nat set $m to-addresses $DefMikroTikSrcNet] :log warning ("[IP Firewall NAT] ---> ---> " . $KerioVpnNatRuleName) #:log warning ("[IP Firewall NAT] ---> netmap rule changed ---> " . $KerioVpnNatRuleName) } } # ... local-address IP MikroTik, ( ) :put [$subCheckPeerLocalIp PeerID=$CheckPeer CloudIP=$PublicIp] # ... :set PeerDisabled ([/ip ipsec peer get $CheckPeer disabled]) :if ($PeerDisabled=true) do={ # ... # ( ) :set PoliciesList ([:put [$subDisableIpSecPeers]]) # VPN- ( ) :put [$subEnableIpSecPeers PeerID=$CheckPeer PolIdList=$PoliciesList CloudIP=$PublicIp SrcIP=$DefMikroTikSrcNet] } else={ # ... # , ( ) :set PoliciesList ([:put [$subGetPoliciesByPeer PeerIP=$CheckIP CloudIP=$PublicIp SrcIP=$DefMikroTikSrcNet action="enable"]]) } :set Exit true } } else={ :log error ("[schedule CheckActiveVpnServer] ---> DDNS-IP ---> " . $PublicIp . " ---> VPN-IP ---> " . $CheckIP . " ---> Ping Result ---> " . $PingResult) } } } } :set n ($n+1) } }
/system scheduler add interval=1h name=scheduleCheckIPSecSADstAddrFromDNS on-event=\ "/system script run scriptSetIPSecSADstAddrFromDNS" policy=read,write \ start-date=oct/30/2017 start-time=00:10:00 add name=scheduleStartup on-event=":global StartupScript true :global RepeatRun false /system script run scriptFunctionsList" policy=\ ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ start-time=startup add interval=5m name=scheduleCheckActiveVpnServer on-event=\ "/system script run scriptCheckActiveVpnServer" policy=\ ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ start-date=nov/29/2017 start-time=00:00:00
scheduleStartup :global StartupScript true :global RepeatRun false /system script run scriptFunctionsList
scheduleCheckIPSecSADstAddrFromDNS /system script run scriptSetIPSecSADstAddrFromDNS
scheduleCheckActiveVpnServer /system script run scriptCheckActiveVpnServer
:MikroTik DNS- , Kerio Control, MikroTik, IP ---> DNS ---> Static…
- !
, …
شكرا لاهتمامكم!
ملاحظة
:- « ?:»;
- ;
- IP- , ISP, ;
- « :»;