المسنجر ، كم في هذه الكلمة. خادم VPN متعدد المنصات قابل للتكوين بمرونة ومجاني ، وهو في الواقع المعيار الافتراضي لتنظيم الوصول إلى شبكات الشركات الداخلية. يستخدمه معظم المسؤولين باستخدام الإعدادات الافتراضية أو مع التكوينات النموذجية الموضحة على نطاق واسع في HOW-TOs المختلفة. ولكن هل OpenVPN بهذه البساطة كما يبدو للوهلة الأولى؟ في هذه المقالة ، سننظر في الآليات الداخلية لـ OpenVPN ، المخفية عن العينين ، والتي تغير بشكل جذري فكرة قدراتها.
يتم توزيع خادم OpenVPN في شكل شفرة المصدر أو حزم برمجية جاهزة للتثبيت لأنظمة تشغيل مختلفة. يستخدم OpenSSL كمكتبة توفر التشفير.
تتضمن معظم التكوينات لربط العملاء بالخادم ، وكذلك بين الخوادم ، استخدام مجموعة من المفاتيح الخاصة أو الخاصة / العامة لضمان أمان حركة المرور الداخلية. بالنسبة لشبكات الشركات في وضع MultiPoint-To-SinglePoint ، عادةً ما يتم استخدام المرجع المصدق الخاص بـ PKI ، والذي تم تصميمه بسهولة باستخدام إما rsa أو XCA . بالنسبة للاتصال بين الخادم من نقطة إلى نقطة ، يتم استخدام تكوين المفتاح المشترك بشكل أساسي. أذكر الآليات والقدرات الأساسية المعروفة.
الآليات والقدرات الرئيسية
مصادقة الشهادة
لقد كتب الكثير من الوثائق حول هذا الموضوع. النقطة بسيطة. يتم إنشاء مرجع مصدق يصدر شهادات المستخدم. مع مساعدة من سلطة المرجع المصدق يتم توفير لربط المستخدمين إلى خادم OpenVPN. عند انتهاء صلاحية الشهادة أو إبطالها ، يتم حظر وصول المستخدم. توفر المفاتيح الخاصة مع تعيين كلمة مرور عليها ، الصادرة بالاقتران مع الشهادة ، الأمان ضد الاتصالات غير المصرح بها بالموارد الداخلية.
مفاتيح خاصة من نقطة إلى نقطة
من وجهة نظر توصيل مستخدم / خادم واحد فقط بموارد الشركة ، يتم استخدام مخطط مع مفاتيح خاصة. يتم إنشاء مفتاح على أحد المضيفين ، والذي يتم مشاركته بين الخادم والعميل.
في جميع حالات الاتصال من أجل أمان مصافحة "المصافحة" بين العميل والخادم ، يتم استخدام بروتوكول Diffie-Hellmann.
مصادقة المستخدم الخارجي
لتبسيط التحكم في اتصالات المستخدم ، بدلاً من نظام به PKI الخاص به ، يمكنك استخدام نظام بمصادقة مستخدم خارجي عن طريق تسجيل الدخول / كلمة المرور . هذا المخطط مناسب لمصادقة المستخدمين من خلال تسجيل دخول / كلمة مرور المجال. للاتصال بالخادم ، تتم إضافة شهادة الخادم ومفتاح توقيع حزمة HARDENING OPENVPN SECURITY إلى ملف تكوين العميل.
مثال التكوين العميل
dev tun proto udp # IP OpenVPN remote 172.16.111.166 # Port port 1200 client resolv-retry infinite tls-client key-direction 1 auth SHA1 cipher BF-CBC #comp-lzo persist-key persist-tun # auth-user-pass c:/temp/pass.txt # # just create a file with name pass.txt # and put to it two lines # ------------- #username #password # ------------- #auth-user-pass verb 3 <ca> -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIJAOt3kFH7PxA0MA0GCSqGSIb3DQEBCwUAMIGjMQswCQYD .... -----END CERTIFICATE----- </ca> <tls-auth> -----BEGIN OpenVPN Static key V1----- 83ddd29fa82212f3059d85a41490134c .... a4f2c7df3a22364a49093bca102dedeb -----END OpenVPN Static key V1----- </tls-auth>
جزء من تهيئة الخادم لمصادقة العميل عبر الملف
باستخدام أساليب المصادقة البديلة
verify-client-cert none #client-cert-not-required username-as-common-name tls-server tls-auth /usr/local/etc/openvpn/ssl/tlsauth.key key-direction 0 tls-timeout 120 auth SHA1 cipher BF-CBC auth-user-pass-verify /usr/local/etc/openvpn/auth/auth-static-file.pl via-file
هذا المخطط مناسب ، لكنه غير آمن للغاية.
PAM
لزيادة الأمان ، يمكنك استخدام المكونات الإضافية التي توفر التحقق من تسجيل الدخول / كلمة المرور في الأنظمة الخارجية. الطريقة الأكثر شيوعًا هي نظام PAM (وحدات المصادقة القابلة للتوصيل).
أضف السطر إلى ملف تكوين OpenVPN
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login
التوجيه
بسبب تتمثل المهمة الرئيسية للخادم في توفير وصول المستخدمين / الخوادم عن بعد إلى الموارد الداخلية ، ويسمح لك الخادم بتحديد التوجيه الثابت من العملاء إلى الخادم ومن الخادم إلى العملاء. من وجهة نظر وصول العميل إلى الموارد الداخلية ، يسمح لك الخادم الذي يستخدم DHCP والتوجيهات "route" أو "route push" بنقل طرق الشبكة الداخلية إلى العميل. لإعلام الخادم نفسه بشبكات الاتصال البعيدة من جانب العميل ، يتم استخدام "client config dir" (ccd) ، وهي آلية تسمح باستخدام توجيه "iroute" لوصف قائمة الشبكات الداخلية للعميل التي يجب أن تكون موجودة في جدول توجيه الخادم لنقل المرور إليها.
على هذه الميزات "المنتظمة" المستخدمة على نطاق واسع ، ويبدأ التخصيص المحلي لكل حالة محددة.
ميزات OpenVPN إضافية
فكر في الميزات الإضافية لـ OpenVPN ، التي ربما سمعها شخص ما ، ولكن في الواقع لم يرها أو يستخدمها.
أمان الشبكة / تصفية الحزمة
بسبب يقوم نظام OpenVPN بتوجيه حركة المرور ، وله وضعان عاديان متبادلان للعمل. الوضع الأول هو التوجيه داخل خادم OpenVPN ، والوضع الثاني هو التوجيه النووي بين الواجهات. في الحالة الأولى ، يكون OpenVPN مسؤولاً عن تبديل وتصفية الحزم بين العملاء / الشبكات ، وفي الحالة الثانية ، أي مرشح لحزم النظام مدعوم على المضيف (pf ، iptables ، إلخ).
قليل من الناس يعرفون أن OpenVPN يحتوي على عامل تصفية حزم مضمن يسمح لك بالسماح أو عزل الاتصالات بين المستخدمين والشبكات.
نعم نعم لقد قرأت ذلك بشكل صحيح. لدى OpenVPN مرشح الحزمة المدمج الخاص بها. تم تنفيذ القدرة على تصفية حركة المرور مرة أخرى في عام 2010 .
يتم التحكم في مرشح حزم OpenVPN إما من خلال واجهة الإدارة أو من خلال المكونات الإضافية المتصلة بـ OpenVPN.
تتم إدارة قواعد المرور من خلال ملف. تنسيق الملف بسيط.
[CLIENTS DROP|ACCEPT] {+|-}common_name1 {+|-}common_name2 . . . [SUBNETS DROP|ACCEPT] {+|-}subnet1 {+|-}subnet2 . . . [END]
تحدد توجيهات الحظر (ACCEPT / DENY) الإجراء الافتراضي لجميع العملاء غير المحددين داخل الكتلة.
على سبيل المثال ، ملف user2 العميل
[CLIENTS DROP] +user1 [SUBNETS DROP] [END]
سيحظر حركة المرور على جميع المستخدمين والشبكات ، لكن يسمح بحركة المرور إلى جانب client1 إذا لم يصف user1 بشكل صريح الإذن بنقل حركة المرور إلى user2 ، فستذهب الحركة فقط في اتجاه واحد user2-> user1.
أو مثال آخر.
تعطيل كل شيء ما عدا الوصول بين المستخدمين وخادم DNS الموجود على الشبكة المحلية ودائرة الاختبار على الشبكة 192.168.0.0/24
[CLIENTS DROP] +user1 +user2 [SUBNETS DROP] +10.150.0.1 +10.150.1.1 +192.168.0.0/24 [END]
يتم تنشيط آلية التصفية من خلال ملف التكوين ، أو عند توصيل المكوّن الإضافي الذي "يضع" العلامة "OPENVPN_PLUGIN_ENABLE_PF".
سنناقش هذه الفرصة في وقت لاحق.
الوضع الثاني لتصفية حركة المرور هو مرشح الحزمة المدمج في النظام. لتنشيطه ، لا ينبغي أن يحتوي التكوين على توجيه "العميل إلى العميل". من وجهة نظر أتمتة تشغيل / إيقاف تشغيل القواعد الضرورية عند الاتصال / فصل العملاء ، من الأنسب استخدام إدراجات منفصلة في قائمة القواعد ، يتم تنفيذها إما من خلال CHAINS في Iptables (Linux) أو في Anchors in PF (FreeBSD). يتم تنشيط / إلغاء تنشيط القواعد عادةً من خلال توجيهات اتصال العميل / قطع اتصال العميل في ملف تكوين الخادم ، والتي تستدعي البرامج النصية المقابلة عندما يقوم المستخدم بالاتصال / قطع الاتصال.
مصادقة PAM المتقدمة
مصادقة PAM الموسعة تعني تغيير منطق تسجيل دخول المستخدم والتحقق من كلمة المرور. يتم تحقيق ذلك إما عن طريق تثبيت المكونات الإضافية المناسبة لـ OpenVPN ، والتي توفر قراءة البيانات والتحقق منها في مصادر خارجية ، أو عن طريق توصيل المكتبات بالنظام الذي يتيح لك برمجة أي منطق. إحدى هذه المكتبات هي pam_python ، مما يساعد على كتابة أي منطق للتحقق من تسجيل الدخول / كلمة المرور من خلال البرامج النصية Python.
إذا تم استخدامه ، تتغير سلسلة التحقق من المستخدم كما يلي.
plugin openvpn-plugin-auth-pam.so pam_python login USERNAME password PASSWORD domain mydomain.com
نظرًا لأن "تحت غطاء" PAM هي خوارزميات حوار النظام مع المستخدم أو المكتبات الخارجية ، يمكن التحكم في هذه الحوارات. على سبيل المثال ، قم بتوصيل الرموز المميزة OTP للنظام . مكتبة LinOTP تؤخذ ببساطة كمثال ، لأنه لقد فقدت مكتبتي المكتوبة ذاتيا أثناء اختبار مكان ما ¯ \ (ツ) / ¯
أيضًا ، يتم غوغل الأمثلة بكلمة "pam_python" بسهولة.
تتمثل المشكلة الرئيسية عند العمل مع وحدات PAM الخارجية في عدم القدرة على الحصول على بيئة جلسة OpenVPN داخل Python أو أي برنامج نصي آخر يتم استدعاؤه عبر pam النظام. أي يوفر البرنامج النصي فقط تلك الوظائف للتحقق من تسجيل الدخول / كلمة المرور المخصصة له.
المصادقة المؤجلة
يدعم خادم OpenVPN مصادقة "التأخير" المزعومة. يتم استخدام المصادقة "المؤجلة" في الحالات التي لا تتمكن فيها خدمة المصادقة من خدمة طلب التحقق من تسجيل الدخول / كلمة المرور في الوقت الفعلي.
OpenVPN الإضافات
هذا هو عالم مواز منفصل ، والذي قد يكون معروفا عنه ، ولكن بسبب بعض الالتباس ، فإنها ليست قادرة على أو خائفة من استخدامها. في الواقع ، تتطلب كتابة مكون إضافي وظيفي لـ OpenVPN البرمجة بلغة C مع كل ما تتضمنه. يتم تضمين أمثلة من الإضافات البسيطة في شجرة مصدر OpenVPN ، أو على سبيل المثال ، هناك مكون إضافي لشرح مكالمات الطريقة من OpenVPN .
دعنا نحاول معرفة كيفية عمل المكونات الإضافية من OpenVPN.
يتم توضيح الوظائف والمعلمات المستخدمة للعمل مع المكونات الإضافية في ملف منفصل
تتمثل المهمة الرئيسية للمكون الإضافي ، عند تهيئة خادم OpenVPN ، في نقل قائمة الوظائف التي يدعمها البرنامج المساعد ، وعند إرجاع أي من الوظائف ، يُرجع رمز الاستجابة الصحيح ، الذي سيفهمه الخادم.
#define OPENVPN_PLUGIN_FUNC_SUCCESS 0 #define OPENVPN_PLUGIN_FUNC_ERROR 1 #define OPENVPN_PLUGIN_FUNC_DEFERRED 2
دعونا نتعمق في كل مجموعة. سننظر في منطق العمل على أساس مصادقة كلمة المرور للمستخدم.
عند بدء تشغيل الخادم ، بعد قراءة ملف التكوين ، يقوم الخادم باستدعاء الدالتين OPENVPN_PLUGIN_UP و OPENVPN_PLUGIN_ROUTE_UP. في البيئة المتغيرة للوظائف المطلوبة ، يتم نقل المعلمات الرئيسية لخادم التشغيل.
OPENVPN_PLUGIN_UP { "route_netmask_1":"255.255.0.0", "daemon_start_time":"1545994898", "ifconfig_remote":"10.150.0.2", "local_1":"172.16.100.139", "script_context":"init", "config":"/usr/local/etc/openvpn/server150.conf", "link_mtu":"1622", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "verb":"2", "daemon_pid":"626", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "daemon_log_redirect":"1", "daemon":"1", "route_net_gateway":"172.16.100.1", "dev_type":"tun", "route_gateway_1":"10.150.0.2", "remote_port_1":"1200", "dev":"tun150", "pluginid":"0", "local_port_1":"1200", "route_network_1":"10.150.0.0" }
OPENVPN_PLUGIN_ROUTE_UP { "route_netmask_1":"255.255.0.0", "daemon_start_time":"1545994898", "redirect_gateway":"0", "ifconfig_remote":"10.150.0.2", "local_1":"172.16.100.139", "script_context":"init", "config":"/usr/local/etc/openvpn/server150.conf", "link_mtu":"1622", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "verb":"2", "daemon_pid":"626", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "daemon_log_redirect":"1", "daemon":"1", "route_net_gateway":"172.16.100.1", "dev_type":"tun", "route_gateway_1":"10.150.0.2", "remote_port_1":"1200", "dev":"tun150", "pluginid":"2", "local_port_1":"1200", "route_network_1":"10.150.0.0" }
يمكن استخدام هذه الوظائف للتنبيهات عند بدء تشغيل الخادم أو تغييرات التكوين.
عند توصيل عميل ، يطلب OpenVPN القدرة على تنشيط مرشح حزم داخلي.
OPENVPN_PLUGIN_ENABLE_PF { "route_netmask_1":"255.255.0.0", "daemon_start_time":"1545994898", "redirect_gateway":"0", "ifconfig_remote":"10.150.0.2", "local_1":"172.16.100.139", "script_context":"init", "config":"/usr/local/etc/openvpn/server150.conf", "link_mtu":"1622", "pf_file":"/tmp/openvpn_pf_b7a18ca8fac838679ca87ada6b8a356.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "verb":"2", "daemon_pid":"626", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "daemon":"1", "daemon_log_redirect":"1", "dev_type":"tun", "route_gateway_1":"10.150.0.2", "remote_port_1":"1200", "dev":"tun150", "pluginid":"11", "local_port_1":"1200", "route_network_1":"10.150.0.0" }
كما ترون من التفريغ ، ظهر متغير pf_file. يجب أن يحتوي هذا الملف على قواعد عامل تصفية الحزمة الداخلية للجلسة الحالية قيد المعالجة.
بعد ذلك ، يتم التحقق من اسم المستخدم وكلمة المرور للمستخدم في وظيفة OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY
OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY { "route_netmask_1":"255.255.0.0", "route_gateway_1":"10.150.0.2", "IV_NCP":"2", "IV_COMP_STUB":"1", "daemon_start_time":"1545994898", "IV_LZ4":"1", "redirect_gateway":"0", "ifconfig_remote":"10.150.0.2", "untrusted_port":"1200", "IV_LZ4v2":"1", "local_1":"172.16.100.139", "script_context":"init", "untrusted_ip":"172.16.111.168", "config":"/usr/local/etc/openvpn/server150.conf", "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "link_mtu":"1622", "pf_file":"/tmp/openvpn_pf_b7a18ca8fac838679ca87ada6b8a356.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "auth_control_file":"/tmp/openvpn_acf_a3d0650a43b88ca1b5f305ce2c8f682.tmp", "daemon":"1", "IV_COMP_STUBv2":"1", "verb":"2", "IV_PLAT":"win", "daemon_pid":"626", "password":"12312312312312", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "IV_PROTO":"2", "daemon_log_redirect":"1", "dev_type":"tun", "IV_VER":"2.4.3", "IV_LZO":"1", "remote_port_1":"1200", "dev":"tun150", "pluginid":"5", "local_port_1":"1200", "IV_TCPNL":"1", "route_network_1":"10.150.0.0" }
هذا هو المكان الوحيد الذي توجد فيه كلمة المرور في البيئة المتغيرة بشكل واضح.
يجب أن تكون نتيجة هذه الوظيفة ثلاث إجابات ممكنة.
#define OPENVPN_PLUGIN_FUNC_SUCCESS 0 #define OPENVPN_PLUGIN_FUNC_ERROR 1 #define OPENVPN_PLUGIN_FUNC_DEFERRED 2
إذا تلقى الخادم إجابة OPENVPN_PLUGIN_FUNC_DEFERRED ، فإن آلية المصادقة "المؤجلة" تدخل حيز التنفيذ. كما نرى ، ظهر المتغير "auth_control_file" في البيئة المتغيرة ، وتحتوي محتويات هذا المتغير على اسم الملف الذي يتوقع فيه استجابة من نظام المصادقة. الجواب هو الرمز 0 (للسماح بالوصول) ، 1 (لرفض الوصول) الموضوعة في الملف المحدد. تحدد معلمة الخادم "نافذة اليد" المهلة بالثواني ، والتي خلالها سينتظر الخادم استجابة. أثناء الانتظار ، لا تنقطع حركة المرور من العملاء الآخرين.
نظرًا لأننا نعمل مع مصادقة كلمة المرور ، لا يتم استدعاء وظيفة التحقق من الشهادة OPENVPN_PLUGIN_TLS_VERIFY. بدلاً من ذلك ، يتم استدعاء OPENVPN_PLUGIN_TLS_FINAL على الفور ، مما يؤكد إنشاء الجلسة.
OPENVPN_PLUGIN_TLS_FINAL { "route_netmask_1":"255.255.0.0", "route_gateway_1":"10.150.0.2", "IV_NCP":"2", "IV_COMP_STUB":"1", "daemon_start_time":"1545994898", "IV_LZ4":"1", "redirect_gateway":"0", "ifconfig_remote":"10.150.0.2", "untrusted_port":"1200", "IV_LZ4v2":"1", "local_1":"172.16.100.139", "script_context":"init", "untrusted_ip":"172.16.111.168", "config":"/usr/local/etc/openvpn/server150.conf", "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "link_mtu":"1622", "pf_file":"/tmp/openvpn_pf_b7a18ca8fac838679ca87ada6b8a356.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "auth_control_file":"/tmp/openvpn_acf_a3d0650a43b88ca1b5f305ce2c8f682.tmp", "daemon":"1", "IV_COMP_STUBv2":"1", "verb":"2", "IV_PLAT":"win", "daemon_pid":"626", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "IV_PROTO":"2", "daemon_log_redirect":"1", "dev_type":"tun", "IV_VER":"2.4.3", "IV_LZO":"1", "remote_port_1":"1200", "dev":"tun150", "pluginid":"10", "local_port_1":"1200", "IV_TCPNL":"1", "route_network_1":"10.150.0.0" }
بعد ذلك ، يتم استدعاء المكالمة OPENVPN_PLUGIN_IPCHANGE ، والتي تسمى قبل تغيير عنوان IP للعميل.
OPENVPN_PLUGIN_IPCHANGE { "route_netmask_1":"255.255.0.0", "route_gateway_1":"10.150.0.2", "trusted_ip":"172.16.111.168", "link_mtu":"1622", "IV_COMP_STUB":"1", "daemon_start_time":"1547319280", "IV_LZ4":"1", "redirect_gateway":"0", "common_name":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "ifconfig_remote":"10.150.0.2", "IV_NCP":"2", "untrusted_port":"1200", "IV_LZ4v2":"1", "local_1":"172.16.100.139", "script_context":"init", "untrusted_ip":"172.16.111.168", "config":"/usr/local/etc/openvpn/server150.conf", "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "trusted_port":"1200", "pf_file":"/tmp/openvpn_pf_4fcad505693b33f97c4fe105df8681cb.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "auth_control_file":"/tmp/openvpn_acf_321bb12075dc0e1b5440d227220bac5d.tmp", "daemon":"1", "IV_COMP_STUBv2":"1", "verb":"3", "IV_PLAT":"win", "daemon_pid":"52435", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "IV_PROTO":"2", "daemon_log_redirect":"1", "dev_type":"tun", "IV_VER":"2.4.3", "IV_LZO":"1", "remote_port_1":"1200", "dev":"tun150", "pluginid":"3", "local_port_1":"1200", "IV_TCPNL":"1", "route_network_1":"10.150.0.0" }
يتم استدعاء الدالة OPENVPN_PLUGIN_CLIENT_CONNECT_V2 عند تعيين عنوان IP بواسطة خادم DHCP الداخلي.
OPENVPN_PLUGIN_CLIENT_CONNECT_V2 { "route_netmask_1":"255.255.0.0", "route_gateway_1":"10.150.0.2", "trusted_ip":"172.16.111.168", "link_mtu":"1622", "IV_COMP_STUB":"1", "daemon_start_time":"1547319280", "IV_LZ4":"1", "dev":"tun150", "common_name":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "time_ascii":"Sat Jan 12 18:54:48 2019", "ifconfig_remote":"10.150.0.2", "IV_NCP":"2", "untrusted_port":"1200", "IV_LZ4v2":"1", "local_1":"172.16.100.139", "script_context":"init", "untrusted_ip":"172.16.111.168", "config":"/usr/local/etc/openvpn/server150.conf", "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "trusted_port":"1200", "pf_file":"/tmp/openvpn_pf_4fcad505693b33f97c4fe105df8681cb.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "auth_control_file":"/tmp/openvpn_acf_321bb12075dc0e1b5440d227220bac5d.tmp", "daemon":"1", "IV_COMP_STUBv2":"1", "verb":"3", "IV_PLAT":"win", "daemon_pid":"52435", "time_unix":"1547319288", "redirect_gateway":"0", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "IV_PROTO":"2", "daemon_log_redirect":"1", "dev_type":"tun", "IV_VER":"2.4.3", "IV_LZO":"1", "remote_port_1":"1200", "ifconfig_pool_local_ip":"10.150.0.5", "pluginid":"9", "ifconfig_pool_remote_ip":"10.150.0.6", "local_port_1":"1200", "IV_TCPNL":"1", "route_network_1":"10.150.0.0" }
في بيئة متغيرة ، تظهر المتغيرات التي تحتوي على معلمات النفق "ifconfig_pool_local_ip" و "ifconfig_pool_remote_ip".
يتم استدعاء وظيفة OPENVPN_PLUGIN_LEARN_ADDRESS عندما يتعلم خادم OpenVPN اتصال عناوين IP والطرق إليها. بعد الخروج من هذه الوظيفة ، يتم تنشيط الإجراء الخاص بتطبيق إعدادات مرشح الحزمة من الملف. يتوافق متغير البيئة OPENVPN_PLUGIN_LEARN_ADDRESS في هذه الحالة مع المرحلة OPENVPN_PLUGIN_CLIENT_CONNECT_V2.
fa56bf61-.../172.16.111.168:1200 ----- pf_check_reload : struct pf_context ----- fa56bf61-.../172.16.111.168:1200 enabled=1 fa56bf61-.../172.16.111.168:1200 filename='/tmp/openvpn_pf_343330698e4acdea34c8a8c7fb87d861.tmp' fa56bf61-.../172.16.111.168:1200 file_last_mod=1547319124 fa56bf61-.../172.16.111.168:1200 n_check_reload=1 fa56bf61-.../172.16.111.168:1200 reload=[1,15,1547319125] fa56bf61-.../172.16.111.168:1200 ----- struct pf_set ----- fa56bf61-.../172.16.111.168:1200 kill=0 fa56bf61-.../172.16.111.168:1200 ----- struct pf_subnet_set ----- fa56bf61-.../172.16.111.168:1200 default_allow=ACCEPT fa56bf61-.../172.16.111.168:1200 ----- struct pf_cn_set ----- fa56bf61-.../172.16.111.168:1200 default_allow=DROP fa56bf61-.../172.16.111.168:1200 12345678-90da-11e8-bf33-005056a12a82-1234567 ACCEPT fa56bf61-.../172.16.111.168:1200 fa56bf61-90da-11e8-bf33-005056a12a82-1234567 ACCEPT fa56bf61-.../172.16.111.168:1200 ---------- fa56bf61-.../172.16.111.168:1200 fa56bf61-90da-11e8-bf33-005056a12a82-1234567 ACCEPT fa56bf61-.../172.16.111.168:1200 12345678-90da-11e8-bf33-005056a12a82-1234567 ACCEPT fa56bf61-.../172.16.111.168:1200 --------------------
عند قطع اتصال عميل ، يتم استدعاء الدالة OPENVPN_PLUGIN_CLIENT_DISCONNECT.
OPENVPN_PLUGIN_CLIENT_DISCONNECT { "route_netmask_1":"255.255.0.0", "route_gateway_1":"10.150.0.2", "trusted_ip":"172.16.111.168", "link_mtu":"1622", "IV_COMP_STUB":"1", "daemon_start_time":"1547319280", "IV_LZ4":"1", "dev":"tun150", "common_name":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "time_ascii":"Sat Jan 12 18:54:48 2019", "bytes_received":"30893", "IV_NCP":"2", "untrusted_port":"1200", "ifconfig_remote":"10.150.0.2", "IV_LZ4v2":"1", "local_1":"172.16.100.139", "script_context":"init", "untrusted_ip":"172.16.111.168", "config":"/usr/local/etc/openvpn/server150.conf", "username":"fa56bf61-90da-11e8-bf33-005056a12a82-1234568", "trusted_port":"1200", "pf_file":"/tmp/openvpn_pf_4fcad505693b33f97c4fe105df8681cb.tmp", "ifconfig_local":"10.150.0.1", "tun_mtu":"1500", "auth_control_file":"/tmp/openvpn_acf_4bdddbada2885cde42cd3cb1b85d77e5.tmp", "daemon":"1", "IV_COMP_STUBv2":"1", "verb":"3", "IV_PLAT":"win", "daemon_pid":"52435", "time_unix":"1547319288", "redirect_gateway":"0", "route_vpn_gateway":"10.150.0.2", "proto_1":"udp", "route_net_gateway":"172.16.100.1", "IV_PROTO":"2", "daemon_log_redirect":"1", "time_duration":"3781", "dev_type":"tun", "IV_VER":"2.4.3", "IV_LZO":"1", "bytes_sent":"22684", "remote_port_1":"1200", "ifconfig_pool_local_ip":"10.150.0.5", "pluginid":"7", "ifconfig_pool_remote_ip":"10.150.0.6", "local_port_1":"1200", "IV_TCPNL":"1", "route_network_1":"10.150.0.0" }
في بيئة متغيرة ، تتم إضافة مدة الاتصال وحركة مرور المستخدم.
كما ترون ، نظرًا لوفرة البيانات في مكالمات مختلفة ، فإن كتابة مكون إضافي بلغة البرمجة C (C ++) وتصحيحه سيكون مهمة تستغرق وقتًا طويلاً.
لتوسيع الوظيفة ، تقرر إنشاء "معجزة" أولاً للمشروع الداخلي ، ثم وضعها في المجال العام :)
بعد قراءة طويلة لرموز مصدر OpenVPN وأمثلة مختلفة من الإضافات المتخصصة للغاية ، تم كتابة مشروع يستخدم Python كلغة برمجة لمنطق معالجة الجلسة. الرمز هو مكون إضافي في لغة C يتصل بـ OpenVPN ، والذي يرسل جميع الطلبات إلى المكون الإضافي ، يرسل الوحدة إلى Python من خلال المرجع c-api .
OpenVPN المساعد بيثون الوكيل
لماذا بيثون الوحدة؟
مرجع Python c-api الذي يعمل مع ملفات python مباشرة لا يعمل بشكل صحيح مع تحميل مكتبات python.
كيف يعمل؟
عند تهيئة المكوّن الإضافي في OpenVPN ، يُرجع البرنامج المساعد قائمة ملثمين تضم جميع الوظائف التي يمكنه تقديمها. عند حدوث مرحلة الاتصال التالية أو الحدث الداخلي ، يستدعي OpenVPN الوظائف المقابلة من البرنامج المساعد. البرنامج المساعد يحول متغير البيئة والمعلمات التي تم تمريرها إلى الوظيفة في هيكل ، وتهيئة بيثون ويمرر الهيكل إلى الإجراء المقابل لوحدة بيثون. يُرجع الإجراء واحدًا من ثلاث إجابات إلى المكون الإضافي (0 - النجاح ، 1 - الخطأ ، 2 - مؤجل). يتم تحويل الاستجابة وإعادتها بواسطة OpenVPN.
يرجى ملاحظة أن جميع مكالمات الوحدة النمطية هي "بلا جنسية" ، مما يعني أن الإجراءات لا تتذكر ولا تعرف ما حدث مسبقًا في مكالمات أخرى. يمكنك التركيز فقط على البيئة المتغيرة التي تم تمريرها إلى البرنامج المساعد من OpenVPN.
داخل وحدة بيثون ، يمكنك تنفيذ أي منطق من خلال ربط المكتبات والموارد اللازمة. إذا لم تكن متأكدًا من سرعة الشيكات ، فاستخدم التأكيدات "المعلقة".
باستخدام تجميع المستخدمين المتصلين بالخدمة ، من خلال pf_file ، يمكنك ضبط تفاعل الشبكة بين المستخدمين والموارد الأخرى تمامًا. بدوره ، من خلال توصيل المكون الإضافي للمراقبة ، سيكون من الممكن دائمًا إدارة جلسات العميل من خلال واجهة إدارة OpenVPN.
أثناء اختبار المشروع ، تم تطوير آلية لإنشاء كلمة مرور ، على غرار الرموز jwt ، ولكن بحجم أصغر.
النقطة بسيطة. الرمز المميز يحتوي على معرف العميل وتاريخ انتهاء الصلاحية للوصول. لتوقيع الرمز المميز ، يتم استخدام HMAC_SHA1 مع مفتاح خاص. بعد توقيع الرمز المميز ، تلف محتوى النص بالتوقيع ويتم تحويله إلى base64. وبالتالي ، يتم الحصول على "الختم" من الرمز. يتم استخدام رمز مميز مختوم ككلمة مرور المستخدم. في حالة حدوث تغيير غير مصرح به من كتلة البيانات ، فواصل xor ، إذا فواصل xor ، ثم فواصل التحقق من التوقيع. بدون مفتاح خاص ، لا يمكن تغيير التوقيع.
إذا كنت لا ترغب في التحكم في وقت صلاحية كلمة المرور بيديك ، فقم بإنشاء مثل هذا الرمز المميز ، وتحقق من صحته داخل البرنامج المساعد دون الاتصال بالخدمات الخارجية. هذا المخطط مناسب جدًا لتكوين كلمة مرور الجلسة لفترة معينة. في الوقت نفسه ، يمكنك نقل محتويات الرمز المميز إلى نظام تحكم خارجي وسيتم تكوينه لقطع اتصال المستخدم بعد انتهاء صلاحية الرمز المميز.
آمل أن تكون المعلومات الواردة في هذه المقالة مفيدة لك.
شكرا لأخذ الوقت الكافي لقراءته.
إذا كان لديك أسئلة ، سأحاول الإجابة على ما أستطيع.
© Aborche 2019
