Die Aufgabe ist angekommen, die Ausgabe von IP-Adressen an Abonnenten zu arrangieren. Aufgabenbedingungen:
- Wir werden keinen separaten Server zur Autorisierung geben - Sie werden verwalten;)
- Teilnehmer müssen Netzwerkeinstellungen über DHCP erhalten
- Das Netzwerk ist vielfältig. Dies sind PON-Geräte und normale Switches mit konfigurierter Option 82 und WiFi-Basis mit Punkten
- Wenn Daten nicht unter eine der Bedingungen für die Ausgabe von IP fallen, muss IP über das "Gast" -Netzwerk ausgegeben werden
Vom Guten: Es gibt einen Server unter FreeBSD, der "funktionieren" kann, aber "weit weg" ist;), nicht "direkt in diesem Netzwerk".
Es gibt auch ein wunderbares Mikrotik-Gerät. Das allgemeine Netzwerkdiagramm sieht ungefähr so aus:

Nach einigem Überlegen wurde beschlossen, FreeRadius-Abonnenten zu verwenden, um Netzwerkeinstellungen vorzunehmen. Im Prinzip ist das Schema das übliche: Auf Microtick schalten wir den DHCP-Server ein, darauf denselben Radius-Client. Wir konfigurieren eine Reihe von DHCP-Servern -> Radius-Client -> Radius-Server.
Es scheint nicht schwierig zu sein. Aber! Der Teufel steckt im Detail. Nämlich:
- Wenn PON OLT gemäß diesem Schema autorisiert ist, wird eine Anfrage an FreeRadius gesendet, deren Benutzername der MAC-Adresse der Kopfstation, die Agent-Circuit-ID dem PON Onu MAC und ein leeres Kennwort entspricht.
- Bei der Autorisierung mit Switches mit Option 82 kommt eine Anfrage an FreeRadius mit einem leeren Benutzernamen, der dem MAC-Gerät des Teilnehmers entspricht, und den zusätzlichen Attributen Agent-Circuit-ID und Agent-Remote-ID, die wiederum den Relay-Switch-MAC und den Port enthalten, mit dem der Teilnehmer verbunden ist.
- Einige Teilnehmer mit WiFI-Punkten sind über PAP-CHAP-Protokolle autorisiert
- Einige Teilnehmer mit WIFI-Punkten haben eine Berechtigung mit einem Benutzernamen, der der MAC-Adresse des WIFI-Punkts entspricht, ohne Kennwort.
Historischer Hintergrund: Was ist Option 82 für DHCP?
Dies sind zusätzliche Optionen für das DHCP-Protokoll, mit denen Sie zusätzliche Informationen übertragen können, z. B. in den Feldern Agent-Circuit-ID und Agent-Remote-ID. Es wird normalerweise verwendet, um die MAC-Adresse des Relaisschalters und den Port, an den der Teilnehmer angeschlossen ist, zu übertragen. Bei PON-Geräten oder WIFI-Basisstationen enthält das Feld Agent-Circuit-Id keine nützlichen Informationen (es gibt keinen Teilnehmerport). In diesem Fall lautet das allgemeine Schema von DHCP in diesem Fall wie folgt:

Schritt für Schritt funktioniert dieses Schema folgendermaßen:
- Teilnehmergeräte stellen eine Broadcast-DHCP-Anforderung für Netzwerkeinstellungen
- Das Gerät (z. B. ein Switch, eine WiFi- oder PON-Basisstation), mit dem das Teilnehmergerät direkt verbunden ist, „fängt“ dieses Paket ab und ändert es, indem es die zusätzlichen Optionen für Option 82 und die IP-Adresse des Relay-Agenten einführt und es weiter über das Netzwerk überträgt.
- Der DHCP-Server akzeptiert die Anforderung, bildet eine Antwort und sendet sie an das Relay-Gerät
- Das Relaisgerät leitet das Antwortpaket an das Teilnehmergerät weiter
All dies funktioniert einfach nicht. Natürlich benötigen Sie die entsprechende Konfiguration der Netzwerkgeräte.
Installieren Sie FreeRadius
Mit den FreeRadius-Konfigurationseinstellungen können Sie dies natürlich erreichen, aber es ist schwierig und nicht klar ... besonders wenn Sie nach N Monaten "alles funktioniert". Daher wurde beschlossen, Ihr Autorisierungsmodul für FreeRadius in Python zu schreiben. Wir werden die Daten zur Autorisierung aus der MySQL-Datenbank entnehmen. Es macht keinen Sinn, seine Struktur zu beschreiben, jedenfalls wird es jeder "für sich" tun. Insbesondere habe ich die mit dem SQL-Modul für FreeRadius vorgeschlagene Struktur übernommen und sie geringfügig geändert, indem ich zusätzlich zum Anmeldekennwort das Mac- und das Portfeld für jeden Abonnenten hinzugefügt habe.
Installieren Sie zunächst FreeRadius:
cd /usr/ports/net/freeradius3 make config make install clean
In den Einstellungen markieren wir für die Installation:

Wir stellen einen Symlink zum Python-Modul her (dh schalten Sie es ein):
ln -s /usr/local/etc/raddb/mods-available/python /usr/local/etc/raddb/mods-enabled
Installieren Sie ein zusätzliches Modul für Python:
pip install mysql-connector
In den Python-Moduleinstellungen für FreeRadius müssen Sie die Modul-Suchpfade in der Variablen python_path angeben. Zum Beispiel habe ich Folgendes:
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"
Die Pfade können gefunden werden, indem Sie den Python-Interpreter ausführen und die folgenden Befehle eingeben:
root@phaeton:/usr/local/etc/raddb/mods-enabled
Wenn Sie diesen Schritt nicht ausführen, finden in Python geschriebene und von FreeRadius ausgeführte Skripte nicht die Module, die beim Import aufgelistet sind. Darüber hinaus müssen die Berechtigungs- und Abrechnungsfunktionen in den Moduleinstellungen auskommentiert werden. Dieses Modul sieht beispielsweise folgendermaßen aus:
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} }
Das Skript work.py (und alle anderen) muss in / usr / local / etc / raddb / mods-config / python abgelegt werden. Insgesamt gibt es drei Skripte.
Wie Sie dem Code entnehmen können, versuchen wir mit allen verfügbaren Mitteln, den Teilnehmer anhand seiner offensichtlich bekannten Teilnehmer-MAC-Adressen oder des Option 82-Bundles zu identifizieren. Wenn dies nicht funktioniert, geben wir die älteste vom Gastnetzwerk verwendete IP-Adresse aus. Das Standardskript muss weiterhin im Ordner "sites-enabled" konfiguriert werden, damit die erforderlichen Funktionen des Python-Skripts zu den angegebenen Zeiten zucken. Tatsächlich reicht es aus, die Datei in das Formular zu bringen:
Standard 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 } }
Wir versuchen zu laufen und zu sehen, was zum Debug-Protokoll fliegt:
/usr/local/etc/rc.d/radiusd debug
Was sonst. Beim Einrichten von FreeRadius ist es praktisch, den Betrieb mit dem Dienstprogramm radclient zu testen. Zum Beispiel Autorisierung:
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
Oder Buchhaltung:
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
Ich möchte warnen, dass es unmöglich ist, ein ähnliches Schema und Skripte "ohne Änderungen" im "industriellen" Maßstab zu verwenden. Zumindest auffällig:
- mögliche "gefälschte" MAC-Adresse. Es reicht aus, wenn der Teilnehmer einen ausländischen MAC für sich registriert, und es wird Probleme geben
- Die Logik der Herausgabe von Gastnetzwerken ist unter allen Kritikpunkten. Es wird nicht einmal überprüft, ob Sie bereits Clients mit einer solchen IP-Adresse haben können.
Es ist nur eine "Lösung auf dem Knie", um speziell unter meinen Bedingungen zu arbeiten, nichts weiter. Nicht streng beurteilen;)