2025. november 12.

MikroTik VPN 2FA: a teljes szkriptalapú beállítás

Lépésről lépésre: kétfaktoros, telefonos érintéssel jóváhagyott hitelesítés MikroTik VPN-hez pusztán RouterOS-szkriptekkel, RADIUS-szerver nélkül.

Ez az útmutató egy sima MikroTik VPN-től vezet el odáig, hogy minden bejelentkezést egy érintéssel jóvá kelljen hagyni a Notakey Authenticator alkalmazásban, pusztán RouterOS-szkriptekkel. Ebben a felállásban nincs RADIUS-szerver, nincs auth-proxy, és a már meglévő routeren kívül semmit sem kell a hálózatába telepítenie.

Minden szkript a hivatalos notakey/mikrotik-2fa-vpn tárolóból származik.

Hogyan működik

Ha átlátja a folyamatot, minden alábbi lépés magától értetődővé válik:

  1. A felhasználó a megszokott módon csatlakozik a VPN-hez, és felhasználónévvel-jelszóval hitelesít. A PPP-munkamenet felépül, de a tűzfal azonnal blokkolja a teljes forgalmát, mert a címe a vpn_pending címlistára kerül.
  2. Elindul a PPP-profil up szkriptje. Ez meghívja a Notakey Authentication Servert, amely jóváhagyási kérést küld a felhasználó telefonjára: “Log in as <user> from <caller IP>?”
  3. Ha a felhasználó az időkorláton belül (60 másodperc) jóváhagyja, a szkript leveszi a címét a vpn_pending listáról: a tűzfalblokk megszűnik, a forgalom elindul.
  4. Ha a felhasználó elutasítja, vagy a kérés lejár, a szkript bontja a PPP-munkamenetet. A jelszó önmagában sosem volt elég.

Előfeltételek

  • RouterOS 6.46.4 vagy újabb (a szkriptek RouterOS 7.x-en is futnak).
  • Működő PPP-alapú VPN a routeren (L2TP/IPsec, PPTP vagy SSTP), amelyhez a felhasználók már most tudnak felhasználónévvel és jelszóval csatlakozni.
  • Egy a routerről elérhető Notakey Authentication Server. Az ingyenes felhős csomag a signup.notakey.com címen elegendő (az első 6 felhasználó ingyenes), vagy futtathatja az on-premise készüléket (az első 10 felhasználó ingyenes).
  • Egy iOS- vagy Android-telefon a Notakey Authenticator alkalmazással.

1. lépés: Készítse elő a Notakey-oldalt

  1. A Notakey irányítópultján hozzon létre új alkalmazást (szolgáltatást) a VPN-hez. Adjon neki jól felismerhető nevet, pl. “Office VPN”; a felhasználók ezt a nevet látják a telefonjukon.
  2. Másolja ki az alkalmazás Access ID-jét (egy UUID); ezt fogja a 4. lépésben a routerszkriptbe illeszteni.
  3. Hozza létre a felhasználót (vagy csatlakoztassa a felhasználói forrását), állítson be regisztrációs követelményt, majd regisztrálja a telefont: telepítse a Notakey Authenticatort, adja hozzá a szolgáltatását, és fejezze be a folyamatot.

A Notakey-beli felhasználónévnek pontosan egyeznie kell a VPN-felhasználónévvel: a routerszkript a PPP-felhasználónév alapján címzi a push értesítést. Ha a routeren john, a Notakey-ben pedig john.doe szerepel, a folyamat mindenféle hibajelzés nélkül hiúsul meg.

2. lépés: Telepítse a JParseFunctions könyvtárat

A RouterOS-szkriptek natívan nem tudnak JSON-t értelmezni; ezt a hiányt pótolja ez a könyvtár (a mikrotik-json-parser projektből).

A WinBoxban vagy a WebFigben nyissa meg a System → Scripts menüt, hozzon létre egy pontosan JParseFunctions nevű új szkriptet, a policy jelölőnégyzeteket hagyja alapértelmezetten (nincs szükség külön jogosultságra), és illessze be a projekt JParseFunctions fájljának teljes tartalmát.

3. lépés: Telepítse a NotakeyFunctions könyvtárat

Ugyanez az eljárás: hozzon létre egy második, pontosan NotakeyFunctions nevű szkriptet, és illessze be a Notakey-tárolóból a NotakeyFunctions.lua tartalmát. Ez az a kliens, amely a Notakey API-val beszél: létrehozza a hitelesítési kérést, és lekérdezi a felhasználó válaszát.

A szkriptnevek nem mellékesek: a következő lépés profilszkriptje név szerint tölti be mindkét könyvtárat.

4. lépés: Kapcsolja az up/down szkripteket egy PPP-profilhoz

Nyissa meg a VPN PPP-profilját (PPP → Profiles), vagy hozzon létre egy külön profilt, hogy a tesztelés alatt a 2FA csak a kiválasztott felhasználókra vonatkozzon.

  1. A General lapon állítsa az Address List mezőt vpn_pending értékre. Ezzel minden, ezt a profilt használó új kapcsolat címe a munkamenet felépülésének pillanatában erre a listára kerül.
  2. A Scripts lapon illessze be az alábbi On Up szkriptet (a PppProfileScript.lua fájlból) az On Up mezőbe, két értéket a saját környezetére cserélve: az ntkHost a Notakey-szerver hosztneve (https:// nélkül), az ntkAccessId pedig az 1. lépésben kimásolt alkalmazás-Access ID.
{
    :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
}

Az ugyanabban a fájlban található On Down szkript csupán a lecsatlakozást naplózza; illessze be az On Down mezőbe a rendezett naplókért, vagy hagyja ki.

A jóváhagyási időkorlát (authTtl) 60 másodperc: elég hosszú ahhoz, hogy a telefont elő lehessen venni a zsebből, és elég rövid ahhoz, hogy egy elakadt bejelentkezés ne tartson életben félig nyitott munkamenetet a végtelenségig.

5. lépés: Vegye fel a tűzfalszabályokat

A drop szabály teszi a várólistát valódi korláttá:

/ip firewall filter
add chain=forward src-address-list=vpn_pending action=drop \
    comment="Block VPN clients pending 2FA approval"

Helyezze az általános VPN-engedélyező szabályok fölé, hogy a jóváhagyásra várakozás alatt ez érvényesüljön. Ha a VPN-klienseknek magát a routert sem szabad elérniük, tükrözze a szabályt az input láncban is.

Egy különleges eset: ha a jóváhagyás ugyanazon az eszközön történik, amely a VPN-t hívja (vagyis maga a telefon a VPN-kliens), a jóváhagyási forgalomnak el kell érnie a Notakey-szervert, miközben minden más még blokkolva van. Vegyen fel egy accept szabályt a drop fölé:

/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"

(Ha a jóváhagyás egy második eszközön történik, vagyis a telefon hagy jóvá, miközben a laptop hívja a VPN-t, nincs szükség külön szabályra: a Notakey API-t maga a router kérdezi le, a saját forgalmára pedig nem vonatkozik a forward lánc.)

6. lépés: Rendelje hozzá a profilt, és tesztelje

Irányítsa a VPN-felhasználóját (PPP → Secrets) a 4. lépésben létrehozott profilra, majd csatlakozzon a VPN-hez egy kliensről:

  • Az alagút felépül, de semmi sem közlekedik rajta: Ön a vpn_pending listán van.
  • Egy-két másodpercen belül megérkezik a push értesítés a telefonra.
  • Jóváhagyás → a forgalom elindul. Elutasítás vagy figyelmen kívül hagyás → az időtúllépés után a szkript bontja a munkamenetet.

Kövesse az eseményeket a Log ablakban (a szkriptek minden kérést és kimenetelt naplóznak), valamint az IP → Firewall → Address Lists alatt, ahol a kliens címe megjelenik a vpn_pending listán, jóváhagyáskor pedig eltűnik onnan.

Hibaelhárítás

  • Nem érkezik push: szinte mindig felhasználónév-eltérés a PPP Secrets és a Notakey szolgáltatás között, vagy a telefont sosem regisztrálták éppen ehhez az alkalmazáshoz.
  • A push megérkezik, de nem lehet jóváhagyni: valószínűleg ugyanarról az eszközről próbál jóváhagyni, amely a VPN-t hívja, és a várólistás drop szabály blokkolja a jóváhagyási forgalmat. Vegye fel az 5. lépésben szereplő accept szabályt, vagy hagyja jóvá olyan eszközről, amely nincs az alagútban.
  • A kérés szövege hibásan jelenik meg, vagy a kérés meghiúsul: a JSON-értelmező könyvtár nem birkózik meg a zárójelekkel (és esetleg más különleges írásjelekkel) a hitelesítési üzenetben. Tartsa az üzenet szövegét egyszerűnek.
  • Az egyik felhasználónál működik, a másiknál nem: ellenőrizze a második felhasználó profil-hozzárendelését; a védelem csak a 2FA-profilra mutató secreteknél lép életbe.

Hogyan illeszkedik az összképbe

Ez a szkriptalapú megoldás a leggyorsabb út a MikroTik VPN 2FA-hoz, és semmilyen további infrastruktúrát nem igényel. Ha később kinövi (sok router, más VPN-gyártók vagy központi szabályozás), ugyanaz a Notakey-szerver támogatja a RADIUS-alapú felállást is, amelyben a jóváhagyási folyamatot routerszkriptek helyett egy auth-proxy kezeli.

← Minden bejegyzés

Az első jelszó nélküli bejelentkezés már ezen a héten

30 perces beszélgetés egy mérnökkel – nem értékesítési prezentáció. Közösen megtervezzük, hogyan indulhat el egy működő pilotprojekt az Ön VPN-, SSO- vagy Windows-környezetében.