Ako nainštalovať OpenConnect VPN Server na Ubuntu 22.04


Na tejto stránke

  1. Predpoklady
  2. Krok 1 - Nakonfigurujte bránu firewall
  3. Krok 2 - Nainštalujte Git
  4. Krok 3 - Nainštalujte OpenConnect
  5. Krok 4 - Vygenerujte certifikáty SSL
  6. Krok 5 – Nakonfigurujte OpenConnect
  7. Krok 6 - Spustite OpenConnect Server
  8. Krok 7 – Vytvorte si účty VPN
  9. Krok 8 - Povoľte presmerovanie IP
  10. Krok 9 – Nakonfigurujte maskovanie IP
  11. Krok 10 - Pripojte sa pomocou klienta OpenConnect
  12. Záver

OpenConnect VPN alias ocserv je open source bezplatné riešenie VPN s výkonom a funkciami na podnikovej úrovni. Je založený na protokole Cisco AnyConnect VPN, ktorý je široko používaný v podnikovom priemysle. V tomto návode sa naučíte, ako nainštalovať server OpenConnect VPN na počítači Ubuntu 22.04. Dozviete sa tiež, ako používať klienta OpenConnect na pripojenie k serveru.

Predpoklady

    Server so systémom Ubuntu 22.04.

    Používateľ bez oprávnenia root s oprávneniami sudo.

    Plne kvalifikovaný názov domény (FQDN), napríklad vpn.example.com.

    Uistite sa, že je všetko aktualizované.

    $ sudo apt update
    $ sudo apt upgrade
    

    Niekoľko balíkov, ktoré váš systém potrebuje.

    $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
    

    Niektoré z týchto balíkov už môžu byť vo vašom systéme nainštalované.

Krok 1 - Nakonfigurujte bránu firewall

Prvým krokom je konfigurácia brány firewall. Ubuntu sa štandardne dodáva s ufw (Nekomplikovaný firewall).

Skontrolujte, či je spustený firewall.

$ sudo ufw status

Mali by ste dostať nasledujúci výstup.

Status: inactive

Povoľte port SSH, aby firewall pri jeho povolení neprerušil aktuálne pripojenie.

$ sudo ufw allow OpenSSH

Povoliť aj porty HTTP a HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Povoľte bránu firewall

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Znova skontrolujte stav brány firewall.

$ sudo ufw status

Mali by ste vidieť podobný výstup.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Krok 2 - Nainštalujte Git

Krok 3 - Nainštalujte OpenConnect

Ubuntu 22.04 sa dodáva so staršou verziou (1.1.3) OpenConnect. Ak ste s tým spokojní, môžete ho nainštalovať pomocou nasledujúceho príkazu.

$ sudo apt install ocserv

Pre tento tutoriál však nainštalujeme najnovšiu verziu (1.1.6) OpenConnect. Na to ho budeme musieť postaviť zo zdroja.

Nainštalujte závislosti potrebné na zostavenie zdroja.

$ sudo apt install -y libgnutls28-dev libev-dev libpam0g-dev liblz4-dev libseccomp-dev \
	libreadline-dev libnl-route-3-dev libkrb5-dev libradcli-dev \
	libcurl4-gnutls-dev libcjose-dev libjansson-dev libprotobuf-c-dev \
	libtalloc-dev libhttp-parser-dev protobuf-c-compiler gperf \
	nuttcp lcov libuid-wrapper libpam-wrapper libnss-wrapper \
	libsocket-wrapper gss-ntlmssp haproxy iputils-ping freeradius \
	gawk gnutls-bin iproute2 yajl-tools tcpdump autoconf automake

Naklonujte úložisko ocserv Git.

$ git clone https://gitlab.com/openconnect/ocserv.git

Prepnite sa do klonovaného adresára.

$ cd ocserv

Vytvorte konfiguračné skripty.

$ autoreconf -fvi

Kompilujte zdrojový kód. Ignorujte všetky zastarané upozornenia.

$ ./configure && make

Nainštalujte ocserv.

$ sudo make install

Súbory sa nainštalujú do adresárov /usr/local/bin a /usr/local/sbin. Skopírujte servisný súbor systemd.

$ sudo cp doc/systemd/standalone/ocserv.service /etc/systemd/system/ocserv.service

