2025. gada 12. novembris

MikroTik VPN divfaktoru autentifikācija tikai ar RouterOS skriptiem

Soli pa solim: MikroTik VPN aizsardzība ar tālruņa apstiprinājumu, izmantojot tikai RouterOS skriptus, bez RADIUS servera un papildu infrastruktūras.

Šis ceļvedis parāda, kā parastu MikroTik VPN pārvērst risinājumā, kurā katra pieteikšanās jāapstiprina ar pieskārienu Notakey Authenticator lietotnē, izmantojot vienīgi RouterOS skriptus. Nav ne RADIUS servera, ne autentifikācijas starpniekservera (auth proxy), un tīklā nekas papildus nav jāizvieto: pietiek ar maršrutētāju, kas jums jau ir.

Visi skripti ir no oficiālā notakey/mikrotik-2fa-vpn repozitorija.

Kā tas darbojas

Kad procesa gaita ir skaidra, katrs turpmākais solis kļūst pašsaprotams:

  1. Lietotājs pieslēdzas VPN un kā ierasts autentificējas ar lietotājvārdu un paroli. PPP sesija tiek izveidota, taču ugunsmūris uzreiz nobloķē visu tās trafiku, jo lietotāja adrese nonāk vpn_pending adrešu sarakstā.
  2. Nostrādā PPP profila up skripts: tas izsauc jūsu Notakey autentifikācijas serveri (Notakey Authentication Server), kurš uz lietotāja tālruni nosūta apstiprinājuma pieprasījumu: “Pieteikties kā <user> no <caller IP>?”
  3. Ja lietotājs atvēlētajā laikā (60 sekundēs) pieprasījumu apstiprina, skripts viņa adresi izņem no vpn_pending: ugunsmūra bloķējums zūd, un trafiks sāk plūst.
  4. Ja lietotājs pieprasījumu noraida vai laiks beidzas, skripts PPP sesiju pārtrauc. Ar paroli vien piekļuvi iegūt nevar.

Priekšnosacījumi

  • RouterOS 6.46.4 vai jaunāka versija (skripti darbojas arī ar RouterOS 7.x).
  • Maršrutētājā jau jādarbojas uz PPP balstītam VPN (L2TP/IPsec, PPTP vai SSTP), kuram lietotāji var pieslēgties ar lietotājvārdu un paroli.
  • Notakey autentifikācijas serveris, kas sasniedzams no maršrutētāja. Pietiek ar bezmaksas mākoņa plānu vietnē signup.notakey.com (pirmie 6 lietotāji bez maksas) vai lokālo (on-premise) iekārtu (pirmie 10 lietotāji bez maksas).
  • iOS vai Android tālrunis ar lietotni Notakey Authenticator.

1. solis — sagatavojiet Notakey pusi

  1. Notakey vadības panelī izveidojiet jaunu lietojumprogrammu (servisu) VPN vajadzībām un dodiet tai atpazīstamu nosaukumu, piemēram, “Office VPN”: tieši šo nosaukumu lietotāji redzēs tālrunī.
  2. Nokopējiet lietojumprogrammas Access ID (UUID). Tas būs jāielīmē maršrutētāja skriptā 4. solī.
  3. Izveidojiet lietotāju (vai pieslēdziet savu lietotāju avotu), iestatiet reģistrācijas prasību un reģistrējiet tālruni: instalējiet Notakey Authenticator, pievienojiet savu servisu un pabeidziet reģistrāciju.

Lietotājvārdam Notakey pusē precīzi jāsakrīt ar VPN lietotājvārdu, jo maršrutētāja skripts push paziņojumu adresē pēc PPP lietotājvārda. Ja maršrutētājā ir john, bet Notakey pusē — john.doe, pieprasījums neizdosies bez jebkāda kļūdas ziņojuma.

2. solis — instalējiet JParseFunctions bibliotēku

RouterOS skriptiem nav iebūvēta JSON atbalsta; šo robu aizpilda bibliotēka no projekta mikrotik-json-parser.

WinBox vai WebFig vidē atveriet System → Scripts un izveidojiet jaunu skriptu ar tieši šādu nosaukumu: JParseFunctions. Politikas (policy) izvēles rūtiņas atstājiet noklusējuma stāvoklī (īpašas tiesības nav vajadzīgas) un ielīmējiet visu JParseFunctions faila saturu.

3. solis — instalējiet NotakeyFunctions bibliotēku

Tāda pati procedūra: izveidojiet otru skriptu ar tieši šādu nosaukumu (NotakeyFunctions) un ielīmējiet tajā NotakeyFunctions.lua faila saturu no Notakey repozitorija. Šis skripts ir klients, kas sazinās ar Notakey API: izveido autentifikācijas pieprasījumu un pēc tam regulāri vaicā, vai lietotājs ir atbildējis.

Nosaukumi nav nejauši: nākamajā solī profila skripts abas bibliotēkas ielādē tieši pēc nosaukuma.

4. solis — pievienojiet up/down skriptus PPP profilam

Atveriet sava VPN PPP profilu (PPP → Profiles) vai izveidojiet atsevišķu profilu, lai testēšanas laikā 2FA attiektos tikai uz izraudzītiem lietotājiem.

  1. Cilnē General laukā Address List ierakstiet vpn_pending. Turpmāk katra savienojuma, kas izmanto šo profilu, adrese sesijas izveides brīdī nonāks šajā sarakstā.
  2. Cilnē Scripts laukā On Up ielīmējiet tālāk redzamo skriptu (no PppProfileScript.lua) un pielāgojiet divas vērtības savai videi: ntkHost ir jūsu Notakey servera resursdatora nosaukums (bez https://), bet ntkAccessId
    1. solī nokopētais lietojumprogrammas 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
}

Tā paša faila On Down skripts tikai ieraksta žurnālā atvienošanās faktu. Ielīmējiet to laukā On Down, ja vēlaties pilnīgākus žurnālus, vai izlaidiet.

Apstiprinājuma noildze (authTtl) ir 60 sekundes: gana ilgi, lai paspētu izvilkt tālruni no kabatas, un gana īsi, lai iestrēgusi pieteikšanās neturētu pusatvērtu sesiju bezgalīgi.

5. solis — pievienojiet ugunsmūra noteikumus

Tieši noraidīšanas (drop) noteikums gaidīšanas sarakstam piešķir spēku; bez tā nekas netiek bloķēts:

/ip firewall filter
add chain=forward src-address-list=vpn_pending action=drop \
    comment="Block VPN clients pending 2FA approval"

Novietojiet to virs vispārīgajiem VPN atļaušanas (allow) noteikumiem, lai tas nostrādā pirmais, kamēr apstiprinājums vēl nav saņemts. Ja gaidīšanas laikā jābloķē arī klientu piekļuve pašam maršrutētājam, tādu pašu noteikumu pievienojiet input ķēdē.

Īpašs gadījums: ja apstiprināšana notiek tajā pašā ierīcē, kas veido VPN savienojumu (proti, VPN klients ir pats tālrunis), apstiprinājuma trafikam jāsasniedz Notakey serveris, kamēr viss pārējais vēl ir bloķēts. Virs noraidīšanas noteikuma pievienojiet pieņemšanas (accept) noteikumu:

/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"

(Ja apstiprina no citas ierīces, t. i., savienojumu veido klēpjdators, bet apstiprina tālrunis, papildu noteikums nav vajadzīgs: Notakey API aptaujā pats maršrutētājs, un paša maršrutētāja trafiks caur forward ķēdi neiet.)

6. solis — piesaistiet profilu un izmēģiniet

Sadaļā PPP → Secrets savam VPN lietotājam norādiet 4. solī izveidoto profilu un pieslēdzieties VPN no klienta ierīces:

  • Tunelis izveidojas, taču trafiks nekur neplūst: jūsu adrese ir sarakstā vpn_pending.
  • Dažu sekunžu laikā tālrunī pienāk push paziņojums.
  • Apstiprināt → trafiks sāk plūst. Noraidīt vai ignorēt → pēc noildzes sesija tiek pārtraukta.

Notiekošo vērojiet sadaļā Log (skripti žurnālā ieraksta katru pieprasījumu un tā iznākumu) un sadaļā IP → Firewall → Address Lists: klienta adrese parādās sarakstā vpn_pending un pēc apstiprināšanas pazūd.

Problēmu novēršana

  • Push paziņojums nepienāk. Gandrīz vienmēr vainojama lietotājvārdu nesakritība starp PPP Secrets un Notakey servisu vai arī tālrunis šai lietojumprogrammai nemaz nav reģistrēts.
  • Push paziņojums pienāk, bet apstiprināt nevar. Visticamāk, jūs mēģināt apstiprināt tajā pašā ierīcē, kas veido VPN savienojumu, un noraidīšanas noteikums bloķē apstiprinājuma trafiku. Pievienojiet 5. solī aprakstīto pieņemšanas noteikumu vai apstipriniet no ierīces, kas neatrodas tunelī.
  • Pieprasījuma teksts izskatās sabojāts vai pieprasījums neizdodas. JSON parsera bibliotēka autentifikācijas ziņojumā netiek galā ar iekavām (un, iespējams, arī citām īpašajām pieturzīmēm). Lietojiet pēc iespējas vienkāršāku ziņojuma tekstu.
  • Vienam lietotājam darbojas, citam ne. Pārbaudiet otra lietotāja profila piesaisti: 2FA attiecas tikai uz tiem secrets ierakstiem, kuriem norādīts 2FA profils.

Kur šis risinājums iederas

Uz skriptiem balstītā pieeja ir ātrākais ceļš līdz MikroTik VPN 2FA, un papildu infrastruktūra tai nav vajadzīga. Ja ar to vēlāk kļūst par šauru (maršrutētāju ir daudz, parādās citu ražotāju VPN vai vajadzīga centralizēta politika), tas pats Notakey serveris atbalsta arī uz RADIUS balstītu risinājumu, kurā apstiprināšanu vada autentifikācijas starpniekserveris (auth proxy), nevis maršrutētāja skripti.

← Visi raksti

Pirmā pieteikšanās bez paroles — jau šonedēļ

30 minūšu saruna ar inženieri, nevis pārdošanas prezentācija. Kopīgi izplānosim, kā jūsu VPN, SSO vai Windows vidē palaist strādājošu pilotprojektu.