12. November 2025

MikroTik-VPN-2FA – das komplette skriptbasierte Setup

Schritt für Schritt: Zwei-Faktor-Authentifizierung per Fingertipp für ein MikroTik-VPN, allein mit RouterOS-Skripten, ganz ohne RADIUS-Server.

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:

  1. 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_pending landet.
  2. 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>?“
  3. 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.
  4. 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

  1. 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.
  2. Kopieren Sie die Access ID der Anwendung (eine UUID); Sie fügen sie in Schritt 4 in das Router-Skript ein.
  3. 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.

  1. 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.
  2. 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 (ohne https://), und ntkAccessId, 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.

← Alle Artikel

Ihre erste passwortlose Anmeldung – noch diese Woche

30 Minuten mit einem Ingenieur statt einer Vertriebspräsentation. Gemeinsam planen wir, wie in Ihrer VPN-, SSO- oder Windows-Umgebung ein funktionierendes Pilotprojekt an den Start geht.