Otvorte súbor služby na úpravu.

$ sudo nano /etc/systemd/system/ocserv.service

V nasledujúcom riadku zmeňte cestu k binárnemu súboru ocserv

$ ExecStart=/usr/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf

na nasledujúce.

$ ExecStart=/usr/local/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Znovu načítajte systémového démona.

$ sudo systemctl daemon-reload

Krok 4 - Vygenerujte certifikáty SSL

Na vygenerovanie certifikátu SSL musíme nainštalovať Certbot. Certbot môžete nainštalovať pomocou úložiska Ubuntu alebo získať najnovšiu verziu pomocou nástroja Snapd. Budeme používať verziu Snapd.

Ubuntu 22.04 sa štandardne dodáva s nainštalovaným Snapd. Spustite nasledujúce príkazy, aby ste sa uistili, že vaša verzia Snapd je aktuálna.

$ sudo snap install core && sudo snap refresh core

Nainštalujte Certbot.

$ sudo snap install --classic certbot

Pomocou nasledujúceho príkazu zaistite spustenie príkazu Certbot vytvorením symbolického odkazu na adresár /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Pokiaľ ide o generovanie certifikátu SSL, existujú dve možnosti. Ak na svojom systéme nemáte spustený webový server, môžete na vygenerovanie certifikátu použiť samostatnú metódu. Spustite nasledujúci príkaz na vytvorenie certifikátu pomocou samostatného doplnku pre Certbot.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d vpn.example.com

Vyššie uvedený príkaz stiahne certifikát do adresára /etc/letsencrypt/live/vpn.example.com na vašom serveri.

Ďalej, ak máte na svojom systéme spustený server, môžete použiť doplnok webroot alebo doplnky Nginx alebo Apache, ak ich používate. Pre servery Nginx alebo Apache môžete jednoducho spustiť príkaz uvedený nižšie.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d vpn.example.com

alebo

$ sudo certbot certonly --apache --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d vpn.example.com

Ak máte iný server, budeme musieť použiť doplnok webroot. Za týmto účelom vytvorte koreňový webový adresár.

$ sudo mkdir -p /var/www/ocserv

Nastavte server ako vlastníka webového koreňového adresára. V našom prípade používame ako používateľa servera www-data.

$ sudo chown www-data:www-data /var/www/ocserv -R

Ďalej nakonfigurujte svoj server tak, aby obsluhoval doménu vpn.example.com v adresári /var/www/ocserv. Reštartujte server. Potom vygenerujte certifikát pomocou nasledujúceho príkazu.

$ sudo certbot certonly --webroot --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email  -d vpn.example.com

Skontrolujte službu plánovača obnovy Certbot.

$ sudo systemctl list-timers

Ako jednu zo služieb naplánovaných na spustenie nájdete snap.certbot.renew.service.

NEXT                        LEFT          LAST                        PASSED        UNIT                       ACTIVATES
Wed 2023-04-19 10:31:47 UTC 2h 55min left Wed 2023-04-19 03:31:58 UTC 4h 3min ago   ua-timer.timer             ua-timer.service
Wed 2023-04-19 12:02:42 UTC 4h 26min left Wed 2023-04-19 03:19:20 UTC 4h 16min ago  motd-news.timer            motd-news.service
Wed 2023-04-19 18:19:56 UTC 10h left      Wed 2023-04-19 07:19:52 UTC 16min ago     apt-daily.timer            apt-daily.service
Wed 2023-04-19 22:51:00 UTC 15h left      n/a                         n/a           snap.certbot.renew.timer   snap.certbot.renew.service

Vykonajte suchý chod procesu a skontrolujte, či obnovenie SSL funguje správne.

$ sudo certbot renew --dry-run

Ak nevidíte žiadne chyby, všetko je nastavené. Váš certifikát sa automaticky obnoví.

Krok 5 – Nakonfigurujte OpenConnect

Ak máte nainštalovaný ocserv pomocou APT, konfiguračný súbor by už mal byť dostupný v umiestnení /etc/ocserv/ocserv.conf. Ak ste však zostavili balík zo zdroja, musíme skopírovať konfiguračný súbor.

Vytvorte adresár pre konfiguračný súbor.

