Mikrotik - VPN - L2TP/IPSec

Mikrotik - VPN - L2TP/IPSec

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 vašem Mikrotiku. Přistupujete pak k zařízením v lokální síti pod lokální IP a brouzdáte po internetu pod vnější IP adresou Mikrotiku, to vše přes šifrované spojení mezi vaším zařízením a mikrotikem. Popřípadě si jen vytvoříte přídatné spojení na vzdálený Mikrotik, například pro účely jeho vzdálené správy či přístupu k lokálním IP adresám, a vnější IP adresu (pro brouzdání a stahování) si necháte původní. Tento návod je orientován jak na GUI, tak na konzoli. Jsou to původně moje zápisky, takže text není úplně uhlazený, ale na funkci to nemá vliv.

KROK 0: WINBOX –> INTERFACES –> INTERFACE LIST (–> LISTS)

Toto je dodatečně přidaný krok, interface listy jsou v RouterOS dostupné od roku 2017, od té doby jsou už všechny Mikrotiky aktualizované, takže lze funkci považovat jako běžně dostupnou. Kdo konfiguroval svůj Mikrotik již před nějakou tou dobou (2018) a poté jen aktualizoval RouterOS, může mít ještě starší typ konfigurace, kde se Interface listy nepoužívaly. Stejně tak ti, co konfigurují RouterOS od píky.

S touto funkcí se dá v nastaveních napříč celým systémem odkazovat na skupinu interfaců (interface list), nejen na jeden konkrétní interface, jak to bylo dříve. Protože my máme v každém interface listu jedinou položku (bridge v LAN, a ether1 ve WAN), dalo by se v našem případě bez interface listů i obejít – odkazovat se v nastaveních na interfacy bridge a ether1 přímo. Protože funkce Quick Set začala někdy od roku 2018 generovat nastavení používající Interface listy (hlavně firewall pravidla), dává smysl se toho držet a také je využívat.

Zkontrolujeme tedy, zda máme v systému nastavené interface listy a zda do nich máme přiřazené interfacy. Potřebujeme dva interface listy: LAN a WAN. V LAN interface listu musí být přidány interfacy vnitřní sítě. To typicky znamená přidat bridge (název většinou bridge, nebo bridge1). Ve WAN interface listu musí být přidány interfacy sítě vnější, což bývá typicky první ethernetový port (název většinou ether1, nebo ether1-gateway).

Návod s nastavenými Interface listy spíš počítá, některé kroky v návodu ale ještě nejsou v tomto směru zaktualizované a odkazují se na interfacy přímo. To na funkci nemá vliv – aktualizuji až budu zas VPN někde konfigurovat.

KROK 1: FIREWALL PRAVIDLA

V první řadě povolíme pár pravidel na firewallu , konkrétně tyto protokoly a porty:

  • Protokol UDP, port 500 pro IPsec zajišťuje první fázi připojování (protokol IKE – výměna klíčů a konfigurace spojení)
  • Protokol UDP, port 1701 pro L2TP
  • Protokol UDP, port 4500 pro IPsec zajišťuje mód průchodu branou NAT (IPsec NAT-Traversal mode)
  • Protokol ESP (Encapsulating Security Payload) pro IPsec přidává šifrování paketů
  • Protocol AH (Authentication Header) pro IPsec zajišťuje autentizaci odesílatele a příjemce

Takže se připojíme do Mikrotiku přes WinBox, spustíme konzoli a postupně povkládáme následující:

/ip firewall filter
add action=accept chain=input in-interface=ether1 protocol=udp dst-port=500 comment="VPN: allow IKE"
add action=accept chain=input in-interface=ether1 protocol=udp dst-port=1701 comment="VPN: allow L2TP"
add action=accept chain=input in-interface=ether1 protocol=udp dst-port=4500 comment="VPN: allow IPsec NAT-T"
add action=accept chain=input protocol=ipsec-esp in-interface=ether1
add action=accept chain=input protocol=ipsec-ah in-interface=ether1

Příkazy vkládejte do konzole ve winboxu přes right-click – vložit. Nikoliv přes Ctrl+V. Stisk Ctrl+V dost nešťastně zapne autodoplňování příkazů (commands auto-completion). V takovém případě to pak při vkládání (přes right click) mrší vkládané příkazy přidáváním nadbytečných slov. Auto-completion jde případně vypnout opětovným stiskem Ctrl+V.

