La tâche est arrivée d'organiser la délivrance d'adresses IP aux abonnés. Conditions de tâche:
- Nous ne donnerons pas de serveur séparé pour autorisation - vous gérerez;)
- Les abonnés doivent recevoir les paramètres réseau via DHCP
- Le réseau est diversifié. Il s'agit d'un équipement PON et de commutateurs ordinaires avec l'option 82 configurée et une base WiFi avec des points
- Si les données ne relèvent d'aucune des conditions de délivrance de l'IP, il est nécessaire d'émettre l'IP à partir du réseau «invité»
Du bon: il y a un serveur sur FreeBSD qui peut "fonctionner", mais il est "loin";), ce n'est pas "juste sur ce réseau".
Il y a aussi un merveilleux appareil Mikrotik. Le schéma de réseau général est quelque chose comme ceci:

Après un peu de réflexion, il a été décidé d'utiliser les abonnés FreeRadius pour définir les paramètres réseau. En principe, le schéma est habituel: sur Microtick on allume le serveur DHCP, sur lui le même Radius Client. Nous configurons un tas de serveurs DHCP -> Radius Client -> Radius server.
Cela ne semble pas difficile. Mais! Le diable est dans les détails. À savoir:
- Lorsque PON OLT est autorisé selon ce schéma, une demande est envoyée à FreeRadius avec un nom d'utilisateur égal à l'adresse MAC de la station principale, Agent-Circuit-Id égal au MAC PON Onu et un mot de passe vide.
- Lors de l'autorisation avec des commutateurs avec l'option 82, une demande est envoyée à FreeRadius avec un nom d'utilisateur vide égal au périphérique MAC de l'abonné et les attributs supplémentaires Agent-Circuit-Id et Agent-Remote-Id contenant, encore une fois, le commutateur de relais MAC et le port auquel l'abonné est connecté.
- Certains abonnés avec des points WiFI sont autorisés via les protocoles PAP-CHAP
- Certains abonnés avec des points WIFI sont autorisés avec un nom d'utilisateur égal à l'adresse MAC du point WIFI, sans mot de passe.
Contexte historique: qu'est-ce que l'option 82 pour DHCP
Ce sont des options supplémentaires pour le protocole DHCP qui vous permettent de transférer des informations supplémentaires, par exemple, dans les champs Agent-Circuit-Id et Agent-Remote-Id. Il est généralement utilisé pour transmettre l'adresse MAC du commutateur de relais et le port auquel l'abonné est connecté. Dans le cas d'un équipement PON ou de stations de base WIFI, le champ Agent-Circuit-Id ne contient pas d'informations utiles (il n'y a pas de port d'abonné). Dans ce cas, le schéma général de DHCP dans ce cas est le suivant:

Pas à pas, ce schéma fonctionne comme ceci:
- L'équipement d'abonné effectue une demande de diffusion DHCP pour les paramètres réseau
- Le périphérique (par exemple, un commutateur, une station de base WiFi ou PON) auquel l'équipement d'abonné est directement connecté «intercepte» ce paquet et le modifie, y introduisant les options supplémentaires de l'option 82 et de l'adresse IP de l'agent de relais, et le transfère plus loin sur le réseau.
- Le serveur DHCP accepte la demande, forme une réponse et l'envoie au périphérique relais
- Le dispositif relais transmet le paquet de réponse au dispositif abonné
Donc, tout cela ne fonctionne tout simplement pas, bien sûr, vous avez besoin de la configuration appropriée de l'équipement réseau.
Installez FreeRadius
Avec les paramètres de configuration de FreeRadius, bien sûr, vous pouvez réaliser tout cela, mais c'est difficile et pas clair ... surtout lorsque vous espionnez après N mois "tout fonctionne". Par conséquent, il a été décidé d'écrire votre module d'autorisation pour FreeRadius en Python. Nous prendrons les données pour autorisation de la base de données MySQL. Cela n'a aucun sens de décrire sa structure, de toute façon, tout le monde le fera «pour lui-même». En particulier, j'ai pris la structure proposée avec le module sql pour FreeRadius, et l'ai légèrement modifiée en ajoutant les champs mac et port pour chaque abonné, en plus du mot de passe de connexion.
Donc, pour commencer, installez FreeRadius:
cd /usr/ports/net/freeradius3 make config make install clean
Dans les paramètres, nous marquons pour l'installation:

Nous faisons un lien symbolique vers le module python (c'est-Ă -dire, allumez-le):
ln -s /usr/local/etc/raddb/mods-available/python /usr/local/etc/raddb/mods-enabled
Installez un module supplémentaire pour python:
pip install mysql-connector
Dans les paramètres du module python pour FreeRadius, vous devez spécifier les chemins de recherche du module dans la variable python_path. Par exemple, j'ai ceci:
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"
Les chemins peuvent être trouvés en exécutant l'interpréteur python et en entrant les commandes:
root@phaeton:/usr/local/etc/raddb/mods-enabled
Si vous ne suivez pas cette étape, les scripts écrits en python et exécutés par FreeRadius ne trouveront pas les modules répertoriés dans l'importation. De plus, il est nécessaire de décommenter les fonctions d'autorisation et de comptabilité dans les paramètres du module. Par exemple, ce module ressemble à ceci:
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} }
Le script work.py (et tous les autres) doit être placé dans / usr / local / etc / raddb / mods-config / python Il y a trois scripts au total.
Comme vous pouvez le voir dans le code, nous essayons par tous les moyens disponibles d'identifier l'abonné par ses adresses MAC d'abonné bien connues ou un tas d'Option 82, et si cela ne fonctionne pas, nous émettrons la plus ancienne adresse IP utilisée à partir du réseau `` invité ''. Il reste à configurer le script par défaut dans le dossier sites-activé afin que les fonctions nécessaires du script python se contracter aux moments indiqués. En fait, il suffit de mettre le fichier au format:
défaut 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 } }
Nous essayons d'exécuter et de voir ce qui vole dans le journal de débogage:
/usr/local/etc/rc.d/radiusd debug
Quoi d'autre. Lors de la configuration de FreeRadius, il est pratique de tester son fonctionnement Ă l'aide de l'utilitaire radclient. Par exemple autorisation:
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
Ou comptabilité:
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
Je tiens à vous avertir qu’il est impossible d’utiliser un schéma et des scripts similaires «sans modifications» à une échelle «industrielle». Au moins frappant:
- possible "fausse" adresse MAC. Il suffit que l'abonné enregistre un MAC étranger pour lui-même et il y aura des problèmes
- la logique d'émission des réseaux d'invités est au-dessous de toute critique. Il n'y a même pas de contrôle "pouvez-vous déjà avoir des clients avec une telle adresse IP?"
C’est juste une «solution sur le genou» afin de travailler spécifiquement dans mes conditions, rien de plus. Ne jugez pas strictement;)