$ sudo mkdir /etc/ocserv

Skopírujte konfiguračný súbor.

$ sudo cp /home/username/ocserv/doc/sample.config /etc/ocserv/ocserv.conf

Otvorte súbor na úpravu.

$ sudo nano /etc/ocserv/ocserv.conf

Zmeňte hodnotu parametra auth na nasledujúcu. To umožní používateľom používať samostatné účty VPN.

auth = "plain[passwd=/etc/ocserv/ocpasswd]"

OpenConnect štandardne používa 443 TCP a UDP portov. Na pripojenie budeme používať iba TCP port, preto zakážte port UDP zakomentovaním.

tcp-port = 443
#udp-port = 443

Ak máte webový server spustený na porte 443, zmeňte hodnotu TCP portu zmenou hodnoty.

tcp-port = 8443

Ďalej nájdite premenné server-crt a server-key a zmeňte ich hodnoty nasledovne.

server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pem
server-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem

Nastavte maximálny povolený počet klientov. Predvolená hodnota je 16. Nastavte ako 0 pre neobmedzené.

max-clients = 16

Nastavte počet zariadení, ktoré môže používateľ používať súčasne. Predvolená hodnota je 2. Nastavte ako 0 pre neobmedzené.

max-same-clients = 2

V predvolenom nastavení OpenConnect odosiela udržiavacie pakety každých 9 hodín (32 400 sekúnd). Toto je príliš vysoká hodnota. Nastavte ho na 60 sekúnd, aby ste znížili pravdepodobnosť výpadku pripojenia VPN.

keepalive = 60

Zmeňte hodnotu try-mtu-discovery na true, aby ste povolili zisťovanie MTU. Dokáže optimalizovať výkon VPN.

try-mtu-discovery = true

Nakonfigurujte čas, počas ktorého môže klient zostať nečinný pred odpojením, zrušením komentárov nasledujúcich premenných. Ak chcete, aby klient zostal pripojený na neurčito, nechajte ho tak, ako je.

idle-timeout=1200
mobile-idle-timeout=1800

Nastavte predvolený názov domény pre OpenConnect VPN.

default-domain = vpn.example.com

Zmeňte predvolenú konfiguráciu IPv4, aby ste predišli kolízii IP adries. Ako hodnotu použijeme 10.10.10.0.

ipv4-network = 10.10.10.0

Odkomentujte nasledujúci riadok, aby ste tunelovali všetky DNS dotazy cez VPN.

tunnel-all-dns = true

Zmeňte DNS resolver na Google DNS. Pridajte aj druhý záznam.

dns = 8.8.8.8
dns = 8.8.4.4