Do in-interface patří vaše 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řeme IP->Firewall a vše pak přesuneme nad „DROP all not coming from LAN“ pravidlo.

Kdo chce tento krok celý klikat v GUI, tak může v IP->Firewall kliknout na tlačítko [+] a ty pravidla popřidávat ručně:

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

To první trojité pravidlo lze ponechat sloučené (dst-port=500,1701,4500), nebo jej rozdělit na tři pravidla každý pro jeden port (500, 1701 a 4500). Je to jedno, odděleně se hodí pokud například hledáte příčinu problému s připojením. Můžete tak jednodušeji sledovat, kolik komunikace přiteklo jakým portem.

KROK 2: IP -> POOL

IP -> Pool, zmenšíme stávající pool a ve volném místu vytvoříme pool pro VPN klienty.

Přes GUI:

  1. Zmenšíme stávající pool, např. z .100-250 na .100-199
  2. Vytvoříme nový pool od .200 do .250, vyhrazený klienty připojené přes VPN
  3. Schválně necháme pár volných IP adres na konci rozsahu (.251 až .254). Minimálně jednu IP totiž napevno obsadíme PPP klientem, viz následující krok.

Přes konzoli:

/ip pool
set dhcp ranges=192.168.88.100-192.168.88.200
add name=vpnpool ranges=192.168.88.201-192.168.88.250

KROK 3: PPP -> PROFILES TAB

Přidáme nový PPP profil.

Přes konzoli:

/ppp profile
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="heslo-spolecne-pro-vsechny-uzivatele"  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 a IPSec identitu. Přeskoč další krok. Lze i nezaškrtnout, ale v tom případě další krok nepřeskakuj a vytvoř IPSec peer a IPSec identitu ručně.

KROK 5: IP -> IPSEC -> PEERS TAB A IDENTITIES TAB

Tento krok lze přeskočit.

Volba “Use IPSec” z předchozího kroku vytvoří dynamické záznamy v IP -> IPsec -> Peers a IP -> IPsec -> Identities, takže není potřeba ručně nastavovat.

Pouze pokud jsi v předchozím kroku “Use IPSec” nezaškrtnul, tak bude potřeba oba vytvořit ručně. To se hodí jen v případě, že je něco nutné nastavit nestandardně. Například je možnost omezit připojení jen z jedné konkrétní IP, ale taková věc jde typicky řešit firewallem.

Co se tam nastavuje:

address: očekávaná IP adresa protistrany
::/0 (což znamená libovolná IP a libovolný port; šlo by i 0.0.0.0/0)
pokud se sem zadá konkrétní IP, pak pouze tato konkrétní IP se bude moci připojit.
pokud chci omezit IP, ze které se dá připojit, zatím mi vždy stačilo omezení vytvořit ve firewallu (a tam to člověk i hledá)
port: 500. Funguje i bez vyplněného portu, nevyplneno znamena "jakykoli port"
local address: sem nic nevyplnit (pole musi byt šedé), nebo vyplnit dvě dvojtečky jak je i vidět na screenshotu :: (funguje obojí, protože to znamená to stejné, "jakákoliv hodnota")
auth. method: pre shared key
exchange mode: main l2tp
secret: sem napsat sdílené heslo pro všechny uživatele VPN
send initial contact: Enable
NAT traversal: Enable	
generate policy: port override
hash algorithm: sha1
encryption alg.: 3des, aes128, aes256
DH group: modp1024

RouterOS 6.43 a starší má pouze záložku Peers a v ní hodně nastavení, rozdělena na 3 taby
RouterOS 6.38 a starší má všechna navíc všechna tato nastavení dohromady na jedné záložce
Rozhraní v RouterOS 6.44.1 a novějším je rozdělené na taby Peers a Identities, ale nastavení budou obdobná.

 

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

Zde si přidáme VPN uživatele, tedy přihlašovací jméno/heslo k VPN. Pro správnou funkci stačí přidat jednoho uživatele, ale někdy je lepší přídat uživatelů víc:

a) Pokud jsou všechny zařízení jen vaše, nebo rodiny, nebo vůbec nepotřebujete vědět, kdo se připojuje, stačí mít založeného jednoho VPN uživatele. A to i v případě, že se budeme chtít připojovat z více zařízení najednou.

