Toto je funkční mnohokrát ověřený návod na zprovoznění L2TP/IPSec VPN pro připojení z Windows, Linuxu, macOS, iOSu a Androidu na vás Mikrotik. Přistupujete pak k zařízením v lokální síti pod lokální IP a brouzdáte pod vnější IP adresou Mikrotiku po internetu. Tento návod je orientován spíš na GUI, než na konzoli. Jsou to původně moje zápisky, takže text není úplně uhlazený, ale na funkci to nemá vliv.

Krok 1: Firewall pravidla

V první řadě se připojíme přes WinBox do Mikrotiku a povolíme pár pravidel na firewallu (IP->Firewall):

/ip firewall filter
add chain=input protocol=udp in-interface=ether1 dst-port=500,1701,4500 action=accept
add chain=input protocol=ipsec-esp in-interface=ether1 action=accept
add chain=input protocol=ipsec-ah in-interface=ether1 action=accept

Do in-interface patří tvoje gateway, což je typicky ether1, nebo ether1-gateway. Je to kdyžtak vidět v Interfaces, nebo i terminálový našeptávač našeptává. Alternativně lze použít čistší a modernější řešení: In Interface nechat prázdné a nastavit In interface list na WAN.

Potom v GUI otevřít IP->Firewall a vše pak přesunout nad „DROP all not coming from LAN“ pravidlo.
Kdo chce klikat v GUI, tak může popřidávat:

chain:        input
protocol:     UDP
in interface: tvoje gateway (ether1 / ether1-gateway)
dst port:     500,1701,4500
action:       accept

chain:        input
protokol:     ipsec-esp
in interface: tvoje gateway (ether1 / ether1-gateway)
action:       accept

chain:        input
protokol:     ipsec-ah
in interface: tvoje gateway (ether1 / ether1-gateway)
action:       accept

Pokud chcete přesněji sledovat, kolik komunikace přiteklo jakým portem, nebo hledáte příčinu problému s připojením, tak první pravidlo lze dále rozdělit na tři pravidla, každý pro jeden port (500, 1701 a 4500).

Krok 2: IP -> Pool

IP -> Pool, vytvořit pool pro VPN klienty.

  1. Typicky zmenšíme ten stávající, např. na .100-199
  2. A nový vytvoříme od .200 do .250.
  3. Schválně necháme pár volných IP adres na konci rozsahu – jednu IP napevno obsadíme PPP klientem, viz následující krok.

Krok 3: PPP -> Profiles tab

Přidáme nový PPP profil.

Přes konzoli:

/ppp profiles
add name=my-l2tp-profile local-address=192.168.88.254 remote-address=vpnpool dns-server=192.168.88.1 change-tcp-mss=yes

Přes GUI:

name:             my-l2tp-profile
local address:    192.168.88.254
remote address:   vpnpool
dns server:       192.168.88.1
change TCP MSS:   Yes
interface list:   LAN

Do Local address napíšeme volnou adresu na konci rozsahu – adresu, která není obsazena ani žádným poolem.
Do Remote address napíšeme pool vytvořený v předchozím kroku.
Do DNS server napíšeme IP adresu našeho routeru, tam nám DNS běží. (Pokud nám DNS běží na jiném routeru v naší LAN síti, vložíme jeho IP.)
Do interface list vložíme LAN. Je to nutné především novějších RouterOS (2018+), kde firewall využívá interface list pro určení co je LAN a co je WAN. Toto zabezpečí, že dynamický interface, který vzniká vždy při připojení VPN klienta, se i dynamicky přidá do LAN interface listu, a tedy bude považován za součást LAN. Bez tohoto na klientovi typicky nejde DNS a nenačítá stránky. To proto, že i DNS požadavky jsou zahazovány pravidlem „DROP all not coming from LAN“.

Krok 4: PPP -> Interface tab -> [L2TP Server] button

Aktivujeme L2TP server.

Přes konzoli:

/interface l2tp-server server
set enabled=yes default-profile=my-l2tp-profile use-ipsec=yes ipsec-secret=  authentication=mschap1,mschap2

Přes GUI:

V okně PPP na záložce Interface kliknout na tlačítko L2TP Server.
Vyskočí malé okénko L2TP Server, zaškrtnout Enabled.

autentication: mschap1, mschap2
default profile: my-l2tp-profile (profil vytvoreny v predchozim kroku)
“Use IPSec”: zaškrtni a vyplň sdílené heslo pro všechny VPN uzivatele. Vytvoří to dynamický IPSec peer profil. Přeskoč další krok. Lze i nezaškrtnout, ale v tom případě další krok nepřeskakuj a vytvoř IPSec peer ručně

Krok 5: IP -> IPsec -> Peers tab

