See juhend viib teid tavalisest MikroTiku VPN-ist lahenduseni, kus iga sisselogimine tuleb kinnitada puudutusega Notakey Authenticatori rakenduses, kasutades ainuüksi RouterOS-i skripte. Selles lahenduses pole RADIUS-serverit ega autentimisproksit ning teie võrku pole vaja paigaldada midagi peale ruuteri, mis teil juba olemas on.
Kõik skriptid pärinevad ametlikust
notakey/mikrotik-2fa-vpn
hoidlast.
Kuidas see töötab
Kui töövoog on selge, muutub iga allolev samm iseenesestmõistetavaks:
- Kasutaja loob VPN-ühenduse ja autendib nagu tavaliselt kasutajanime ja
parooliga. PPP-seanss tõuseb üles, kuid tulemüür blokeerib kohe kogu tema
liikluse, sest tema aadress satub aadressiloendisse
vpn_pending. - Käivitub PPP-profiili up-skript. See pöördub teie Notakey autentimisserveri poole, mis saadab kasutaja telefoni kinnituspäringu: “Log in as <user> from <caller IP>?”
- Kui kasutaja kinnitab ajalimiidi (60 sekundi) jooksul, eemaldab skript
tema aadressi loendist
vpn_pending: tulemüüri blokk kaob ja liiklus hakkab liikuma. - Kui kasutaja keelab päringu või see aegub, katkestab skript PPP-seansi. Ainult paroolist ei piisanud kordagi.
Eeldused
- RouterOS 6.46.4 või uuem (skriptid töötavad ka RouterOS 7.x peal).
- Töötav PPP-põhine VPN ruuteris (L2TP/IPsec, PPTP või SSTP), millega kasutajad saavad juba kasutajanime ja parooliga ühenduda.
- Ruuterist kättesaadav Notakey Authentication Server (autentimisserver). Piisab tasuta pilvepaketist aadressil signup.notakey.com (esimesed 6 kasutajat tasuta) või käivitage kohapealne seade (esimesed 10 kasutajat tasuta).
- iOS-i või Androidi telefon Notakey Authenticatori rakendusega.
Samm 1 – valmistage ette Notakey pool
- Looge Notakey juhtpaneelil VPN-i jaoks uus rakendus (teenus). Andke sellele äratuntav nimi, nt „Kontori VPN“; just seda nime näevad kasutajad oma telefonis.
- Kopeerige rakenduse Access ID (UUID). Kleebite selle sammus 4 ruuteri skripti.
- Looge kasutaja (või ühendage oma kasutajaallikas) ja seadistage registreerimisnõue, seejärel registreerige telefon: paigaldage Notakey Authenticator, lisage oma teenus ja viige registreerimine lõpule.
Kasutajanimi Notakeys peab VPN-i kasutajanimega täpselt kattuma: ruuteri
skript adresseerib tõuketeate PPP kasutajanime järgi. Kui ruuteris on john
ja Notakeys john.doe, ebaõnnestub kõik vaikselt.
Samm 2 – paigaldage JParseFunctionsi teek
RouterOS-i skriptid ei oska JSON-it ise parsida; selle lünga täidab teek projektist mikrotik-json-parser.
Avage WinBoxis või WebFigis System → Scripts, looge uus skript täpse
nimega JParseFunctions, jätke õiguste märkeruudud vaikeseadetele
(eriõigusi pole vaja) ja kleepige sisse sama projekti
JParseFunctions-faili
kogu sisu.
Samm 3 – paigaldage NotakeyFunctionsi teek
Sama protseduur: looge teine skript täpse nimega NotakeyFunctions ja
kleepige sisse Notakey hoidla faili
NotakeyFunctions.lua
sisu. See on klient, mis suhtleb Notakey API-ga, loob autentimispäringu ja
pärib kasutaja vastust.
Skriptide nimed on olulised: järgmise sammu profiiliskript laadib mõlemad teegid nime järgi.
Samm 4 – siduge up/down-skriptid PPP-profiiliga
Avage oma VPN-i PPP-profiil (PPP → Profiles), või looge katsetamise ajaks eraldi profiil, et 2FA kehtiks ainult valitud kasutajatele.
- Määrake vahekaardil General väljale Address List väärtus
vpn_pending. Iga uus seda profiili kasutav ühendus lisatakse nüüd seansi ülestõusmise hetkel sellesse loendisse. - Kleepige vahekaardil Scripts allolev On Up skript (failist
PppProfileScript.lua) väljale On Up, muutes kaht väärtust vastavalt oma keskkonnale:ntkHost, teie Notakey serveri hostinimi (ilmahttps://alguseta), jantkAccessId, sammus 1 kopeeritud rakenduse 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
}
Sama faili On Down skript üksnes logib ühenduse katkemise. Kleepige see korralike logide huvides väljale On Down või jätke vahele.
Kinnituse ajalimiit (authTtl) on 60 sekundit: piisavalt pikk, et telefon
taskust välja võtta, ja piisavalt lühike, et seiskunud sisselogimine ei
hoiaks poolavatud seanssi igavesti üleval.
Samm 5 – lisage tulemüüri reeglid
Just drop-reegel annab ooteloendile tegeliku tähenduse:
/ip firewall filter
add chain=forward src-address-list=vpn_pending action=drop \
comment="Block VPN clients pending 2FA approval"
Paigutage see oma üldistest VPN-i lubavatest reeglitest ettepoole, et see
kinnituse ootamise ajal peale jääks. Kui VPN-i klientidel tuleb blokeerida ka
ligipääs ruuterile endale, lisage sama reegel input-ahelasse.
Üks erijuhtum: kui kinnitus antakse samast seadmest, mis VPN-i ühendust loob (telefon ise ongi VPN-i klient), peab kinnitusliiklus Notakey serverini jõudma ka siis, kui kõik muu on veel blokeeritud. Lisage drop-reegli ette accept-reegel:
/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"
(Kinnitamine teisest seadmest, telefon kinnitab, sülearvuti loob ühendust,
lisareeglit ei vaja: ruuter pärib Notakey API-t ise ja tema enda liiklus
forward-ahelat ei läbi.)
Samm 6 – määrake profiil ja katsetage
Suunake oma VPN-i kasutaja (PPP → Secrets) sammus 4 loodud profiilile ja looge kliendist VPN-ühendus:
- Tunnel saab ühenduse, kuid liiklust ei liigu: olete loendis
vpn_pending. - Sekundi-paari jooksul jõuab tõuketeade telefoni.
- Kinnitage → liiklus hakkab liikuma. Keelake või ignoreerige → pärast ajalimiidi täitumist seanss katkeb.
Toimuvat saab jälgida aknas Log (skriptid logivad iga päringu ja
tulemuse) ning IP → Firewall → Address Lists all, kus kliendi aadress
ilmub loendisse vpn_pending ja kaob kinnitamisel.
Veaotsing
- Tõuketeadet ei tule. Peaaegu alati on põhjuseks kasutajanimede erinevus PPP Secretsi ja Notakey teenuse vahel, või pole telefon just selle rakenduse jaoks registreeritud.
- Tõuketeade tuleb, aga seda ei saa kinnitada. Tõenäoliselt kinnitate samast seadmest, mis VPN-i ühendust loob, ja ooteloendi drop-reegel blokeerib kinnitusliikluse. Lisage sammu 5 accept-reegel või kinnitage seadmest, mis pole tunnelis.
- Päringu tekst on moonutatud või päring ebaõnnestub. JSON-i parsimise teek ei tule autentimisteates toime sulgudega (ja võib-olla ka muude erimärkidega). Hoidke teate tekst lihtne.
- Ühe kasutaja puhul töötab, teise puhul mitte. Kontrollige teise kasutaja profiilimääratlust; erikohtlemise saavad ainult 2FA-profiilile suunatud kirjed (secrets).
Kuidas see tervikusse sobitub
Skriptipõhine lahendus on kiireim tee MikroTiku VPN-i 2FA-ni ega vaja lisataristut. Kui kasvate sellest hiljem välja (palju ruutereid, teiste tootjate VPN-id või keskne poliitika), toetab sama Notakey server ka RADIUS-põhist seadistust, kus kinnitusvoogu haldab ruuteriskriptide asemel autentimisproksi.