b) V případě, že dáváme přihlašovací údaje i kolegům, kamarádům, je vhodné každému určit vlastní jméno/heslo. S dalšími uživateli tedy budete vždy sdílet celkem tři autentizační údaje pro účely nastavení na jejich zařízeních: jméno/heslo zadané v tomto kroku + IPSec sdílené heslo, které stejné pro všechny. V logu je pak vidět odkud (z jakého účtu) spojení přišlo, lze sestavovat grafy a statistiky pro jednotlivé účty, atd.

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

Přes konzoli:

/ppp secret
add name=vpnuser password="heslo-unikatni-pro-tohoto-uzivatele" profile=my-l2tp-profile service=l2tp

KROK 8: ARP-PROXY NA BRIDGI

Ještě nastavíme poslední věc, a to aktivaci arp-proxy na hlavním bridgi (bridge, někdy také bridge1, či brighe-local). Když není zaplá, tak se sice dopingneme na samotný router (a připojíme na Winbox), ale už ne na ostatní zařízení v lokální síti.

Takže otevřeme Bridge -> tab Bridge -> položka bridge (popř. bridge1, bridge-local, atd.), ekvivalent je Interfaces -> tab Interface -> položka bridge (popř. bridge1, bridge-local, atd.). V dialogu stačí ARP přepnout z enabled na proxy-arp.

To samé přes konzoli:

/interface bridge
set bridge arp=proxy-arp

KROK 9: PROFIT

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

Nejdřív se zkuste připojit z vnitřní sítě (na IP adresu routeru, tzn 192.168.88.1), až pak řešit připojení z vnějšku. Pokud máte Mikrotik připojený na nějaký „modem“/router od poskytovatele internetu, který má víc LAN portů, tak bych se notebookem připojil do toho „modemu“ a zkusil se připojit na modemem přidělenou IP adresu mikrotiku (může být například 192.168.1.117, to je vidět buď v nastavení modemu v sekci DHCP leases, nebo ve winboxu v IP -> Addresses -> dynamická položka ukazuje IP, nebo i v Quick Setu je IP vidět v kolonce IP Address.). Tím ověříme, zda firewall na mikrotiku je pro VPN průchozí. Následně se pak se dá postoupit ještě výše a to o pokusy připojení z veřejného internetu. Na „modemu“ bude potřeba povolit nějakým způsobem přesměrování portů na adresu Mikrotiku a Mikrotiku v síti přidělit pevnou lokální IP adresu.

TO SAMÉ, ALE POHROMADĚ V KONZOLOVÝCH PŘÍKAZECH

# Quick VPN setup
# Apply commands to freshly configured mikrotik (WISP AP or DualAP mode in Quick setup)

# To-do before copy-pasting these commands at once:
# 1) set custom shared password
# 2) set custom user name and ipsec-secret
# 3) check IP adresses, they have to match with your current config
# 4) after import, check that firewall filters are above "defconf: drop all not coming from LAN" rule (see Winbox: IP -> Firewall)

/ip firewall filter
add action=accept chain=input in-interface=ether1 protocol=udp dst-port=500 comment="VPN: allow IKE" place-before=5
add action=accept chain=input in-interface=ether1 protocol=udp dst-port=1701 comment="VPN: allow L2TP" place-before=5
add action=accept chain=input in-interface=ether1 protocol=udp dst-port=4500 comment="VPN: allow IPsec NAT-T" place-before=5
add action=accept chain=input protocol=ipsec-esp in-interface=ether1 comment="VPN: allow IPSec-ESP" place-before=5
add action=accept chain=input protocol=ipsec-ah in-interface=ether1 comment="VPN: allow IPSec-AH" place-before=5

/ip pool
set dhcp ranges=192.168.88.100-192.168.88.200
add name=vpnpool ranges=192.168.88.201-192.168.88.250

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

/interface l2tp-server server
set enabled=yes default-profile=my-l2tp-profile use-ipsec=yes ipsec-secret="shared-password-for-all-users" authentication=mschap1,mschap2

/ppp secret
add name=vpnuser password="unique-password-for-this-user" profile=my-l2tp-profile service=l2tp

/interface bridge
set bridge arp=proxy-arp

PŘIPOJÍME SE

