Konfigurace OpenVPN serveru na Mikrotiku

Konfigurace OpenVPN serveru na Mikrotiku (RouterOS ver. 6.37.1)

Na wiki Mikrotiku naleznete spousty návodu jak nakonfigurovat OVPN server na Mikrotiku, ale z mého hlediska jsou až moc obecné.

V tomto návodu se tedy pokusím shrnout mou konfiguraci od A do Z.
Cílem je nakonfigurovat OpenVPN server pro vzdálený přístup klientů a zároveň vytvoření několika VPN profilů a jejich omezení na firewallu.

Klíčem pro úspěšné fungování VPN je čas. Nastavíme tedy NTP servery

/system ntp client
set enabled=yes primary-ntp=<IP> secondary-ntp=<IP>

Nyní je potřeba vytvořit certifikát certifikační autority (CA). To lze nyní udělat přímo v Mikrotiku (ve starších verzích to nešlo a vytvářelo se to buď na Linuxu a nebo pomocí aplikací třetích stran).

/certificate
add name=myCa country="CZ" state="<kraj>" organization="<název fimy>" locality="<mesto>" unit="IT" common-name=myCa key-usage=key-cert-sign,crl-sign days-valid=5475

Podepíšeme CA (jako CRL host použij IP VPN serveru)

/certificate
sign myCa ca-crl-host=<IP VPN serveru> name=myCa

Jakmile máme certifikační autoritu, můžeme vytvořit certifikát serveru (VPN serveru)

/certificate
add name=VPNserver country="CZ" state="<kraj>" organization="<název fimy>" locality="<mesto>" unit="IT" common-name=VPNserver key-usage=digital-signature,key-encipherment,tls-server days-valid=3650

A podepíšeme opět

/certificate
sign VPNserver ca=myCa name= VPNserver

A do třetice je potřeba ještě vytviřit certifikát(y) pro klienty. Můžete použít stejný Certifikát pro všechny klienty, a nebo každému klientu vygenerovat jeden. Rozhodnutí je na Vás, v obou případech to bude fungovat.

/certificate
add name=client1 common-name=client1
sign client1 ca=myCa name=client1

Pokud by jste chtěli vyplnit více informací do klientských certifikátu, tak je to potřeba udělat před podepsáním.

Jeste je potreba nastavit, aby certifikát Serveru a CA měl flag T (Trusted). Ověřit si to můžete pomocí příkazu

/certifikate print

Pokud není, přidat do Trusted můžete pomocí přikazu

set myCa trusted=yes
set VPNserver trusted=yes

To by bylo k certifikátům asi vše. Teď už je potřeba je jen vyexportovat. Pro klienta je potřeba mít Certifikát CA a klientský certifikát a ještě k tomu privátní klíč . Export provedeme těmito příkazy. Kliče si stáhneme do počítače, později se k ním vrátíme.

/certificate
export-certificate myCa
export-certificate client1 export-passphrase=<zvolte si heslo pro zasifrovani privátního klice>

POZOR!

