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.
Rakendage see kõigile kasutajatele
Profiili määramine ühele kasutajakirjele (secret) on ohutu viis katsetada,
sest 2FA kehtib ainult sellele ühele kasutajale. Kui see toimib, ei pea te
iga kirjet eraldi muutma. Igal PPP-serveril on Default Profile ja see
kehtib kõigile kasutajatele, kelle kirje on endiselt profiilil default.
L2TP puhul leiate selle menüüst PPP → Interface → L2TP Server. Sama
muudatuse saab teha terminalist (WinBoxis New Terminal):
/interface l2tp-server server set default-profile=<your-2fa-profile>
SSTP-l ja PPTP-l on sama seadistus kummalgi oma serverinupu taga. Kirjele endale määratud profiil on serveri vaikeprofiilist ikka tugevam, nii et kasutaja, kelle te teadlikult teisele profiilile suunasite, jääb sellele.
Veaotsing
- Midagi ei juhtu ja logis pole ühtegi päringut. Skript ei käivitunudki, mis tähendab, et ükski ühendus ei kasutanud 2FA-profiili. Profiili loomisest üksi ei piisa: sellele peab osutama kas kasutaja kirje või serveri Default Profile.
- 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, millise
profiili teine kasutaja lõpuks saab. Võimalusi on kaks: kas tema kirje
(secret) osutab 2FA-profiilile või on see profiilil
defaultja serveri Default Profile on 2FA-profiil.
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.