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:
- 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_pendingcímlistára kerül. - 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>?”
- 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_pendinglistáról: a tűzfalblokk megszűnik, a forgalom elindul. - 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
- 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.
- Másolja ki az alkalmazás Access ID-jét (egy UUID); ezt fogja a 4. lépésben a routerszkriptbe illeszteni.
- 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.
- 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. - A Scripts lapon illessze be az alábbi On Up szkriptet (a
PppProfileScript.luafájlból) az On Up mezőbe, két értéket a saját környezetére cserélve: azntkHosta Notakey-szerver hosztneve (https://nélkül), azntkAccessIdpedig 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_pendinglistá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.