وصلت المهمة لترتيب إصدار عناوين IP للمشتركين. شروط المهمة:
- لن نعطي خادمًا منفصلاً للترخيص - ستديره ؛)
- يجب أن يتلقى المشتركون إعدادات الشبكة عبر DHCP
- الشبكة متنوعة. هذا هو معدات PON ، والمفاتيح العادية مع الخيار 82 المكونة وقاعدة WiFi مع نقاط
- إذا كانت البيانات لا تندرج تحت أي من شروط إصدار IP ، فمن الضروري إصدار IP من شبكة "الضيف"
من الجيد: يوجد خادم على FreeBSD يمكنه "العمل" ، لكنه "بعيد" ؛) ، ليس "صحيح على هذه الشبكة."
هناك أيضا جهاز Mikrotik الرائع. مخطط الشبكة العام هو شيء مثل هذا:

بعد قليل من التفكير ، تقرر استخدام مشتركي FreeRadius لإصدار إعدادات الشبكة. من حيث المبدأ ، فإن المخطط هو المعتاد: في Microtick نقوم بتشغيل خادم DHCP ، وعلى نفس عميل Radius. نحن تكوين مجموعة من خادم DHCP -> Radius Client -> Radius server.
يبدو أنه ليس من الصعب. ولكن! الشيطان هو في التفاصيل. وهي:
- عندما يتم التصريح لـ PON OLT وفقًا لهذا المخطط ، يتم إرسال طلب إلى FreeRadius مع اسم مستخدم مساوٍ لعنوان MAC الخاص بالمحطة الرئيسية ، وسيط عامل Agent-ID مساوٍ لـ PON Onu MAC وكلمة مرور فارغة.
- عند التفويض باستخدام رموز التبديل مع الخيار 82 ، يأتي الطلب إلى FreeRadius باسم مستخدم فارغ يساوي جهاز MAC الخاص بالمشترك والسمات الإضافية الإضافية لـ Agent-Circuit و Agent-Remote-Id التي تحتوي ، مرة أخرى ، على مفتاح الترحيل MAC والمنفذ المتصل بالمشترك.
- يتم اعتماد بعض المشتركين الذين لديهم نقاط WiFI من خلال بروتوكولات PAP-CHAP
- يتم اعتماد بعض المشتركين الذين لديهم نقاط WIFI باسم مستخدم مساوي لعنوان MAC لنقطة WIFI ، دون كلمة مرور.
الخلفية التاريخية: ما هو الخيار 82 ل DHCP
هذه هي خيارات إضافية لبروتوكول DHCP والتي تسمح لك بنقل معلومات إضافية ، على سبيل المثال ، في حقل معرف الدائرة-الوكيل و معرف الوكيل عن بُعد. وعادة ما يتم استخدامه لنقل عنوان MAC لمفتاح الترحيل والمنفذ الذي يتصل به المشترك. في حالة معدات PON أو محطات WIFI الأساسية ، لا يحمل حقل معرف الدائرة-الوكيل معلومات مفيدة (لا يوجد منفذ مشترك). في هذه الحالة ، يكون المخطط العام لـ DHCP في هذه الحالة كما يلي:

خطوة بخطوة ، هذا المخطط يعمل مثل هذا:
- تقدم معدات المشترك طلب بث DHCP لإعدادات الشبكة
- يقوم الجهاز (على سبيل المثال ، مفتاح التبديل أو محطة WiFi أو PON الأساسية) التي يتصل بها جهاز المشترك مباشرة "باعتراض" هذه الحزمة وتعديلها ، وإدخال خيارات عنوان IP لعامل الخيار 82 و Relay agent ، ونقلها بشكل إضافي عبر الشبكة.
- يقبل خادم DHCP الطلب ويشكل استجابة ويرسله إلى جهاز الترحيل
- يقوم جهاز الترحيل بإعادة توجيه حزمة الاستجابة إلى جهاز المشترك
كل هذا لا يعمل ببساطة ، بالطبع ، أنت بحاجة إلى التكوين المناسب لمعدات الشبكة.
تثبيت FreeRadius
من خلال إعدادات تكوين FreeRadius ، بالطبع ، يمكنك تحقيق كل ذلك ، لكنه أمر صعب وغير واضح ... خاصةً عندما تتصفح هناك بعد N الشهور "كل شيء يعمل". لذلك ، تقرر كتابة وحدة الترخيص الخاصة بك لـ FreeRadius في بيثون. سنتخذ البيانات للحصول على إذن من قاعدة بيانات MySQL. لا معنى لوصف هيكلها ، على أي حال ، فإن الجميع سوف يفعلون ذلك "لأنفسهم". على وجه الخصوص ، أخذت الهيكل المقترح مع وحدة sql لـ FreeRadius ، وقمت بتغييره قليلاً عن طريق إضافة حقول MAC والمنفذ لكل مشترك ، بالإضافة إلى كلمة مرور تسجيل الدخول.
لذلك ، بالنسبة للمبتدئين ، تثبيت FreeRadius:
cd /usr/ports/net/freeradius3 make config make install clean
في الإعدادات ، نحتفل بالتثبيت:

نقوم بعمل رابط إلى وحدة بيثون (أي ، قم بتشغيله):
ln -s /usr/local/etc/raddb/mods-available/python /usr/local/etc/raddb/mods-enabled
تثبيت وحدة إضافية لبيثون:
pip install mysql-connector
في إعدادات وحدة python لـ FreeRadius ، تحتاج إلى تحديد مسارات بحث الوحدة النمطية في متغير python_path. على سبيل المثال ، لدي هذا:
python_path="/usr/local/etc/raddb/mods-config/python:/usr/local/lib/python2.7:/usr/local/lib/python27.zip:/usr/local/lib/python2.7:/usr/local/lib/python2.7/plat-freebsd12:/usr/local/lib/python2.7/lib-tk:/usr/local/lib/python2.7/lib-old:/usr/local/lib/python2.7/lib-dynload:/usr/local/lib/python2.7/site-packages"
يمكن العثور على المسارات عن طريق تشغيل مترجم بايثون وإدخال الأوامر:
root@phaeton:/usr/local/etc/raddb/mods-enabled
إذا لم تقم بهذه الخطوة ، فلن تجد البرامج النصية المكتوبة بيثون ويديرها FreeRadius تلك الوحدات المدرجة في الاستيراد. بالإضافة إلى ذلك ، من الضروري إلغاء وظائف التفويض والمحاسبة في إعدادات الوحدة النمطية. على سبيل المثال ، تبدو هذه الوحدة كما يلي:
python { python_path="/usr/local/etc/raddb/mods-config/python:/usr/local/lib/python2.7:/usr/local/lib/python2.7/site-packages:/usr/local/lib/python27.zip:/usr/local/lib/python2.7:/usr/local/lib/python2.7/plat-freebsd12:/usr/local/lib/python2.7/lib-tk:/usr/local/lib/python2.7/lib-old:/usr/local/lib/python2.7/lib-dynload:/usr/local/lib/python2.7/site-packages" module = work mod_instantiate = ${.module} mod_detach = ${.module} mod_authorize = ${.module} func_authorize = authorize mod_authenticate = ${.module} func_authenticate = authenticate mod_preacct = ${.module} func_preacct = preacct mod_accounting = ${.module} func_accounting = accounting mod_checksimul = ${.module} mod_pre_proxy = ${.module} mod_post_proxy = ${.module} mod_post_auth = ${.module} mod_recv_coa = ${.module} mod_send_coa = ${.module} }
يجب وضع نص work.py (وكل الباقي) في / usr / local / etc / raddb / mods-config / python هناك ثلاثة نصوص برمجية.
كما ترون من الشفرة ، نحاول بكل الوسائل المتاحة تحديد المشترك من خلال عناوين MAC للمشتركين المعروفين عنه أو مجموعة من الخيار 82 ، وإذا لم ينجح ذلك ، فسوف نصدر أقدم عنوان IP مستخدم من شبكة "الضيف". يبقى لتكوين البرنامج النصي الافتراضي في المجلد تمكين المواقع بحيث الوظائف اللازمة من نشل البرنامج النصي بيثون في الأوقات المشار إليها. في الواقع ، يكفي إحضار الملف إلى النموذج:
الافتراضي server default { listen { type = auth ipaddr = * port = 0 limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } } listen { ipaddr = * port = 0 type = acct limit { } } listen { type = auth port = 0 limit { max_connections = 1600 lifetime = 0 idle_timeout = 30 } } listen { ipv6addr = :: port = 0 type = acct limit { } } authorize { python filter_username preprocess expiration logintime } authenticate { Auth-Type PAP { pap python } Auth-Type CHAP { chap python } Auth-Type MS-CHAP { mschap python } eap } preacct { preprocess acct_unique suffix files } accounting { python exec attr_filter.accounting_response } session { } post-auth { update { &reply: += &session-state: } exec remove_reply_message_if_eap Post-Auth-Type REJECT { attr_filter.access_reject eap remove_reply_message_if_eap } Post-Auth-Type Challenge { } } pre-proxy { } post-proxy { eap } }
نحن نحاول تشغيل ونرى ما الذي يطير إلى سجل التصحيح:
/usr/local/etc/rc.d/radiusd debug
ماذا بعد. عند إعداد FreeRadius ، من المريح اختبار تشغيله باستخدام الأداة المساعدة radclient. على سبيل المثال إذن:
echo "User-Name=4C:5E:0C:2E:7F:15,Agent-Remote-Id=0x9845623a8c98,Agent-Circuit-Id=0x00010006" | radclient -x 127.0.0.1:1812 auth testing123
أو المحاسبة:
echo "User-Name=4C:5E:0C:2E:7F:15,Agent-Remote-Id=0x00030f26054a,Agent-Circuit-Id=0x00010002" | radclient -x 127.0.0.1:1813 acct testing123
أريد أن أحذر من أنه من المستحيل استخدام مخطط ونصوص مماثلة "بدون تغييرات" على نطاق "صناعي". على الأقل ملفتة للنظر:
- ممكن عنوان "وهمية" لجنة الهدنة العسكرية. يكفي أن يقوم المشترك بتسجيل MAC أجنبي لنفسه وستكون هناك مشاكل
- منطق إصدار شبكات الضيف هو أدنى من النقد. لا يوجد حتى الاختيار "هل يمكنك بالفعل عملاء مع عنوان IP هذا؟"
إنه مجرد "حل على الركبة" من أجل العمل بشكل خاص في ظروفي ، لا شيء أكثر من ذلك. لا تحكم بدقة ؛)