Šis vadovas paprastą MikroTik VPN paverčia tokiu, kuriame kiekvieną prisijungimą reikia patvirtinti paspaudimu Notakey Authenticator programėlėje, naudojant vien RouterOS skriptus. Šioje sąrankoje nėra jokio RADIUS serverio, jokio auth proxy ir nieko, ką reikėtų diegti jūsų tinkle, be jau turimo maršrutizatoriaus.
Visi skriptai paimti iš oficialios
notakey/mikrotik-2fa-vpn
saugyklos.
Kaip tai veikia
Supratus srautą, kiekvienas tolesnis žingsnis tampa akivaizdus:
- Naudotojas jungiasi prie VPN ir, kaip įprasta, autentifikuojasi naudotojo
vardu ir slaptažodžiu. PPP sesija pakyla, bet ugniasienė iš karto
blokuoja visą jo srautą, nes jo adresas patenka į adresų sąrašą
vpn_pending. - Suveikia PPP profilio up skriptas. Jis kreipiasi į jūsų Notakey autentifikavimo serverį, kuris į naudotojo telefoną išsiunčia patvirtinimo užklausą: „Log in as <user> from <caller IP>?“
- Jei naudotojas patvirtina per skirtąjį laiką (60 sekundžių), skriptas
pašalina jo adresą iš
vpn_pending: ugniasienės blokas nuimamas ir srautas teka. - Jei naudotojas atmeta arba užklausos laikas baigiasi, skriptas nutraukia PPP sesiją. Vien slaptažodžio niekada nepakako.
Reikalavimai
- RouterOS 6.46.4 arba naujesnė (skriptai veikia ir su RouterOS 7.x).
- Veikiantis PPP pagrindu sukurtas VPN maršrutizatoriuje (L2TP/IPsec, PPTP arba SSTP), prie kurio naudotojai jau gali jungtis naudotojo vardu ir slaptažodžiu.
- Iš maršrutizatoriaus pasiekiamas Notakey autentifikavimo serveris. Užtenka nemokamo debesijos plano adresu signup.notakey.com (pirmi 6 naudotojai nemokamai) arba paleiskite vietinį įrenginį (pirmi 10 naudotojų nemokamai).
- iOS arba Android telefonas su Notakey Authenticator programėle.
1 žingsnis: paruoškite Notakey pusę
- Notakey valdymo skydelyje sukurkite naują aplikaciją (servisą) VPN. Pavadinkite ją atpažįstamai, pvz., „Biuro VPN“; šį pavadinimą naudotojai matys telefone.
- Nusikopijuokite aplikacijos Access ID (UUID). Jį įklijuosite į maršrutizatoriaus skriptą 4 žingsnyje.
- Sukurkite naudotoją (arba prijunkite savo naudotojų šaltinį), sukonfigūruokite registracijos reikalavimą ir užregistruokite telefoną: įdiekite Notakey Authenticator, pridėkite savo servisą ir užbaikite registraciją.
Naudotojo vardas Notakey sistemoje turi tiksliai sutapti su VPN naudotojo
vardu: maršrutizatoriaus skriptas push pranešimą adresuoja pagal PPP
naudotojo vardą. john maršrutizatoriuje ir john.doe Notakey sistemoje
tyliai nesuveiks.
2 žingsnis: įdiekite JParseFunctions biblioteką
RouterOS skriptai patys JSON apdoroti nemoka; šią spragą užpildo biblioteka iš mikrotik-json-parser projekto.
WinBox arba WebFig sąsajoje eikite į System → Scripts, sukurkite naują
skriptą tiksliai pavadinimu JParseFunctions, politikos žymimuosius
langelius palikite numatytuosius (specialių teisių nereikia) ir įklijuokite
visą to projekto failo
JParseFunctions
turinį.
3 žingsnis: įdiekite NotakeyFunctions biblioteką
Ta pati procedūra: sukurkite antrą skriptą tiksliai pavadinimu
NotakeyFunctions ir įklijuokite failo
NotakeyFunctions.lua
turinį iš Notakey saugyklos. Tai klientas, bendraujantis su Notakey API,
kuris sukuria autentifikavimo užklausą ir laukia naudotojo atsakymo.
Skriptų pavadinimai svarbūs: kito žingsnio profilio skriptas abi bibliotekas įkelia pagal pavadinimą.
4 žingsnis: prijunkite up/down skriptus prie PPP profilio
Atverkite savo VPN PPP profilį (PPP → Profiles), arba sukurkite atskirą, kad testuojant 2FA galiotų tik pasirinktiems naudotojams.
- Skirtuke General nustatykite Address List reikšmę
vpn_pending. Nuo šiol kiekvieno naujo šį profilį naudojančio ryšio adresas, sesijai pakilus, iš karto įtraukiamas į šį sąrašą. - Skirtuke Scripts į laukelį On Up įklijuokite žemiau pateiktą
On Up skriptą (iš
PppProfileScript.lua), pakeisdami dvi reikšmes pagal savo aplinką:ntkHost, jūsų Notakey serverio vardą (behttps://), irntkAccessId, aplikacijos Access ID, kurį nusikopijavote 1 žingsnyje.
{
: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
}
To paties failo On Down skriptas tik įrašo atsijungimą į žurnalą. Norėdami tvarkingų žurnalų, įklijuokite jį į laukelį On Down, arba praleiskite.
Patvirtinimo skirtasis laikas (authTtl) yra 60 sekundžių: pakankamai ilgas,
kad spėtumėte išsitraukti telefoną iš kišenės, ir pakankamai trumpas, kad
užstrigęs prisijungimas nelaikytų pusiau atviros sesijos amžinai.
5 žingsnis: pridėkite ugniasienės taisykles
Būtent drop taisyklė laukiančiųjų sąrašui suteikia realią prasmę:
/ip firewall filter
add chain=forward src-address-list=vpn_pending action=drop \
comment="Block VPN clients pending 2FA approval"
Įkelkite ją virš bendrųjų VPN leidimo taisyklių, kad ji galiotų, kol
laukiama patvirtinimo. Jei VPN klientams turi būti užkirstas kelias pasiekti
ir patį maršrutizatorių, tą pačią taisyklę pakartokite input grandinėje.
Vienas ypatingas atvejis: jei patvirtinimas vyks tame pačiame įrenginyje, kuris jungiasi prie VPN (telefonas pats yra VPN klientas), patvirtinimo srautas turi pasiekti Notakey serverį, kol visa kita dar blokuojama. Virš drop taisyklės pridėkite accept taisyklę:
/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"
(Tvirtinant iš antro įrenginio, telefonas tvirtina, kol nešiojamasis
kompiuteris jungiasi, papildomos taisyklės nereikia: Notakey API
maršrutizatorius apklausia pats, o jo paties srautui forward grandinė
negalioja.)
6 žingsnis: priskirkite profilį ir išbandykite
Nukreipkite savo VPN naudotoją (PPP → Secrets) į 4 žingsnio profilį ir prisijunkite prie VPN iš kliento:
- Tunelis užsimezga, bet niekas nemaršrutizuojama: esate
vpn_pendingsąraše. - Per sekundę kitą į telefoną atkeliauja push pranešimas.
- Patvirtinus → srautas pradeda tekėti. Atmetus arba ignoruojant → pasibaigus skirtajam laikui sesija nutrūksta.
Stebėkite procesą skiltyje Log (skriptai fiksuoja kiekvieną užklausą ir
jos rezultatą) ir IP → Firewall → Address Lists, kur kliento adresas
atsiranda vpn_pending sąraše ir patvirtinus išnyksta.
Trikčių šalinimas
- Push pranešimas neatkeliauja. Beveik visada naudotojo vardo nesutapimas tarp PPP Secrets ir Notakey serviso arba telefonas niekada nebuvo užregistruotas būtent šioje aplikacijoje.
- Push pranešimas atkeliauja, bet jo neįmanoma patvirtinti. Greičiausiai tvirtinate iš to paties įrenginio, kuris jungiasi prie VPN, ir laukiančiųjų sąrašo drop taisyklė blokuoja patvirtinimo srautą. Pridėkite accept taisyklę iš 5 žingsnio arba patvirtinkite iš įrenginio, kuris nėra tunelio viduje.
- Užklausos tekstas iškraipytas arba užklausa žlunga. JSON apdorojimo biblioteka nesusidoroja su skliaustais (ir galbūt kitais specialiais skyrybos ženklais) autentifikavimo pranešime. Pranešimo tekstą laikykite paprastą.
- Veikia vienam naudotojui, kitam ne. Patikrinkite antrojo naudotojo profilio priskyrimą; taip elgiamasi tik su tais secrets, kurie nukreipti į 2FA profilį.
Bendras vaizdas
Šis skriptais grįstas kelias yra greičiausias būdas įdiegti MikroTik VPN 2FA, nereikalaujantis jokios papildomos infrastruktūros. Jei vėliau jo nebeužteks (daug maršrutizatorių, kitų gamintojų VPN ar centralizuota politika), tas pats Notakey serveris palaiko ir RADIUS pagrįstą sąranką, kurioje patvirtinimo srautą vietoj maršrutizatoriaus skriptų tvarko auth proxy.