Pokud si zaškrtnul “Use IPSec” v předchozím kroku, jen zkontroluj, zda se správně vytvořil dynamický záznam s vlastnostmi níže. Jinak můžeš krok přeskočit.
RouterOS 6.38 a starší má všechna pole všechny na jedné záložce, pozdější verze mají pole rozdělena na 3 taby.

address: ocekavana IP adresa protistrany
::/0 (pro pripojeni z libovolne IP zadame dve dvojtecky, nebo 0.0.0.0/0)
pokud se zada konkretni IP, pak pouze tato konkretni IP se bude moct pripojit!
ja asi zadam dve dvojtecky a whitelist osetrim ve firewallu.
port: 500. Funguje i bez vyplneneho portu, nevyplneno znamena "jakykoli port"
local address: sem nic nevyplnit (pole musi byt sede), nebo dat dve dvojtecky jak je videt i na screenu :: (funguje oboji, protoze to znamena to stejne, "jakakoliv hodnota")
auth. method: pre shared key
exchange mode: main l2tp
secret: sdilene heslo pro vsechny uzivatele vpn
send initial contact: Enable
NAT traversal: Enable	
generate policy: port override
hash algorithm: sha1
encryption alg.: 3des, aes128, aes256
DH group: modp1024

Krok 6: IP -> IPsec -> Policy proposals

Upravit default položku, pokud je potřeba. V mém případě bylo vyplněno správně.

auth. algorithms: jen sha1
encryption algorithms: aes128, aes192, aes256
PFS group: modp1024

Krok 7: vytvořit si VPN uživatele v PPP -> Secrets

name:     tvůj nickname, nebo cokoliv, třeba vpnuser
password: vymysli si heslo pro tohoto uživatele
service:  l2tp
profile:  my-l2tp-profile

Krok 8: arp-proxy na bridgi

Ještě nastavíme poslední věc, a to aktivaci arp-proxy na bridge1. Když není zaplá, tak se sice dopingneme na samotný router (a připojíme na Winbox), ale už ne na další zařízení v lokální síti.

Otevřít
Bridge -> tab Bridge -> položka bridge1 (popř. bridge-local)
nebo ekvivalent
Interfaces -> tab Interface -> položka bridge1 (popř. bridge-local)

V dialogu stačí přepnout ARP z enabled na proxy-arp.

Krok 9: Profit

Hurá, VPN hotová, můžeme očekávat aktivní připojené klienty v PPP -> Active connections.

Připojíme se

Připojení z Windows 10

Ve Win10 je to dnes už také na pár kliků. Start – napsat VPN – najde to VPN ovládací panel, a pak už jen zadat údaje: host (vnější IP adresa routeru), preshared heslo, uživatelské jméno a heslo, a uložit.

Připojení z macOS

  • Settings → Network → [+]
  • vyplnit
  • vnější IP adresa routeru
  • jmeno uzivatele
  • button Authentication settings → heslo uzivatele a dole heslo sdilene
  • button Advanced → checkbox Send all traffic over VPN connection
  • Apply. Ulozit, pripojit!

Co dál?

VPN je tedy plně funkční a stabilní.
Dál by se někdy možná dalo rozběhat:

  1. MikroTik Neighbor Discovery protocol (MNDP) pro hledání okolních mikrotiků v lokální síti
  2. automatická viditelnost samby, bonjour atd.
  3. mrknout jak by konfigurace vypadala pro IPv6

Stále to nefunguje?

Pokazit se může opravdu hodně věcí, sám jsem i funkční návod musel mnohokrát upravovat a vylepšovat. Stačí i update RouterOS a některé věci se dělají jinak. Začnu základní radou, mrkni na mikrotiku do Log. Nebo se dají dočasně deaktivoat drop pravidla na firewallu. Ale nedá se vše zde obsáhnout předem, kdyžtak přidej pod článek komentář.

Časté otázky

Potřebuju veřejnou statickou IP?
Potřebuješ hlavně veřejnou IP (ať už statickou, nebo dynamickou), tzn. aby se k tobě šlo připojit z venčí.
Pokud ji nemáš, tak celý postup nemá smysl, dokud ji mít nebudeš.

Například, u UPC přípojek standardně veřejná IP je. ADSL/VDSL přípojky to měly v průběhu posledních let a poskytovatelů různě. Aktuálně obecně ne, možná tak u T-Mobilu. Lze dokoupit veřejnou, ale za zlodějský příplatek.
T-Mobile LTE internet vzduchem veřejnou nemá. Pouze za zlodějský měsíční příplatek.

Pokud IP veřejná je, pak se řeší, zda je statická (stále stejná), nebo dynamická (nekonrolovaně se mění).
Např. UPC nabízí dynamickou, ale mění ji průměrně jednou za dva roky, takže na domácí použití to stačí. Pokud máte poskytovatele, který ji mění častěji, pak se to musí řešit službami typu DDNS, což se už ale do tohoto článku nevejde.

Mám neveřejnou IP, bude mi připojení fungovat?
Ne. Je nutná veřejná IP, aby se dalo na ni připojit zvenčí.

