OpenVPN Access Server gør det nemt at opsætte og konfigurere en VPN. Noget der kan være ret kompliceret at gøre manuelt, især hvis det ikke er noget man er van til at arbejde med.
Den er gratis at bruge for op til 2 aktive forbindelser, og dermed fin til mit setup.
Indholdsfortegnelse
Formål
Jeg har angivet her hvad formålet med denne VPN er, fordi at resten af dokumentet naturligvis afspejler dette.
Det skal også siges at jeg på ingen måde er ekspert, og at der derfor kan komme rettelser til nedenstående notater i fremtiden.
Det jeg skal bruge denne VPN til, er adgang udefra ind i et lokalt netværk. Fra klienten vil det kun være trafik til dette netværk der går gennem VPN. Alt hvad der ellers sker på klienten (videochat, surfe på nettet) vil ikke gå gennem denne VPN server.
Installation
Følgende er udført på en Ubuntu 20.04 LTS. Men OpenVPN Access Server har installationspakker til flere forskellige distroer.
OpenVPN Access Server installation: https://openvpn.net/download-open-vpn/
I skrivende stund er nedenstående den anbefalede metode til installation af OpenVPN Access Server (openvpn-as) på Ubuntu.
Da jeg allerede har ca-certificates, wget, net-tools og gnupg kan jeg springe det over (linie 2). Hvis du lige har kørt en apt update
, kan du også skippe den, og dermed gå direkte til wget
i linie 3.
1 2 3 4 5 |
# apt update # apt -y install ca-certificates wget net-tools gnupg # wget -qO - https://as-repository.openvpn.net/as-repo-public.gpg | apt-key add - # echo "deb http://as-repository.openvpn.net/as/debian focal main">/etc/apt/sources.list.d/openvpn-as-repo.list # apt update && apt -y install openvpn-as |
Og ja, du skal lave en apt update
i linie 4 for at din install vil fungere…
Hvis du efter apt update
får denne fejl:
N: Skipping acquire of configured file ‘main/binary-i386/Packages’ as repository ‘http://as-repository.openvpn.net/as/debian focal InRelease’ doesn’t support architecture ‘i386
Løser du det ved at føje [arch adm64] til linien i repo filen:
1 2 3 |
/etc/apt/sources.list.d/openvpn-as-repo.list: deb [arch=amd64] http://as-repository.openvpn.net/as/debian focal main |
Derefter apt update
igen.
Administration
Bemærk i output for installationen der afslutter med information om hvordan du tilgår admin og klient UI. Ip adressen (som i nedenstående er et tænkt eksempel) vil være din servers offentlige ip.
1 2 3 4 5 6 7 8 9 |
+++++++++++++++++++++++++++++++++++++++++++++++ Access Server 2.8.6 has been successfully installed in /usr/local/openvpn_as Configuration log file has been written to /usr/local/openvpn_as/init.log Access Server Web UIs are available here: Admin UI: https://123.456.789.123:943/admin Client UI: https://123.456.789.123:943/ +++++++++++++++++++++++++++++++++++++++++++++++ |
Nu skal adgangskoden til openvpn administratoren sættes:
1 |
passwd openvpn |
Du kan nu logge ind på Admin UI med brugeren openvpn og den valgte adgangskode i din browser. Din browser vil beklage sig over at siden er usikker fordi din server ikke er en officielt anerkendt CA og dit certifikat er self-signed, men det ignorerer du bare (for nu) og fortsætter.
Efter login bliver du muligvis mødt af en formular til indtastning af en såkaldt Activation Key… men det er kun aktuelt hvis du har købt en licens.
Gå til Configuration -> VPN Settings.
Det lokale netværk som denne VPN giver adgang til, hedder 10.42.24.0/24. Jeg har derfor i Dynamic IP Address Network angivet 10.42.25.0/24 til VPN’en.
Should client Internet traffic be routed through the VPN?, er sat til “No” fordi denne VPN kun skal bruges som adgang udefra ind i et lokalt netværk.
Group Default IP Address Network (Optional) er blank.
Specify the private subnets to which all clients should be given access (one per line), har værdien 10.42.24.0/24, svarende til hele mit private/lokale netværk.
Gå til User Management -> User Permissions og tilføj en bruger. Tryk på More settings ud for brugeren og sæt en adgangskode.
Gå til Configuration -> Network Settings og scroll ned til Admin Web Server. Hvis du foretrækker at Web GUI kun er tilgængeligt via det lokal netværk, kan du angive Yes ud for den lokale ip adresse og No ud for Listen on all interfaces. Bemærk at når du gemmer denne ændring og genstarter servicen, kan admin GUI ikke forbinde påny, da du stadig er på den offentligt tilgængelige ip i din browsers adressebar. Du skal derfor ændre ip adressen til admin GUI i din browser, og logge ind påny.
Forhindre adgang udefra til Web GUI
Bemærk: Dette løsning kræver at du har udført det der står længere nede i denne artikel under Portkonflikt med Apache -> Drop port 443 for VPN.
Ja, der er login på Web GUI’et, men jeg bryder mig ikke om at afsløre at der ligger et VPN Web GUI tilgængeligt. Jeg foretrækker at der kun er adgang til dette via VPN eller min ip adresse derhjemme.
Og adgangen må kun ske via det subdomæne jeg har valgt til formålet.
Du vil dog opdage at det er totalt ligegyldigt hvad du lægger ind af regler i UFW. OpenVPN AS opdaterer nemlig reglerne direkte i iptables hver gang du ændrer dens konfiguration, og insisterer på at der skal være offentlig adgang.
Jeg har derfor ændret netværksindstillingerne, dvs. Configuration -> Network Settings således at Web GUI’et kun lytter på det lokale netværk. Udfordringen ved det er, at det nu ikke længere fungerer med det domæne du har peget over på serveren via DNS. Derfor lader jeg nu Apache håndtere domænet, og det giver også den fordel, at jeg nu har fuld kontrol over hvem og hvad der har adgang.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<VirtualHost *:443> ServerName vpn.domain.com DocumentRoot /var/www <Location "/"> #Hjemme Require ip 12.34.56.78 #Local network Require ip 10.42.24.0/24 #VPN network Require ip 10.42.25.0/24 </Location> ProxyRequests off SSLProxyEngine on ProxyPreserveHost On ProxyErrorOverride Off ProxyPass / https://10.42.24.3:943/ ProxyPassReverse / https://10.42.24.3:943/ LogLevel debug ErrorLog "|/usr/bin/rotatelogs -l /var/log/apache2/vpn.domain.com/error.%Y.%m.%d 86400" CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/vpn.domain.com/access.%Y.%m.%d 86400" combined SSLEngine on SSLCertificateFile /etc/letsencrypt/live/vpn.domain.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/vpn.domain.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> </VirtualHost> |
Valide TLS certifikater
Jeg har Web GUI’et tilgængeligt på en offentlig ip, og har peget et subdomæne over på denne ip i DNS. Med LetsEncrypt har jeg oprettet certifikater til domænet, og disse kan nu uploades via Admin:
Gå til Configuration -> Webserver og upload dine certifikater:
Private key: privkey.pem
Certificate: fullchain.pem
Ca Bundle: chain.pem
Udfordringen er naturligvis nu, at disse LetsEncrypt certifikater skal udskiftes hver 3. måned. Hvis du vil automatisere den opgave, kan certifikaterne også lægges i databasen via kommandolinien:
1 2 3 |
sacli --key "cs.priv_key" --value_file "/etc/letsencrypt/live/vpn.domain.com/privkey.pem" ConfigPut sacli --key "cs.cert" --value_file "/etc/letsencrypt/live/vpn.domain.com/fullchain.pem" ConfigPut sacli --key "cs.ca_bundle" --value_file "/etc/letsencrypt/live/vpn.domain.com/chain.pem" ConfigPut |
Nu kan du teste certifikaterne:
1 |
sacli --ca_bundle=/etc/letsencrypt/live/vpn.domain.com/chain.pem --cert=/etc/letsencrypt/live/vpn.domain.com/fullchain.pem --priv_key=/etc/letsencrypt/live/vpn.domain.com/privkey.pem TestWebCerts |
Hvis alt er som det skal være, ser du information om, og indholdet af certificaterne. Der må ikke være nogen fejl eller advarsler.
Til sidst skal “Access Server” web service genstartes:
1 |
sacli start |
Se også: Managing Settings For The Web Services From The Command Line
Forbind en klient
Gå til https://123.456.789.123/ (erstat med din servers ip) og log på med den bruger du lige har lavet. Din browser downloader nu automatisk en konfigurationsfil der hedder client.ovpn, og alternativt kan du hente den manuelt ved at klikke på linket nederst på siden.
Nu skal du konfigurere den enhed du ønsker at forbinde fra (Laptop, stationær, mobil eller lign.). Her skal du finde ud af hvilken VPN klient du vil benytte til formålet.
Jeg har en laptop med Fedora og det åbenlyse valg er derfor Network Manager.
Åben Network Manager og vælg Network. Tryk på plus (+) ud for VPN og vælg Import from file…
Vælg din *.ovpn fil og indtast brugernavn og adgangskode.
Gå til IPv4 fanebladet. Under Routes angiver du dit netværk:
Address: 10.42.24.0
Netmask: 255.255.255.0
Gateway: 0.0.0.0
Metric: 10
… og sætter flueben i Use this connection only for resources on this network.
Herefter bør du kunne forbinde din VPN.
Portkonflikt med Apache
Jeg er i en situation hvor jeg gerne ville køre Apache på samme maskine, og det er et problem for så har vi lige pludselig 2 services der gerne vil lytte på port 443.
OpenVPN benytter port 443 som en slags backup i tilfælde af at man sidder bag en firewall og ikke kan bruge port 943 (Web GUI) eller port 1194 (VPN forbindelsen).
Der er umiddelbart 2 løsninger:
Drop port 443 for VPN:
Man kan sagtens bare droppe at bruge port 443 for VPN forbindelser og Web GUI.
Gå til Configuration -> Network Settings og vælge “UDP” under Protocol frem for “Both”.
Nu kan Web GUI ikke længere tilgås uden angivelse af portnummer 943.
Konfiguration ved port 443 skal også fjernes fra eksisterende VPN klienters konfiguration.
Det betyder naturligvis, at brugere der sidder på et hotel eller bare generelt et sted hvor firewalls ikke tillader ret meget andet end gængs webtrafik, ikke kan forbinde, medmindre du tillader en anden gængs port udover 1194, som f.eks. port 4500 der ofte bliver benyttet af brugere på Microsoft VPN forbindelser.
Brug port-share til at dirigere trafik fra OpenVPN til Apache
Konfigurer en anden TLS port til Apache i /etc/apache2/ports.conf, f.eks. 22443 i stedet for 443.
Konfigurer OpenVPN AS til at videresende trafikken… :
1 2 3 4 5 6 7 |
# sacli ligger under usr/local/openvpn_as/scripts på Ubuntu: ./sacli --key "vpn.server.port_share.enable" --value "true" ConfigPut ./sacli --key "vpn.server.port_share.service --value "custom" ConfigPut ./sacli --key "vpn.server.port_share.ip_address --value 10.42.24.3 ConfigPut ./sacli --key "vpn.server.port_share.port --value 22443 ConfigPut ./sacli start |
Det skal lige siges, at jeg ikke har ikke afprøvet ovenstående (endnu).