Tento návod vás provede cestou od obyčejné MikroTik VPN k takové, kde musí být každé přihlášení schváleno klepnutím v aplikaci Notakey Authenticator, a to jen pomocí skriptování RouterOS. V tomto nastavení není žádný RADIUS server, žádná auth proxy a kromě routeru, který už máte, se ve vaší síti nic nenasazuje.
Všechny skripty pocházejí z oficiálního repozitáře
notakey/mikrotik-2fa-vpn.
Jak to funguje
Když pochopíte celý průběh, bude každý krok níže zřejmý:
- Uživatel se připojí k VPN a autentizuje se jako obvykle uživatelským jménem
a heslem. PPP relace se naváže, firewall ale okamžitě zablokuje veškerý
jeho provoz, protože jeho adresa skončí v address listu
vpn_pending. - Spustí se up skript PPP profilu. Ten zavolá váš Notakey Authentication Server, který odešle na telefon uživatele žádost o schválení: „Log in as <user> from <caller IP>?“
- Pokud uživatel žádost schválí v časovém limitu (60 sekund), skript
odebere jeho adresu z
vpn_pending: blokace na firewallu zmizí a provoz se rozběhne. - Pokud uživatel žádost zamítne nebo limit vyprší, skript PPP relaci ukončí. Samotné heslo nikdy nestačilo.
Co budete potřebovat
- RouterOS 6.46.4 nebo novější (skripty běží i na RouterOS 7.x).
- Funkční VPN na bázi PPP na routeru (L2TP/IPsec, PPTP nebo SSTP), ke které se uživatelé už dokážou připojit uživatelským jménem a heslem.
- Notakey Authentication Server dostupný z routeru. Stačí bezplatný cloudový tarif na signup.notakey.com (prvních 6 uživatelů zdarma), nebo provozujte on-premise zařízení (prvních 10 uživatelů zdarma).
- Telefon s iOS nebo Androidem a aplikací Notakey Authenticator.
Krok 1 – Připravte stranu Notakey
- V dashboardu Notakey vytvořte pro VPN novou aplikaci (službu) a pojmenujte ji rozpoznatelně, např. „Office VPN“; tento název uvidí uživatelé na svém telefonu.
- Zkopírujte Access ID aplikace (UUID); v kroku 4 jej vložíte do skriptu na routeru.
- Vytvořte uživatele (nebo připojte svůj zdroj uživatelů), nakonfigurujte požadavek na registraci a zaregistrujte telefon: nainstalujte Notakey Authenticator, přidejte svou službu a dokončete registraci.
Uživatelské jméno v Notakey se musí přesně shodovat s uživatelským jménem
pro VPN: skript na routeru adresuje push notifikaci podle PPP uživatelského
jména. Kombinace john na routeru a john.doe v Notakey selže bez jediného
chybového hlášení.
Krok 2 – Nainstalujte knihovnu JParseFunctions
Skripty RouterOS neumí nativně parsovat JSON; tuto mezeru vyplňuje knihovna z projektu mikrotik-json-parser.
Ve WinBoxu nebo WebFigu otevřete System → Scripts, vytvořte nový skript
pojmenovaný přesně JParseFunctions, zaškrtávací pole policy ponechte na
výchozích hodnotách (žádná zvláštní oprávnění nejsou potřeba) a vložte do něj
celý obsah souboru
JParseFunctions
z uvedeného projektu.
Krok 3 – Nainstalujte knihovnu NotakeyFunctions
Stejný postup: vytvořte druhý skript pojmenovaný přesně NotakeyFunctions
a vložte do něj obsah souboru
NotakeyFunctions.lua
z repozitáře Notakey. Jde o klienta, který komunikuje s Notakey API: vytváří
autentizační požadavek a průběžně se dotazuje na odpověď uživatele.
Na názvech skriptů záleží: skript profilu v dalším kroku načítá obě knihovny podle názvu.
Krok 4 – Připojte up/down skripty k PPP profilu
Otevřete PPP profil své VPN (PPP → Profiles), nebo si vytvořte vyhrazený profil, aby se dvoufaktorové ověření během testování týkalo jen vybraných uživatelů.
- Na záložce General nastavte Address List na
vpn_pending. Každé nové připojení používající tento profil od této chvíle dostane svou adresu do tohoto seznamu hned po navázání relace. - Na záložce Scripts vložte do pole On Up skript níže (ze souboru
PppProfileScript.lua) a upravte dvě hodnoty pro své prostředí:ntkHost, tedy hostname vašeho Notakey serveru (bezhttps://), antkAccessId, tedy Access ID aplikace, které jste zkopírovali v kroku 1.
{
: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
}
Skript On Down ze stejného souboru pouze zapisuje odpojení do logu. Vložte jej do pole On Down, chcete-li mít přehledné logy, nebo jej vynechte.
Časový limit schválení (authTtl) je 60 sekund: dost dlouhý na vytažení
telefonu z kapsy a dost krátký na to, aby zaseknuté přihlášení nedrželo napůl
otevřenou relaci donekonečna.
Krok 5 – Přidejte pravidla firewallu
Teprve pravidlo drop dává seznamu čekajících skutečný význam:
/ip firewall filter
add chain=forward src-address-list=vpn_pending action=drop \
comment="Block VPN clients pending 2FA approval"
Umístěte je nad svá obecná pravidla povolující VPN, aby mělo přednost, dokud
se čeká na schválení. Pokud mají být VPN klienti blokováni i v přístupu k samotnému
routeru, zopakujte pravidlo v chainu input.
Jeden zvláštní případ: pokud bude schválení probíhat na stejném zařízení, které se k VPN připojuje (telefon je sám VPN klientem), musí se schvalovací provoz dostat k Notakey serveru, zatímco vše ostatní je stále blokované. Nad pravidlo drop přidejte pravidlo accept:
/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"
(Schvalování z druhého zařízení, kdy telefon schvaluje a připojuje se
notebook, žádné další pravidlo nepotřebuje: router se dotazuje Notakey API
sám a jeho vlastní provoz chainem forward neprochází.)
Krok 6 – Přiřaďte profil a otestujte
Nasměrujte svého VPN uživatele (PPP → Secrets) na profil z kroku 4 a poté se k VPN připojte z klienta:
- Tunel se naváže, ale nic se nesměruje: jste v
vpn_pending. - Během vteřiny či dvou dorazí na telefon push notifikace.
- Schválit → provoz se rozběhne. Zamítnout nebo ignorovat → po vypršení limitu relace spadne.
Celý průběh můžete sledovat v Logu (skripty zapisují každý požadavek
i výsledek) a v IP → Firewall → Address Lists, kde se adresa klienta
objeví v vpn_pending a po schválení zmizí.
Řešení potíží
- Push nedorazí. Téměř vždy jde o neshodu uživatelského jména mezi PPP Secrets a službou Notakey, nebo telefon nikdy nebyl zaregistrován k této konkrétní aplikaci.
- Push dorazí, ale nejde schválit. Pravděpodobně schvalujete ze stejného zařízení, které se k VPN připojuje, a pravidlo drop pro seznam čekajících blokuje schvalovací provoz. Přidejte pravidlo accept z kroku 5, nebo schvalte ze zařízení, které není uvnitř tunelu.
- Text požadavku je rozbitý nebo požadavek selže. Knihovna pro parsování JSON si neporadí se závorkami (a možná i další speciální interpunkcí) v autentizační zprávě. Text zprávy ponechte jednoduchý.
- Jednomu uživateli to funguje, druhému ne. Zkontrolujte přiřazení profilu u druhého uživatele; dvoufaktorové ověření se týká jen secrets nasměrovaných na 2FA profil.
Kam to zapadá
Tento přístup založený na skriptech je nejrychlejší cestou k dvoufaktorovému ověření MikroTik VPN a nepotřebuje žádnou další infrastrukturu. Pokud z něj později vyrostete (více routerů, VPN jiných výrobců nebo centrální politiky), podporuje tentýž Notakey server i nastavení přes RADIUS, kde schvalování místo skriptů na routeru obsluhuje auth proxy.