Mám veřejnou IP, bude mi připojení fungovat?
Ano.

Mám veřejnou IP, ale za 1:1 carrier-grade NATem, bude mi připojení fungovat?
Ano.

Mám statickou IP, bude mi připojení fungovat?
Na tom nezáleží, hlavně záleží, zda ta statická IP je zároveň i veřejná. Pokud ano, tedy jde o statickou veřejnou IP, pak jde o ideální situaci pro připojování zvenčí.

Mám dynamickou IP, bude mi připojení fungovat?
Na tom nezáleží, hlavně záleží, zda ta statická IP je také veřejná. Pokud je zároveň veřejná, tzn. máš dynamickou veřejnou IP adresu, pak připojení zvenčí fungovat bude. Avšak tím, že se mění, bude připojení zvenčí fungovat jen nějakou dobu. Např. jeden den, nebo do restartu routeru. Poté se nepůjde zvenčí připojit, dokud v nastavení neaktualizuješ IP adresu na tu aktuální. Tento problém se řeší přes DDNS, kdy na routeru běží služba, která pravidelně informuje nějaký server/službu nabízející DDNS o své IP adrese, a vy se připojujete na (již pořád stejnou) textovou adresu na tu službu.

Patří něco do „IP -> IPSec -> Users tab“? Vypadá, že to s tím nějak souvisí.
Odpověd: Ne.

Patří něco do „PPP -> L2TP Secrets tab“? Vypadá, že to s tím nějak souvisí.
Odpověd: Ne.

V logu vidím „phase1 negotiation failed due to time up“.

  • Zkontroluj krok 5 – IP -> IPsec -> Peers tab.
    Máš tam správně IP adresu? Hned to první políčko Address?
    Když se pokusím připojit z nepovolené IP, tak to skončí na této chybě. Takže bude nutné zadat správnou IP protistrany. Pokud tam máte dvě dvojtečky, nebo ::/0, pak je připojení povoleno ze všech IP, a problém bude jinde.
  • Zkontroluj Firewall -> NAT
    Nemáš tam náhodou nastavené přesměrování portů, zrovna z rozsahu, které je využíváno VPN službou?
    Jednou jsem u někoho viděl nastavené přesměrování celého range 4000-4999 do vnitřní sítě, takže to logicky kradlo data, která měla putovat do VPN funkcionality. Stačilo zrušit, nebo upravit na jiný range.
  • Ani jedno nepomohlo
    Asi bude nějaký problém v tom, že se na jeden z portů nejde dostat. Myslím, že na ten 4500. Delší dobu se mi to nestalo, že je to nutné řešit v diskuzi pod článkem.

Jak nastavím port forwarding přes VPN?

  • V praxi bude potřeba zavést pro VPN účet pevnou interní IP adresu. Aby daný user měl po přihlášení přidělenou vždy stejnou interní IP, ne „náhodnou“ z vpnpoolu. To se nastaví v PPP -> Secrets -> <daný VPN účet> -> pole Remote address

    Toto vás z principu zároveň omezí na používání jediného zařízení na jeden účet současně. Pokud se zkusíte připojit z dvou a více PC přes takto nastavený účet najednou, všechny dostanou stejnou IP a fakticky nebude nic fungovat. Ani načítání webu. Proto doporučím na stávající VPN účet nešahat, a pro tyto účely si v PPP -> Secrets vytvořit nový, oddělený účet (jméno/heslo) s pevnou IP, na který se bude připojovat vždy jen jeden PC současně.

  • Dále přidáme samotné pravidlo na přesměrování portu
    /ip firewall nat
    add action=dst-nat chain=dstnat dst-address=<public-ip> dst-port=<public-port> protocol=tcp to-addresses=<internal-ip> to-ports=<internal-port>

    tzn. navenek budu vidět z <dst-address>:<dst-port>
    a to se přesměruje na lokální <to-addresses>:<to-ports>

  • konkrétně například

    /ip firewall nat
    add action=dst-nat chain=dstnat dst-address=83.201.34.120 dst-port=8001 protocol=tcp to-addresses=192.168.88.150 to-ports=80

    tzn. navenek budu vidět z 83.201.34.120:8001
    a to se přesměruje na lokální 192.168.88.150:80

Jak zjistím, jakou mi Mikrotik přidělil interní IP přes VPN připojení?

  • IP bude vidět v detailech aktivního VPN připojení na klientském zařízení (iPhone Settings – VPN – ikonka (i); na macOS v Settings – Networks – aktivní VPN – je vidět connect time a IP address)
  • lze ji zjistit na Mikrotiku v PPP -> Interface -> <l2tp> položka double click -> záložka Status -> pole Remote address, resp.
    /ppp active print
  • obecně bude potřeba tu IP udělat pevnou, to se nastaví v PPP -> Secrets -> pole Remote address