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í.
Nasaďte to pro všechny uživatele
Nastavit profil u jediného secretu je bezpečný způsob, jak si vše vyzkoušet:
dvoufaktorové ověření dostane jen tento jeden uživatel. Jakmile to bude fungovat,
nemusíte upravovat každý secret zvlášť. Každý PPP server má svůj Default
Profile a ten platí pro všechny uživatele, jejichž secret zůstává na profilu
default. U L2TP jej najdete v PPP → Interface → L2TP Server. Totéž se dá
nastavit z terminálu (ve WinBoxu přes New Terminal):
/interface l2tp-server server set default-profile=<your-2fa-profile>
SSTP a PPTP mají stejné nastavení pod tlačítkem vlastního serveru. Profil nastavený přímo u secretu má i nadále přednost před výchozím profilem serveru, takže uživatel, kterého jste záměrně nasměrovali na jiný profil, si jej ponechá.
Řešení potíží
- Nestane se vůbec nic a v logu není žádný požadavek. Skript se vůbec nespustil, což znamená, že žádné připojení nepoužilo 2FA profil. Samotné vytvoření profilu nestačí: musí na něj ukazovat buď secret uživatele, nebo Default Profile serveru.
- 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. Zjistěte, na jakém profilu
druhý uživatel nakonec skončí. Buď jeho secret ukazuje přímo na 2FA profil,
nebo je jeho secret na profilu
defaulta 2FA profil je nastavený jako Default Profile serveru.
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.