Nyní nastavíme všechny naše zařízení. U všech připojení je jedna společná věc k volbě: buď chceme vést přes VPN tunel veškerou komunikaci – v tom případě budeme z vnějšku vidět pod IP adresou VPN brány, na kterou se připojujeme (nakonfigurovaný Mikrotik s VPN), nebo běžná komunikace zůstane beze změny a v systému se zpřístupní jen nový subnet s lokálními IP adresami vzdálené sítě.

První případ se hodí pro přístup ke zdrojům, které vyžadují konkrétní IP adresu (IP whitelist), skrytí vaší aktuální IP adresy, skrytí reálné polohy, či prostě kvůli samotnému šifrovanému tunelu, protože jste zrovna na veřejné Wi-Fi a chcete komunikaci zabezpečit. Druhý případ se hodí, pokud se chcete jenom připojit k Mikrotiku pro účely jeho správy nebo přístupu k lokálním IP adresám za ním a chcete, aby vám běžná komunikace i nadále tekla normálním způsobem plnou rychlostí.

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.

V případě, že cílové Mikrotik zařízení, na které se připojujete, je skryté za NATem, bude ještě nutné upravit hodnotu v registru a restartovat počítač.

Win+R -> regedit -> OK -> větev HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesPolicyAgent -> přidat novou hodnotu DWORD -> název AssumeUDPEncapsulationContextOnSendRule, hodnota 2.

Ve výchozím nastavení Windows routuje přes VPN spojení veškerou komunikaci. Pokud vám nejde o zabezpečení veškeré komunikace a chcete si zachovat stávající IP adresu, pak je nutno vejít hluboko do X-tého dialogu.

PŘIPOJENÍ Z MACOS

  • Settings → Network → tlačítko [+] vlevo dole
  • Interface: VPN, VPN type: L2TP over IPSec, Service name: libovolný název; klikněte na [Create]
  • Server address: vnější IP adresa routeru
  • Account name: jméno uživatele
  • button Authentication settings → Password: heslo uživatele, Shared secret: heslo sdílené pro všechny uživatele; [OK]
  • button Advanced → checkbox Send all traffic over VPN connection
    pokud vám nejde o zabezpečení veškeré komunikace a chcete si zachovat stávající IP adresu, stačí nezaškrtávat
  • Apply. Uložit, připojit!

PŘIPOJENÍ Z IPHONU A IPADU

  • Settings → General → VPN → Add VPN Configuration...
  • Type: L2TP
    (je tam i volba IPSec, ale tu nevolit)
  • Description: vyplnit libovolný název
  • Server: vyplnit IP adresu routeru
  • Account: jméno uživatele
  • Password: heslo uživatele
  • Secret: heslo sdílené pro všechny uživatele
  • jméno uživatele
  • přepínač Send all traffic nechat zapnutý
    pokud vám nejde o zabezpečení veškeré komunikace a chcete si zachovat stávající IP adresu, stačí nezaškrtávat
  • Proxy nechat na Off.
  • Done. Tím se uloží a nahoře máte přepínač na aktivaci, zkuste se nyní připojit.

PŘIPOJENÍ Z ANDROIDU

Nemám po ruce žádný Android, kdo má, může dodat postup ve stylu těch předchozích a screenshoty. :-)

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 již funkční návod musel kvůli rozličným chybám od návštěvníků mnohokrát vylepšovat. Základní rada je, zkus se nejdřív připojit z vnitřní sítě, kde je méně prvků které můžou nefungovat. Následně pak zkoušet se připojit z vnějšku na WAN port, a až nakonec se pokoušet připojit z internetu. Dále mrkni na mikrotiku do Log. Pokud to nestačí, tak zapni i podrobné logování L2TP a IPSEC těmito příkazy:

/system logging add prefix="L2TP_LOG ===> " topics=l2tp
/system logging add prefix="IPSEC_LOG ===> " topics=ipsec

Někdy pomůžou dočasně deaktivovat drop pravidla na firewallu. Pokud můžete, mikrotik nejdřív zkoušejte konfigurovat na dobré lokalitě, kde běží pořádný internet s pevnou veřejnou IP adresou (typicky kabelový internet, nebo optika). Pokud si stále nevíte rady, nezbývá než přidat 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š.

ISP operátoři většinou nabízí veřejnou dynamickou IP, pokud máš stěstí, nebo privátní neveřejnou, která je k ničemu. Za veřejnou IP si nechají často zaplatit tučný měsíční poplatek, někdy v ceně základního připojení.

Marek Mihók