Pokud budete používat mobilního klienta na Androidu (nebo iOS), tak zřejmě narazíte na problém jako já, že klient si neporadil se zašifrovaným privátním klíčem. Takže je ho potřeba dešifrovat. K tomuto si budete muset stáhnout z internetu openssl (pro windows jsem použil odkaz https://sourceforge.net/projects/openssl/) a pomocí tohoto příkazu provedete dešifrování:

openssl rsa –in <cesta k zasifrovanemu klici> -out <nový>

př: openssl rsa –in enc.key -out dec.key

Jen pro informaci. Takhle vypadá zašifrovaný privátní klíč

—–BEGIN ENCRYPTED PRIVATE KEY—–

A takhle dešifrovaný privátní klíč

—–BEGIN RSA PRIVATE KEY—–

Vytvoříme si IP pooly. Zde bych se také pozastavil a vysvětlil jednu důležitou věc.

Při vytváření jakékoliv lokální sítě obvykle používáme adresy z privátního prostoru (více o privátním prostoru na wiki https://cs.wikipedia.org/wiki/Priv%C3%A1tn%C3%AD_s%C3%AD%C5%A5). Nejčastěji používaná síť je 192.168.0.0./16. Tuto síť naleznete na většině domácích routeru (krom O2, ti používají 10.0.0.0/8). Tím pádem bych se vyhnul používání lokální sítě 192.168.x.x na Mikrotik routeru který bude OpenVPN server. Důvod je velice prostý, jelikož při konfiguraci klienta obvykle využíváme routy, které nám určují, do které sítě se chceme skrze VPN připojit. Pokud by jste měli stejnou síť v kavárně (kde budete jako klient) a na routeru (kam se budete připojovat), mohlo by se stát, že by routy nefungovaly správně.

Takže má doporučení je si nastavit vaší lokální síť (kam se budete připojovat) z rozsahu 172.16.0.0/16 a virtuální VPN síť z rozsahu 10.0.0.0/8

Zpět ke konfiguraci poolu. Pro demonstraci více profilu si vytvoříme dva pooly.

/ip pool add name=ovpn-pool-1 ranges=10.20.30.10 – 10.20.30.20
/ip pool add name=ovpn-pool-2 ranges=10.20.40.10 – 10.20.40.20

Vytvoříme VPN profily a zvolíme si naše vytvořené pooly jako remote address

/ppp profile add local-address=10.20.30.1 name=ovpn-profile-1 remote-address=ovpn-pool-1
/ppp profile add local-address=10.20.40.1 name=ovpn-profile-2 remote-address=ovpn-pool-2

Nyní si vytvoříme libovolný počet uživatelů a přidáme do vytvořených profilů

/ppp secret
add name=<client> password=<password> profile= ovpn-pool-1
add name=<client> password=<password> profile= ovpn-pool-2

Došli jsme k nejpodstatnějsí věci a to je zapnutí OpenVPN serveru

/interface ovpn-server server
set auth=sha1 certificate=VPNserver cipher=aes256 enabled=yes keepalive-timeout=60 max-mtu=1400 require-client-certificate=yes mode=ip netmask=24 default-profile=default

Ještě povolíme defalt port pro OpenVPN 1194 na firewallu

/ip firewall filter add chain=input dst-port=1194 protocol=tcp

KLIENT

Jako názorný přiklad si vezmene Windows klient. Takže pro windows si stáhneme OVPN client z oficialních stránek openvpn.net a nainstalujeme. Po instalaci si otevřeme složku z konfiguračními soubory (nacházi se v Program Files ve složce kde jste nainstalovali OpenVPN). Zde také nalezneme sample konfigurační soubor. Ten upravíme podle vašeho nastavení serveru. Zde jen vypíchnu důležité řádky.

Mikrotik umí pouze TCP

proto tcp

Certifikát CA a klientsky certifikát spolu s privatním klíčem je potřeba nakopírovat do stejné složky jako konfigurační soubor pro vpn. V konfiguraku se poté odkážeme na tyto soubory.

ca myCa.crt
cert client.crt
key client.key

Nastavení cipher a auth stejné jako na serveru

cipher AES-256-CBC
auth SHA1

Tento příkaz vynutí zadání uživatelského jména a hesla

auth-user-pass

A ještě routy. Mikrotik bohužel neumí přidělit routy ze serveru jako Linuxovy OVPN server

route 172.16.15.0 255.255.255.0

Pokud jste všechno správně nakonfigurovali, tak by jste se měli připojit.

Klient (Android, iOS)

Jelikož jsem nedávno strávil docela docela dost hodin na zprovoznění klienta na iOS, rád bych se podělil o mé zkušenosti.

První věc, kterou bylo potřeba vyřešit, byly externí soubory.  Ty bylo potřeba „vložit“ do konfiguračního souboru. OpenVPN to nazývá „unified format“ (viz vzor konfiguračního souboru níže)

Dále je potřeba na iOS nějak dopravit konfigurační soubor do Mobilu. Já použil email. Soubory s příponou *.ovpn se automaticky asociují s aplikaci OpenVPN, takže stačí otevřít a projít průdovdce.

Vzor konfiguračního souboru pro iOS (snažte se vyhnout prázdným řádkům)

client
dev tun
proto tcp
remote <remote IP> 1194
resolv-retry infinite
nobind
persist-key
persist-tun
auth-user-pass
reneg-sec 0
verb 3
auth SHA1
cipher AES-256-CBC
route 10.10.10.0 255.255.255.0
<ca>
-----BEGIN CERTIFICATE-----
<your cert here>
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
<your cert here>
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN RSA PRIVATE KEY-----
<your cert here>
-----END RSA PRIVATE KEY-----
</key>

FIREWALL

Jak jsem již psal na začátku, požadavek byl, aby uživetelé z daných VPN profilu měli omezený přístup v síti pouze pro určité servery. Toho je možné docílit na firewallu tím, že omezíme přístup na rozsahy IP address, které jsme přidělili ke každému profilu.

Abychom neměli ve Firewallu nepořádek a hlavně abychom ulehčili hardware, využijeme tzv. Jumpu. Tento trik mě naučil můj velice chytrý kamarád, kterému tímto moc děkuji.

Jako první pravidlo ve firewallu nastavíme tento řádek. V podstatě říká že veškerý traffic ze všech VPN interface, který dále pokračuje do bridge pošli do chainu s názvem OVPN (takže ostatní pravidla přeskočí a pokračuje v řetězci OVPN)

/ip firewall filter add chain=forward in-interface all-ppp out-interface bridge action=jump jump-target=OVPN

Nastavíme zahazování

/ip firewall filter add chain=OVPN action=drop

A nyní můžete přidávat pravidla pro různe VPN profily a jako zdrojový IP subnet použit VPN pool který jsme si vytovřili na začátku.
Příklad povolit pouze přístup na 172.16.15.100 z VPN poolu 10.20.30.x

/ip firewall filter add chain=OVPN src-address 10.20.30.0/24 dst-address 172.16.15.100 action=accept

Nezapomente mít pravidlo na zahazovnání paketu vždy na konci.

6 thoughts on “Konfigurace OpenVPN serveru na Mikrotiku

  1. lukas

    Zjistil jsem drobný problém, při připojení (win10) přes OpenVPN 2.4.5-I601 se mi zobrazí v logu v Mikrotiku v6.41.2 chyba „duplicate packet dropping“, hledal jsem na googlu, ale nikde jsem nenašel odpověď proč tomu tak je. Jinak funguje vše jak má.
    Díky za radu.

    Reply
    1. Petr

      Do konfigurace je opravdu nutné zahrnout parametr auth-user-pass, protože mikrotik neumožnuje připojení bez jména a bez hesla.
      Tedy jméno musí být vždy a to zhodné s názvem profilu ppp!!! Heslo být už nemusí, ale na straně klienta(windows), zřemě nelze nakonfigurovat kombinace jméno/(Nelze to zautomatizovat, tak aby uživatel nemul nic zadávat.)
      Duplicity paketů openvpn na straně mikrotiku nebrání zprovoznění tunelu!!!
      Fatal TLS error taky pramění z nezadaného jména a hesla openvpn klienta…

      Reply
  2. Jiří

    Dobrý den,

    bohužel mi to dle vašeho návodu pořád nechce fungovat.
    Server je RouterOS v6.35.2 klient OpevVPN klient v2.4.4.
    Certifkáty mám vygenerované, nějakým způsobem asi budou správně, protože když dám klientský na jiný MK, bezproblémů se spojí a vše funguje. Ale když se snažím mít klienta OpenVPN klienta na PC tak mi to háže tuto chybu…
    Děkuji za reakci a pomoc.

    celý log níže

    Tue Apr 10 03:58:59 2018 OpenVPN 2.4.4 x86_64-w64-mingw32 [SSL (OpenSSL)] [LZO] [LZ4] [PKCS11] [AEAD] built on Sep 26 2017
    Tue Apr 10 03:58:59 2018 Windows version 6.1 (Windows 7) 64bit
    Tue Apr 10 03:58:59 2018 library versions: OpenSSL 1.0.2l 25 May 2017, LZO 2.10
    Enter Management Password:
    Tue Apr 10 03:58:59 2018 MANAGEMENT: TCP Socket listening on [AF_INET]127.0.0.1:25340
    Tue Apr 10 03:58:59 2018 Need hold release from management interface, waiting…
    Tue Apr 10 03:58:59 2018 MANAGEMENT: Client connected from [AF_INET]127.0.0.1:25340
    Tue Apr 10 03:58:59 2018 MANAGEMENT: CMD ‚state on‘
    Tue Apr 10 03:58:59 2018 MANAGEMENT: CMD ‚log all on‘
    Tue Apr 10 03:58:59 2018 MANAGEMENT: CMD ‚echo all on‘
    Tue Apr 10 03:58:59 2018 MANAGEMENT: CMD ‚hold off‘
    Tue Apr 10 03:58:59 2018 MANAGEMENT: CMD ‚hold release‘
    Tue Apr 10 03:59:00 2018 MANAGEMENT: CMD ‚username „Auth“ „T-Mobile1″‚
    Tue Apr 10 03:59:00 2018 MANAGEMENT: CMD ‚password […]‘
    Tue Apr 10 03:59:00 2018 WARNING: –ns-cert-type is DEPRECATED. Use –remote-cert-tls instead.
    Tue Apr 10 03:59:01 2018 MANAGEMENT: CMD ‚password […]‘
    Tue Apr 10 03:59:01 2018 WARNING: this configuration may cache passwords in memory — use the auth-nocache option to prevent this
    Tue Apr 10 03:59:01 2018 TCP/UDP: Preserving recently used remote address: [AF_INET]91.139.11.182:1194
    Tue Apr 10 03:59:01 2018 Socket Buffers: R=[8192->8192] S=[8192->8192]
    Tue Apr 10 03:59:01 2018 Attempting to establish TCP connection with [AF_INET]91.139.11.182:1194 [nonblock]
    Tue Apr 10 03:59:01 2018 MANAGEMENT: >STATE:1523325541,TCP_CONNECT,,,,,,
    Tue Apr 10 03:59:02 2018 TCP connection established with [AF_INET]91.139.11.182:1194
    Tue Apr 10 03:59:02 2018 TCP_CLIENT link local: (not bound)
    Tue Apr 10 03:59:02 2018 TCP_CLIENT link remote: [AF_INET]91.139.11.182:1194
    Tue Apr 10 03:59:02 2018 MANAGEMENT: >STATE:1523325542,WAIT,,,,,,
    Tue Apr 10 03:59:02 2018 MANAGEMENT: >STATE:1523325542,AUTH,,,,,,
    Tue Apr 10 03:59:02 2018 TLS: Initial packet from [AF_INET]91.139.11.182:1194, sid=db5aab02 71204ff2
    Tue Apr 10 03:59:02 2018 OpenSSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
    Tue Apr 10 03:59:02 2018 TLS_ERROR: BIO read tls_read_plaintext error
    Tue Apr 10 03:59:02 2018 TLS Error: TLS object -> incoming plaintext read error
    Tue Apr 10 03:59:02 2018 TLS Error: TLS handshake failed
    Tue Apr 10 03:59:02 2018 Fatal TLS error (check_tls_errors_co), restarting
    Tue Apr 10 03:59:02 2018 SIGUSR1[soft,tls-error] received, process restarting
    Tue Apr 10 03:59:02 2018 MANAGEMENT: >STATE:1523325542,RECONNECTING,tls-error,,,,,
    Tue Apr 10 03:59:02 2018 Restart pause, 5 second(s)

    Reply
    1. Petr

      Do konfigurace je opravdu nutné zahrnout parametr auth-user-pass, protože mikrotik neumožnuje připojení bez jména a bez hesla.
      Tedy jméno musí být vždy a to zhodné s názvem profilu ppp!!! Heslo být už nemusí, ale na straně klienta(windows), zřemě nelze nakonfigurovat kombinace jméno/(Nelze to zautomatizovat, tak aby uživatel nemul nic zadávat.)
      Duplicity paketů openvpn na straně mikrotiku nebrání zprovoznění tunelu!!!
      Fatal TLS error taky pramění z nezadaného jména a hesla openvpn klienta…

      Reply

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *