Diese Anleitung führt Sie von einem gewöhnlichen MikroTik-VPN zu einem, bei dem jede Anmeldung per Fingertipp in der Notakey Authenticator App bestätigt werden muss – allein mit RouterOS-Skripten. In diesem Setup gibt es keinen RADIUS-Server, keinen Auth-Proxy und außer dem Router, den Sie ohnehin haben, nichts, das in Ihrem Netz zu betreiben wäre.
Alle Skripte stammen aus dem offiziellen Repository
notakey/mikrotik-2fa-vpn.
So funktioniert es
Wer den Ablauf versteht, dem erschließt sich jeder der folgenden Schritte von selbst:
- Der Benutzer wählt sich wie gewohnt mit Benutzernamen und Passwort ins VPN
ein. Die PPP-Sitzung kommt zustande, doch die Firewall blockiert sofort
den gesamten Verkehr des Benutzers, weil seine Adresse in der Adressliste
vpn_pendinglandet. - Das Up-Skript des PPP-Profils wird ausgelöst. Es ruft Ihren Notakey Authentication Server auf, der eine Freigabeanfrage an das Telefon des Benutzers sendet: „Log in as <user> from <caller IP>?“
- Bestätigt der Benutzer innerhalb des Timeouts (60 Sekunden), entfernt
das Skript seine Adresse aus
vpn_pending: Die Firewall-Sperre fällt weg und der Verkehr fließt. - Lehnt der Benutzer ab oder läuft die Anfrage ab, beendet das Skript die PPP-Sitzung. Das Passwort allein hat nie ausgereicht.
Voraussetzungen
- RouterOS 6.46.4 oder neuer (die Skripte laufen auch unter RouterOS 7.x).
- Ein funktionierendes PPP-basiertes VPN auf dem Router (L2TP/IPsec, PPTP oder SSTP), mit dem sich die Benutzer bereits per Benutzername und Passwort verbinden können.
- Ein vom Router aus erreichbarer Notakey Authentication Server. Das kostenlose Cloud-Angebot unter signup.notakey.com genügt (die ersten 6 Benutzer sind kostenlos), alternativ betreiben Sie die On-Premise-Appliance (die ersten 10 Benutzer kostenlos).
- Ein iOS- oder Android-Telefon mit der Notakey Authenticator App.
Schritt 1: Notakey-Seite vorbereiten
- Legen Sie im Notakey-Dashboard eine neue Anwendung (einen Dienst) für das VPN an und geben Sie ihr einen wiedererkennbaren Namen, z. B. „Office VPN“; diesen Namen sehen die Benutzer auf ihrem Telefon.
- Kopieren Sie die Access ID der Anwendung (eine UUID); Sie fügen sie in Schritt 4 in das Router-Skript ein.
- Legen Sie den Benutzer an (oder binden Sie Ihre Benutzerquelle an) und konfigurieren Sie eine Registrierungsanforderung; registrieren Sie dann das Telefon: Notakey Authenticator installieren, den Dienst hinzufügen und die Registrierung abschließen.
Der Benutzername in Notakey muss exakt mit dem VPN-Benutzernamen
übereinstimmen, denn das Router-Skript adressiert die Push-Benachrichtigung
über den PPP-Benutzernamen. Mit john auf dem Router und john.doe in
Notakey schlägt die Anmeldung ohne jede Fehlermeldung fehl.
Schritt 2: JParseFunctions-Bibliothek installieren
RouterOS-Skripte können JSON nicht nativ parsen; diese Bibliothek (aus dem Projekt mikrotik-json-parser) schließt die Lücke.
Öffnen Sie in WinBox oder WebFig System → Scripts, legen Sie ein neues
Skript mit dem exakten Namen JParseFunctions an, lassen Sie die
Policy-Kontrollkästchen auf den Voreinstellungen (es sind keine besonderen
Rechte nötig) und fügen Sie den vollständigen Inhalt der Datei
JParseFunctions
aus jenem Projekt ein.
Schritt 3: NotakeyFunctions-Bibliothek installieren
Gleiches Vorgehen: Legen Sie ein zweites Skript mit dem exakten Namen
NotakeyFunctions an und fügen Sie den Inhalt von
NotakeyFunctions.lua
aus dem Notakey-Repository ein. Das ist der Client, der mit der Notakey-API
spricht: Er erzeugt die Authentifizierungsanfrage und fragt die Antwort des
Benutzers ab.
Die Skriptnamen sind wichtig: Das Profilskript im nächsten Schritt lädt beide Bibliotheken über ihren Namen.
Schritt 4: Up-/Down-Skripte an ein PPP-Profil hängen
Öffnen Sie das PPP-Profil Ihres VPN (PPP → Profiles), oder legen Sie ein eigenes an, damit die 2FA während der Testphase nur für ausgewählte Benutzer gilt.
- Setzen Sie auf dem Reiter General die Option Address List auf
vpn_pending. Jede neue Verbindung mit diesem Profil bekommt ihre Adresse nun in dem Moment in diese Liste eingetragen, in dem die Sitzung zustande kommt. - Fügen Sie auf dem Reiter Scripts das folgende On Up-Skript (aus
PppProfileScript.lua) in das Feld On Up ein und passen Sie zwei Werte an Ihre Umgebung an:ntkHost, den Hostnamen Ihres Notakey-Servers (ohnehttps://), undntkAccessId, die in Schritt 1 kopierte Access ID der Anwendung.
{
:local localAddr $"local-address";
:local remoteAddr $"remote-address";
:local callerId $"caller-id";
:local calledId $"called-id";
:log info "$user (srcIp=$callerId, dstIp=$calledId) connected: was given $remoteAddr IP (GW $localAddr)";
/system script run "JParseFunctions";
:global JSONUnload;
/system script run "NotakeyFunctions";
:global NtkAuthRequest;
:global NtkWaitFor;
:global NtkUnload;
# Change values below to match your Notakey installation
:local ntkHost "demo.notakey.com";
:local ntkAccessId "12345645-b32b-4788-a00d-251cd7dc9a03";
# Custom message in authentication request
:local authDescMsg "Log in as $user from $callerId\?";
:local ntkAuthUuid ([$NtkAuthRequest host=$ntkHost accessId=$ntkAccessId authUser=$user authTitle="VPN connection" authDesc=$authDescMsg authTtl=60]);
:if ([$NtkWaitFor uuid=$ntkAuthUuid host=$ntkHost accessId=$ntkAccessId]) do={
# Remove blocking rule after successful 2FA authentication
/ip firewall address-list remove [/ip firewall address-list find where list=vpn_pending address=$remoteAddr]
} else={
:log info "VPN 2FA authentication failure for user $user from IP $callerId";
# Disconnect active session with this IP and user
/ppp active remove [/ppp active find name="$user" address="$remoteAddr"]
}
$NtkUnload
$JSONUnload
}
Das On Down-Skript aus derselben Datei protokolliert lediglich die Trennung. Fügen Sie es für saubere Logs in das Feld On Down ein, oder lassen Sie es weg.
Das Freigabe-Timeout (authTtl) beträgt 60 Sekunden: lang genug, um das
Telefon aus der Tasche zu holen, und kurz genug, dass eine hängende Anmeldung
keine halboffene Sitzung endlos festhält.
Schritt 5: Firewall-Regeln hinzufügen
Erst die Drop-Regel gibt der Pending-Liste ihre Wirkung:
/ip firewall filter
add chain=forward src-address-list=vpn_pending action=drop \
comment="Block VPN clients pending 2FA approval"
Platzieren Sie sie oberhalb Ihrer allgemeinen VPN-Erlaubnisregeln, damit sie
greift, solange die Freigabe aussteht. Sollen VPN-Clients auch den Router
selbst nicht erreichen, spiegeln Sie die Regel in der input-Chain.
Ein Sonderfall: Erfolgt die Freigabe auf demselben Gerät, das sich ins VPN einwählt – das Telefon ist selbst der VPN-Client –, muss der Freigabeverkehr den Notakey-Server erreichen können, während alles andere noch blockiert ist. Fügen Sie oberhalb der Drop-Regel eine Accept-Regel ein:
/ip firewall filter
add chain=forward src-address-list=vpn_pending dst-address=<notakey-server-ip> \
action=accept comment="Let pending clients reach Notakey for approval"
(Die Freigabe von einem zweiten Gerät aus, wenn das Telefon bestätigt,
während sich ein Laptop einwählt, braucht keine zusätzliche Regel: Der Router
fragt die Notakey-API selbst ab, und sein eigener Verkehr unterliegt nicht
der forward-Chain.)
Schritt 6: Profil zuweisen und testen
Weisen Sie Ihrem VPN-Benutzer (PPP → Secrets) das Profil aus Schritt 4 zu und wählen Sie sich dann von einem Client ins VPN ein:
- Der Tunnel steht, aber nichts wird geroutet, denn Ihre Adresse steht in
vpn_pending. - Innerhalb von ein, zwei Sekunden erscheint die Push-Benachrichtigung auf dem Telefon.
- Bestätigen → der Verkehr beginnt zu fließen. Ablehnen oder ignorieren → nach dem Timeout wird die Sitzung getrennt.
Verfolgen Sie den Ablauf im Log (die Skripte protokollieren jede Anfrage
samt Ergebnis) und unter IP → Firewall → Address Lists: Dort taucht die
Adresse des Clients in vpn_pending auf und verschwindet bei der Freigabe
wieder.
Fehlerbehebung
- Es kommt kein Push an. Fast immer stimmen die Benutzernamen in PPP Secrets und im Notakey-Dienst nicht überein, oder das Telefon wurde nie für genau diese Anwendung registriert.
- Der Push kommt an, lässt sich aber nicht bestätigen. Vermutlich bestätigen Sie auf demselben Gerät, das sich ins VPN einwählt, und die Drop-Regel der Pending-Liste blockiert den Freigabeverkehr. Fügen Sie die Accept-Regel aus Schritt 5 hinzu, oder bestätigen Sie von einem Gerät außerhalb des Tunnels.
- Der Anfragetext wirkt verstümmelt oder die Anfrage schlägt fehl. Die JSON-Parser-Bibliothek kommt mit Klammern (und womöglich weiteren Sonderzeichen) im Authentifizierungstext nicht zurecht. Halten Sie den Nachrichtentext schlicht.
- Funktioniert bei einem Benutzer, beim anderen nicht. Prüfen Sie die Profilzuweisung des zweiten Benutzers; nur Secrets, die auf das 2FA-Profil zeigen, durchlaufen den Ablauf.
Einordnung
Der skriptbasierte Ansatz ist der schnellste Weg zu MikroTik-VPN-2FA und kommt ohne zusätzliche Infrastruktur aus. Wächst Ihre Umgebung später darüber hinaus (viele Router, VPNs anderer Hersteller oder zentrale Richtlinien), unterstützt derselbe Notakey-Server auch ein RADIUS-basiertes Setup, bei dem ein Auth-Proxy statt der Router-Skripte den Freigabeablauf übernimmt.