Okomentujte všetky parametre trasy pridaním symbolu hash (#) pred ne.

#route = 10.10.10.0/255.255.255.0
#route = 192.168.0.0/255.255.0.0
#route = fef4:db8:1000:1001::/64
#route = default

# Subsets of the routes above that will not be routed by
# the server.

#no-route = 192.168.5.0/255.255.255.0

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Krok 6 - Spustite OpenConnect Server

Spustite server OpenConnect VPN.

$ sudo systemctl start ocserv

Skontrolujte stav služby.

$ sudo systemctl status ocserv

Získate podobný výstup.

? ocserv.service - OpenConnect SSL VPN server
     Loaded: loaded (/etc/systemd/system/ocserv.service; disabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-04-20 08:52:18 UTC; 2s ago
       Docs: man:ocserv(8)
   Main PID: 19965 (ocserv-main)
      Tasks: 2 (limit: 1026)
     Memory: 1.4M
        CPU: 9ms
     CGroup: /system.slice/ocserv.service
             ??19965 ocserv-main  
             ??19966 ocserv-sm 

Apr 20 08:52:18 openconnect ocserv[19965]: note: skipping 'pid-file' config option
Apr 20 08:52:18 openconnect ocserv[19965]: note: vhost:default: setting 'plain' as primary authentication method
Apr 20 08:52:18 openconnect ocserv[19965]: error connecting to sec-mod socket '/var/run/ocserv-socket.a4413bc9': No such file or directory
Apr 20 08:52:18 openconnect ocserv[19965]: note: setting 'file' as supplemental config option
Apr 20 08:52:18 openconnect ocserv[19965]: listening (TCP) on 0.0.0.0:443...
Apr 20 08:52:18 openconnect ocserv[19965]: listening (TCP) on [::]:443...
Apr 20 08:52:18 openconnect ocserv[19966]: ocserv[19966]: sec-mod: reading supplemental config from files
Apr 20 08:52:18 openconnect ocserv[19966]: sec-mod: reading supplemental config from files
Apr 20 08:52:18 openconnect ocserv[19966]: ocserv[19966]: sec-mod: sec-mod initialized (socket: /var/run/ocserv-socket.a4413bc9.0)
Apr 20 08:52:18 openconnect ocserv[19966]: sec-mod: sec-mod initialized (socket: /var/run/ocserv-socket.a4413bc9.0)

Ak sa zobrazí chyba týkajúca sa pripojenia k sec-mod socket, ignorujte ju. Je to normálne. Ak súbor nenájde, inicializuje ho.

Krok 7 – Vytvorte si účty VPN

Účty VPN môžete vytvoriť pomocou pomôcky ocpasswd. Spustite nasledujúci príkaz a vytvorte nový účet VPN.

$ sudo ocpasswd -c /etc/ocserv/ocpasswd username
Enter password:
Re-enter password:

Heslo sa uloží do súboru /etc/ocserv/ocpasswd. Ak chcete obnoviť heslo pre používateľské meno, znova spustite vyššie uvedený príkaz. Spustite vyššie uvedený príkaz s iným používateľom a vytvorte ďalší účet.

Krok 8 - Povoľte presmerovanie IP

Aby server VPN smeroval pakety medzi klientom a internetom, musíte povoliť presmerovanie IP spustením nasledujúceho príkazu.

$ echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/60-custom.conf

Spustite nasledujúce príkazy, aby ste povolili algoritmu TCP BBR na zvýšenie rýchlosti TCP.

$ echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.d/60-custom.conf
$ echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.d/60-custom.conf

Pomocou nasledujúceho príkazu urobte zmeny trvalé.

$ sudo sysctl -p /etc/sysctl.d/60-custom.conf

Krok 9 – Nakonfigurujte maskovanie IP

Ďalším krokom je nastavenie maskovania IP vo firewalle, aby server VPN mohol pre klientov fungovať ako virtuálny smerovač. Nájdite názov hlavného sieťového rozhrania servera.

$ ip addr

Získate podobný výstup.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000
    link/ether 56:00:04:67:7e:79 brd ff:ff:ff:ff:ff:ff
    inet 95.179.138.135/23 metric 100 brd 95.179.139.255 scope global dynamic enp1s0
       valid_lft 66999sec preferred_lft 66999sec
    inet6 2a05:f480:1400:2381:5400:4ff:fe67:7e79/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 2591657sec preferred_lft 604457sec
    inet6 fe80::5400:4ff:fe67:7e79/64 scope link
       valid_lft forever preferred_lft forever

V našom prípade je enp1s0 názov rozhrania. Pridajte príkaz iptables do konfiguračného súboru UFW tak, že ho otvoríte na úpravy.

$ sudo nano /etc/ufw/before.rules

Pridajte nasledujúce riadky na koniec súboru. Nahraďte enp1s0 v kóde svojím sieťovým rozhraním.

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.10.10.0/24 -o enp1s0 -j MASQUERADE

# End each table with the 'COMMIT' line or these rules won't be processed
COMMIT

Nájdite v súbore nasledujúce riadky.

# ok icmp code for FORWARD
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT

Za ním prilepte nasledujúce riadky.

# allow forwarding for trusted network
-A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Reštartujte bránu firewall.

$ sudo systemctl restart ufw

Pravidlo Masquerade môžete skontrolovať pomocou nasledujúceho príkazu.

$ sudo iptables -t nat -L POSTROUTING

Dostanete nasledujúci výstup.

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  10.10.10.0/24        anywhere

Krok 10 - Pripojte sa pomocou klienta OpenConnect

Nainštalujeme klienta OpenConnect na počítač Ubuntu 22.04. Spustite nasledujúci príkaz na inštaláciu klienta.

$ sudo apt install openconnect

Potom sa pripojte k serveru VPN pomocou nasledujúceho príkazu. Príznak -b spôsobí, že po nadviazaní spojenia bude klient bežať na pozadí.

$ sudo openconnect -b vpn.example.com:443

Budete požiadaní o zadanie používateľského mena a hesla VPN. Zadajte poverenia vytvorené v kroku 7.

POST https://vpn.example.com/
Connected to 95.179.138.135:443
SSL negotiation with vpn.example.com
Connected to HTTPS on vpn.example.com with ciphersuite (TLS1.3)-(ECDHE-SECP256R1)-(ECDSA-SECP256R1-SHA256)-(AES-256-GCM)
XML POST enabled
Please enter your username.
Username:navjot
POST https://vpn.example.com/auth
Please enter your password.
Password:
POST https://vpn.example.com/auth

Po úspešnom pripojení uvidíte nasledujúci výstup. DTLS je zakázané, pretože sme zakázali UDP.

Got CONNECT response: HTTP/1.1 200 CONNECTED
CSTP connected. DPD 90, Keepalive 60
No DTLS address
Set up UDP failed; using SSL instead
Configured as 192.168.1.13, with SSL connected and DTLS disabled
Continuing in background; pid 1650

Spustite nasledujúci príkaz na zastavenie pripojenia.

$ sudo pkill openconnect

Poďme vytvoriť nejaké systémové skripty pre OpenConnect. Prvým skriptom je prinútiť klienta, aby sa automaticky pripojil pri štarte systému.

Vytvorte a otvorte súbor služby na úpravu.

$ sudo nano /etc/systemd/system/openconnect.service

Vložte do nej nasledujúci kód.

[Unit]
  Description=OpenConnect VPN Client
  After=network-online.target systemd-resolved.service
  Wants=network-online.target

[Service]
  Type=simple
  ExecStart=/bin/bash -c '/bin/echo -n password | /usr/sbin/openconnect vpn.example.com -u username --passwd-on-stdin'
  KillSignal=SIGINT
  Restart=always
  RestartSec=2

[Install]
  WantedBy=multi-user.target

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Povoliť službu.

$ sudo systemctl enable openconnect.service

Spustite službu.

$ sudo systemctl start openconnect.service

Ak chcete automaticky reštartovať pripojenie VPN, keď sa váš počítač vráti zo stavu pozastavenia, musíte vytvoriť ďalší skript systému.

Vytvorte a otvorte skript reštartu na úpravu.

$ sudo nano /etc/systemd/system/openconnect-restart.service

Vložte do nej nasledujúci kód.

[Unit]
Description=Restart OpenConnect client when resuming from suspend
After=suspend.target

[Service]
Type=simple
ExecStart=/bin/systemctl --no-block restart openconnect.service

[Install]
WantedBy=suspend.target

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Povoliť službu.

$ sudo systemctl enable openconnect-restart.service

Môžeme tiež vytvoriť službu, ktorá automaticky reštartuje pripojenie VPN, keď klesne. Vytvorte a otvorte službu kontroly VPN na úpravu.

$ sudo nano /etc/systemd/system/openconnect-check.service

Vložte do nej nasledujúci kód.

[Unit]
Description=OpenConnect VPN Connectivity Checker
After=openconnect.service

[Service]
Type=simple
ExecStart=/bin/bash -c 'for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done'

[Install]
WantedBy=multi-user.target

Uložte súbor stlačením Ctrl + X a po zobrazení výzvy zadajte Y.

Aktivujte a spustite službu.

$ sudo systemctl enable enable openconnect-check.service --now

Tým sa navždy spustí príkaz ping na kontrolu pripojenia VPN. Ak spadne, automaticky reštartuje OpenConnect.

Ak chcete, môžete si stiahnuť klientov OpenConnect GUI. Už dlhší čas však neboli aktualizované. Ak chcete aktualizovaného klienta GUI, môžete navštíviť úložisko OpenConnect GUI GitLab a skompilovať si ho sami.

Záver

Tým sa dokončí náš návod na inštaláciu servera OpenConnect VPN na server Ubuntu 22.04 a na pripojenie k nemu pomocou klienta príkazového riadka. Ak máte nejaké otázky, napíšte ich do komentárov nižšie.

Súvisiace články: