2025 m. lapkričio 12 d.

MikroTik VPN 2FA – išsami sąranka vien skriptais

Žingsnis po žingsnio: pridėkite dviejų veiksnių autentifikavimą telefonu prie MikroTik VPN vien RouterOS skriptais, be jokio RADIUS serverio.

Š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:

  1. 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.
  2. 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>?“
  3. 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.
  4. 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ę

  1. Notakey valdymo skydelyje sukurkite naują aplikaciją (servisą) VPN. Pavadinkite ją atpažįstamai, pvz., „Biuro VPN“; šį pavadinimą naudotojai matys telefone.
  2. Nusikopijuokite aplikacijos Access ID (UUID). Jį įklijuosite į maršrutizatoriaus skriptą 4 žingsnyje.
  3. 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.

  1. 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šą.
  2. 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ą (be https://), ir ntkAccessId, 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_pending są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.

← Visi įrašai

Pirmasis prisijungimas be slaptažodžio – jau šią savaitę

30 minučių pokalbis su inžinieriumi, o ne pardavimų prezentacija. Kartu suplanuosime, kaip jūsų VPN, SSO ar Windows aplinkoje paleisti veikiantį bandomąjį projektą.