GNU/Linux >> Znalost Linux >  >> Ubuntu

Nastavte OpenConnect VPN Server (ocserv) na Ubuntu 20.04 pomocí Let’s Encrypt

Tento tutoriál vám ukáže, jak spustit svůj vlastní VPN server instalací OpenConnect VPN serveru na Ubuntu 20.04. OpenConnect VPN server, neboli ocserv , je open-source implementace protokolu Cisco AnyConnnect VPN, který je široce používán v podnicích a na univerzitách. AnyConnect je protokol VPN založený na SSL, který umožňuje jednotlivým uživatelům připojit se ke vzdálené síti.

Poznámka :Tento tutoriál funguje také na Ubuntu 20.10 a Ubuntu 21.04.

Proč si nastavit svůj vlastní server VPN?

  • Možná jste poskytovatelem služeb VPN nebo správcem systému, což vám přísluší nastavit náš vlastní server VPN.
  • Nedůvěřujete zásadám poskytovatelů služeb VPN bez protokolování, takže se vydáte cestou vlastního hostitele.
  • Pro implementaci zásad zabezpečení sítě můžete použít VPN. Pokud například provozujete svůj vlastní e-mailový server, můžete vyžadovat, aby se uživatelé přihlašovali pouze z IP adresy serveru VPN vytvořením seznamu povolených IP adres v bráně firewall. Váš e-mailový server je tedy odolný proti hackerským aktivitám.
  • Možná vás jen zajímá, jak funguje server VPN.

Funkce OpenConnect VPN Server

  • Lehký a rychlý. V mém testu mohu sledovat videa YouTube 4K s OpenConnect VPN. YouTube je v mé zemi (Číně) blokován.
  • Běží na Linuxu a většině BSD serverů.
  • Kompatibilní s klientem Cisco AnyConnect
  • Existuje klientský software OpenConnect pro Linux, MacOS, Windows a OpenWRT. Pro Android a iOS můžete použít klienta Cisco AnyConnect.
  • Podporuje ověřování heslem a ověřování certifikátů
  • Podporuje účetnictví RADIUS.
  • Podporuje virtuální hosting (více domén).
  • Snadné nastavení

Obzvláště se mi líbí, že ve srovnání s jinými technologiemi VPN je pro koncového uživatele velmi snadné a pohodlné používat OpenConnect VPN. Kdykoli si na svůj počítač nainstaluji distribuci Linuxu a chci rychle odblokovat webové stránky nebo skrýt svou IP adresu, nainstaluji si klienta OpenConnect a připojím se k serveru pomocí pouhých dvou řádků příkazů:

sudo apt install openconnect

sudo openconnect -b vpn.mydomain.com

K dispozici je také OpenConnect VPN klient pro Fedora, RHEL, CentOS, Arch Linux a OpenSUSE. Můžete jej snadno nainstalovat pomocí správce balíčků.

sudo dnf install openconnect
sudo yum install openconnect
sudo pacman -S openconnect

Požadavky

Abyste mohli postupovat podle tohoto návodu, budete potřebovat VPS (virtuální privátní server), který může volně přistupovat k blokovaným webovým stránkám (mimo vaši zemi nebo systém filtrování internetu). Doporučuji Kamatera VPS, která obsahuje:

  • 30denní bezplatná zkušební verze.
  • Začíná na 4 USD měsíčně (1 GB RAM)
  • Vysoce výkonný VPS založený na KVM
  • 9 datových center po celém světě, včetně Spojených států, Kanady, Spojeného království, Německa, Nizozemska, Hong Kongu a Isrealu.

Podle níže uvedeného návodu vytvořte svůj Linux VPS server na Kamatera.

  • Jak vytvořit Linux VPS server na Kamateře

Jakmile budete mít VPS se systémem Ubuntu 20.04, postupujte podle pokynů níže.

K aktivaci HTTPS pro OpenConnect VPN potřebujete také název domény. Zaregistroval jsem své doménové jméno od NameCheap, protože cena je nízká a poskytují ochranu soukromí whois doživotně zdarma.

Krok 1:Nainstalujte OpenConnect VPN Server na Ubuntu 20.04

Přihlaste se na svůj server Ubuntu 20.04. Poté použijte apt k instalaci ocserv balíček z výchozího úložiště Ubuntu.

sudo apt update
sudo apt install ocserv

Po instalaci se server OpenConnect VPN automaticky spustí. Jeho stav můžete zkontrolovat pomocí:

systemctl status ocserv

Ukázkový výstup:

● ocserv.service - OpenConnect SSL VPN server
     Loaded: loaded (/lib/systemd/system/ocserv.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2020-04-12 19:57:08 HKT; 12s ago
       Docs: man:ocserv(8)
   Main PID: 216409 (ocserv-main)
      Tasks: 2 (limit: 9451)
     Memory: 1.6M
     CGroup: /system.slice/ocserv.service
             ├─216409 ocserv-main
             └─216429 ocserv-sm

Tip:Pokud se výše uvedený příkaz okamžitě neukončí, můžete stisknutím klávesy Q získat zpět kontrolu nad terminálem.

Pokud neběží, můžete jej spustit pomocí:

sudo systemctl start ocserv

Ve výchozím nastavení OpenConnect VPN server naslouchá na TCP a UDP portu 443. Pokud jej používá webový server, VPN server se pravděpodobně nespustí. Později uvidíme, jak změnit port v konfiguračním souboru OpenConnect VPN.

Pokud na vašem serveru běží firewall, budete muset otevřít port 80 a 443. Pokud například používáte UFW, spusťte následující příkaz.

sudo ufw allow 80,443/tcp

Krok 2:Nainstalujte klienta Let’s Encrypt Client (Certbot) na server Ubuntu 20.04

gnutls-bin balíček nainstalovaný spolu s ocserv poskytuje nástroje pro vytvoření vlastní certifikační autority a certifikátu serveru, my však získáme a nainstalujeme certifikát Let’s Encrypt. Výhodou použití certifikátu Let’s Encrypt je, že je zdarma, snáze se nastavuje a je důvěryhodný pro klientský software VPN.

Spuštěním následujících příkazů nainstalujte klienta Let’s Encrypt (certbot) z výchozího úložiště Ubuntu.

sudo apt install certbot

Chcete-li zkontrolovat číslo verze, spusťte

certbot --version

Ukázkový výstup:

certbot 0.40.0

Krok 3:Získejte důvěryhodný certifikát TLS od společnosti Let’s Encrypt

Doporučuji používat standalone nebo webroot plugin pro získání certifikátu TLS pro ocserv.

Samostatný plugin

Pokud na vašem serveru Ubuntu 20.04 neběží žádný webový server a chcete, aby server OpenConnect VPN používal port 443, můžete pomocí samostatného pluginu získat certifikát TLS z Let’s Encrypt. Spusťte následující příkaz. Nezapomeňte pro název své domény nastavit záznam.

sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d vpn.example.com

Kde:

  • certonly :Získejte certifikát, ale neinstalujte jej.
  • --standalone :K získání certifikátu použijte samostatný plugin
  • --preferred-challenges http :Proveďte výzvu http-01 k ověření naší domény, která bude používat port 80.
  • --agree-tos :Souhlasíte s podmínkami služby Let’s Encrypt.
  • --email :E-mailová adresa se používá pro registraci a obnovení účtu.
  • -d :Zadejte název své domény.

Jak můžete vidět na následujícím snímku obrazovky, úspěšně jsem získal certifikát.

Použití pluginu webroot

Pokud má váš server Ubuntu 20.04 webový server naslouchající na portech 80 a 443, pak je dobré použít plugin webroot k získání certifikátu, protože plugin webroot funguje prakticky s každým webovým serverem a my nepotřebujeme instalovat certifikát na webovém serveru.

Nejprve musíte vytvořit virtuálního hostitele pro vpn.example.com.

Apache

Pokud používáte Apache, pak

sudo nano /etc/apache2/sites-available/vpn.example.com.conf

A vložte do souboru následující řádky.

<VirtualHost *:80>        
        ServerName vpn.example.com

        DocumentRoot /var/www/ocserv
</VirtualHost>

Uložte a zavřete soubor. Poté vytvořte kořenový webový adresář.

sudo mkdir /var/www/ocserv

Nastavte www-data (uživatel Apache) jako vlastníka webového kořenového adresáře.

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

Povolit tohoto virtuálního hostitele.

sudo a2ensite vpn.example.com

Znovu načtěte Apache, aby se změny projevily.

sudo systemctl reload apache2

Jakmile je virtuální hostitel vytvořen a povolen, spusťte následující příkaz a získejte certifikát Let’s Encrypt pomocí pluginu webroot.

sudo certbot certonly --webroot --agree-tos --email [email protected] -d vpn.example.com -w /var/www/ocserv

Nginx

Pokud používáte Nginx, pak

sudo nano /etc/nginx/conf.d/vpn.example.com.conf

Vložte následující řádky do souboru.

server {
      listen 80;
      server_name vpn.example.com;

      root /var/www/ocserv/;

      location ~ /.well-known/acme-challenge {
         allow all;
      }
}

Uložte a zavřete soubor. Poté vytvořte kořenový webový adresář.

sudo mkdir -p /var/www/ocserv

Nastavte www-data (uživatel Nginx) jako vlastníka webového kořenového adresáře.

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

Znovu načtěte Nginx, aby se změny projevily.

sudo systemctl reload nginx

Jakmile je virtuální hostitel vytvořen a povolen, spusťte následující příkaz a získejte certifikát Let’s Encrypt pomocí pluginu webroot.

sudo certbot certonly --webroot --agree-tos --email [email protected] -d vpn.example.com -w /var/www/ocserv

Krok 4:Upravte konfigurační soubor OpenConnect VPN Server

Upravte hlavní konfigurační soubor ocserv.

sudo nano /etc/ocserv/ocserv.conf

Nejprve musíme nakonfigurovat ověřování pomocí hesla. Ve výchozím nastavení je povoleno ověřování heslem prostřednictvím PAM (Pluggable Authentication Modules), což vám umožňuje používat systémové účty Ubuntu pro přihlášení z klientů VPN. Toto chování lze zakázat komentářem na následujícím řádku.

auth = "pam[gid-min=1000]"

Pokud chceme, aby uživatelé k přihlašování používali samostatné účty VPN místo systémových účtů, musíme přidat následující řádek, abychom povolili ověřování heslem pomocí souboru s hesly.

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

Po dokončení úprav tohoto konfiguračního souboru uvidíme, jak používat ocpasswd nástroj pro generování /etc/ocserv/ocpasswd soubor, který obsahuje seznam uživatelských jmen a zakódovaných hesel.

Poznámka :Ocserv podporuje ověřování klientského certifikátu, ale Let’s Encrypt nevydává klientský certifikát. Chcete-li vydávat klientský certifikát, musíte si nastavit vlastní CA.

Dále, pokud nechcete, aby ocserv používal TCP a UDP port 443, najděte následující dva řádky a změňte číslo portu. Jinak je nechte na pokoji.

tcp-port = 443
udp-port = 443

Pak najděte následující dva řádky. Musíme je změnit.

server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem
server-key = /etc/ssl/private/ssl-cert-snakeoil.key

Nahraďte výchozí nastavení cestou certifikátu serveru Let’s Encrypt a souboru klíče serveru.

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

Poté nastavte maximální počet klientů. Výchozí hodnota je 128. Nastavte na nulu pro neomezené.

max-clients = 128

Nastavte počet zařízení, ze kterých se může uživatel současně přihlásit. Výchozí hodnota je 2. Nastavte na nulu pro neomezené.

max-same-clients = 2

Ve výchozím nastavení se pakety udržující naživu odesílají každých 300 sekund (5 minut). Dávám přednost použití krátkého času (30 sekund), abych snížil pravděpodobnost výpadku připojení VPN.

keepalive = 30

Dále najděte následující řádek. Změňte false true povolit zjišťování MTU, které může optimalizovat výkon VPN.

try-mtu-discovery = false

Pomocí následujících dvou parametrů můžete nastavit dobu, po kterou může klient zůstat nečinný, než bude odpojen. Pokud dáváte přednost tomu, aby klient zůstal ve spojení po neomezenou dobu, uveďte tyto dva parametry do komentáře.

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

Poté nastavte výchozí doménu na vpn.example.com.

default-domain = vpn.example.com

Konfigurace sítě IPv4 je ve výchozím nastavení následující. To způsobí problémy, protože mnoho domácích směrovačů také nastavuje rozsah sítě IPv4 na 192.168.1.0/24 .

ipv4-network = 192.168.1.0
ipv4-netmask = 255.255.255.0

Můžeme použít jiný rozsah soukromých IP adres (10.10.10.0/24), abychom zabránili kolizi IP adres, takže změňte hodnotu ipv4-network do

ipv4-network = 10.10.10.0

Nyní odkomentujte následující řádek, abyste tunelovali všechny DNS dotazy přes VPN.

tunnel-all-dns = true

Výchozí adresy překladače DNS jsou následující, což je v pořádku.

dns = 8.8.8.8
dns = 1.1.1.1

Poznámka :Pokud jste poskytovatelem služeb VPN, je dobrým zvykem provozovat svůj vlastní překladač DNS na stejném serveru. Pokud na stejném serveru běží překladač DNS, zadejte DNS jako

dns = 10.10.10.1

10.10.10.1 je IP adresa OpenConnect VPN serveru ve VPN LAN. Klientům to trochu urychlí vyhledávání DNS, protože je eliminována latence sítě mezi serverem VPN a překladačem DNS.

Poté zakomentujte všechny parametry trasy (na začátek následujících řádků přidejte symbol #), čímž se server nastaví jako výchozí brána pro klienty.

#route = 10.0.0.0/8
#route = 172.16.0.0/12
#route = 192.168.0.0/16
#route = fd00::/8
#route = default

#no-route = 192.168.5.0/255.255.255.0

Uložte a zavřete soubor  Potom restartujte server VPN, aby se změny projevily.

sudo systemctl restart ocserv

Krok 5:Vytvořte účty VPN

Nyní použijte nástroj ocpasswd ke generování účtů VPN.

sudo ocpasswd -c /etc/ocserv/ocpasswd username

Budete požádáni o nastavení hesla pro uživatele a informace budou uloženy do /etc/ocserv/ocpasswd soubor. Chcete-li resetovat heslo, jednoduše znovu spusťte výše uvedený příkaz.

Krok 6:Povolte přesměrování IP

Aby server VPN směroval pakety mezi klienty VPN a internetem, musíme povolit předávání IP. Upravte sysctl.conf soubor.

sudo nano /etc/sysctl.conf

Přidejte následující řádek na konec tohoto souboru.

net.ipv4.ip_forward = 1

Uložte a zavřete soubor. Poté aplikujte změny pomocí níže uvedeného příkazu. Klávesa -p možnost načte nastavení sysctl z /etc/sysctl.conf soubor. Tento příkaz zachová naše změny po restartování systému.

sudo sysctl -p

Krok 7:Konfigurace maskování IP ve bráně firewall

Musíme nastavit maskování IP ve firewallu serveru, aby se server stal virtuálním routerem pro klienty VPN. Budu používat UFW, což je frontend k firewallu iptables. Nainstalujte UFW na Ubuntu pomocí:

sudo apt install ufw

Nejprve musíte povolit provoz SSH.

sudo ufw allow 22/tcp

Poté najděte název hlavního síťového rozhraní vašeho serveru.

ip addr

Jak vidíte, jmenuje se ens3 na mém serveru Ubuntu.

Abychom nakonfigurovali maskování IP adres, musíme přidat příkaz iptables do konfiguračního souboru UFW.

sudo nano /etc/ufw/before.rules

Ve výchozím nastavení existují určitá pravidla pro filter stůl. Přidejte následující řádky na konec tohoto souboru. Nahraďte ens3 s vaším vlastním názvem síťového rozhraní.

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

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

V textovém editoru Nano můžete přejít na konec souboru stisknutím Ctrl+W a poté stiskněte Ctrl+V .

Výše uvedené řádky se připojí (-A ) pravidlo do konce POSTROUTING řetězec nat stůl. Propojí vaši virtuální privátní síť s internetem. A také skryjte svou síť před vnějším světem. Internet tedy vidí pouze IP adresu vašeho VPN serveru, ale nevidí IP vašeho VPN klienta, stejně jako váš domácí router skrývá vaši soukromou domácí síť.

Ve výchozím nastavení UFW zakazuje předávání paketů. Můžeme povolit přeposílání pro naši privátní síť. Najděte ufw-before-forward řetězec v tomto souboru a přidejte následující 3 řádky, které budou přijímat předávání paketů, pokud je zdrojová IP nebo cílová IP v 10.10.10.0/24 rozsah.

# 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 a zavřete soubor. Poté povolte UFW.

sudo ufw enable

Pokud jste již dříve povolili UFW, můžete k restartování UFW použít systemctl.

sudo systemctl restart ufw

Pokud nyní vypíšete pravidla v řetězci POSTROUTING tabulky NAT pomocí následujícího příkazu:

sudo iptables -t nat -L POSTROUTING

Můžete vidět pravidlo maškarády.

UFW může nějakou dobu trvat, než zpracuje pravidla brány firewall. Pokud se pravidlo maškarády nezobrazí, restartujte UFW znovu (sudo systemctl restart ufw ).

Krok 8:Otevřete port 443 v bráně firewall

Spuštěním následujícího příkazu otevřete TCP a UDP port 443. Pokud jste pro ocserv nakonfigurovali jiný port, změňte 443 na vámi nakonfigurovaný port.

sudo ufw allow 443/tcp
sudo ufw allow 443/udp

Nyní je server OpenConnect VPN připraven přijímat připojení klientů.

Pokud spustíte místní překladač DNS

Pro ty z vás, kteří provozují místní překladač DNS, pokud jste zadali 10.10.10.1 jako server DNS pro klienty VPN, musíte klientům VPN povolit připojení k portu 53 pomocí následujícího pravidla UFW.

sudo ufw insert 1 allow in from 10.10.10.0/24

Musíte také upravit konfigurační soubor serveru BIND DNS (/etc/bind/named.conf.options ), aby klienti VPN mohli odesílat rekurzivní dotazy DNS, jak je uvedeno níže.

allow-recursion { 127.0.0.1; 10.10.10.0/24; };

Poté restartujte BIND.

sudo systemctl restart named

Jak nainstalovat a používat OpenConnect VPN klienta na Ubuntu 20.04 Desktop

Spuštěním následujícího příkazu nainstalujte klienta příkazového řádku OpenConnect VPN na plochu Ubuntu.

sudo apt install openconnect

K VPN se můžete připojit z příkazového řádku, jak je uvedeno níže. -b flag jej spustí na pozadí po navázání spojení.

sudo openconnect -b vpn.example.com:port-number

Budete požádáni o zadání uživatelského jména a hesla VPN. Pokud je připojení úspěšně navázáno, zobrazí se následující zpráva.

Got CONNECT response: HTTP/1.1 200 CONNECTED
CSTP connected. DPD 90, Keepalive 32400
Connected tun0 as 192.168.1.139, using SSL
Established DTLS connection (using GnuTLS). Ciphersuite (DTLS1.2)-(RSA)-(AES-256-GCM).

Chcete-li připojení zastavit, spusťte:

sudo pkill openconnect

Chcete-li klienta spustit neinteraktivně, použijte následující syntaxi.

echo -n password | sudo openconnect -b vpn.example.com -u username --passwd-on-stdin

Pokud chcete ke správě připojení VPN používat Správce sítě, musíte si tyto balíčky také nainstalovat.

sudo apt install network-manager-openconnect network-manager-openconnect-gnome

Pokud jste úspěšně připojeni k serveru VPN, ale vaše veřejná IP adresa se nezmění, je to proto, že předávání IP nebo maskování IP nefunguje. Jednou jsem měl v příkazu iptables překlep (použil jsem nesprávný rozsah IP adres), což způsobilo, že můj počítač nemohl procházet internet.

Pokud narazíte na následující chybu, měli byste zakázat port UDP v ocserv, což je vysvětleno dále v optimalizaci rychlosti sekce.

DTLS handshake failed: Resource temporarily unavailable, try again

Pokud se zobrazí následující chyba, je pravděpodobné, že heslo k vašemu účtu VPN je nesprávné.

fgets (stdin): Inappropriate ioctl for device

Automatické připojení při spuštění systému

Abychom umožnili klientovi OpenConnect VPN automaticky se připojit k serveru při bootování, můžeme vytvořit systémovou servisní jednotku.

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

Vložte do souboru následující řádky. Nahraďte červený text.

[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 a zavřete soubor. Poté tuto službu povolte, aby se spustila při spouštění.

sudo systemctl enable openconnect.service

Vysvětlení obsahu souboru:

  • After=network-online.target systemd-resolved.service a Wants=network-online.target spustit tuto službu po připojení sítě. Chceme openconnect.service začít po systemd-resolved.service protože to zajistí, že adresa serveru DNS nastavená pomocí OpenConnect nebude přepsána službou systemd-resolved.service .
  • Ve skutečnosti může být tato služba stále spuštěna před připojením sítě. Přidáme Restart=always a RestartSec=2 restartovat tuto službu po 2 sekundách, pokud tato služba selže.
  • Systemd nerozpozná přesměrování potrubí, takže v ExecStart příkaz zabalíme do jednoduchých uvozovek a spustíme jej pomocí shellu Bash.
  • Vzhledem k tomu, že klient OpenConnect VPN poběží jako systémová služba, která běží na pozadí, není třeba přidávat -b příznak k openconnect příkaz.
  • KillSignal direktiva říká Systemd, aby poslal SIGINT signál, když systemctl stop openconnect je vydán příkaz. Tím se provede čisté vypnutí odhlášením relace a obnovením nastavení serveru DNS a směrovací tabulky jádra Linuxu.

Chcete-li okamžitě spustit tuto službu Systemd, spusťte

sudo systemctl start openconnect

Chcete-li zastavit tuto službu Systemd, spusťte

sudo systemctl stop openconnect

Jak automaticky restartovat klienta OpenConnect při obnovení z pozastavení

Pokud váš počítač Ubuntu přejde do stavu spánku, klient OpenConnect ztratí připojení k serveru VPN. Aby se automaticky restartoval při obnovení z režimu spánku, musíme vytvořit další servisní jednotku systemd.

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

Přidejte do souboru následující řádky.

[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 a zavřete soubor. Poté tuto službu povolte.

sudo systemctl enable openconnect-restart.service

Automatický restart při výpadku připojení VPN

Někdy se připojení VPN přerušilo z jiných důvodů. Můžete spustit následující příkaz a zkontrolovat, zda klient VPN může pingnout na soukromou IP adresu VPN serveru (10.10.10.1). Pokud je ping neúspěšný, provede se příkaz vpravo pro restart klienta VPN. || je operátor OR v Bash. Provede příkaz vpravo pouze v případě, že příkaz vlevo vrátil chybu.

ping -c9 10.10.10.1 || systemctl restart openconnect

Ping bude proveden 9krát, tj. 9 sekund. Můžete použítnekonečnou smyčku v prostředí Bash, aby celý příkaz běžel navždy. Stiskněte Ctrl+C abych to zastavil.

for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done

Nyní můžeme pro tento úkol vytvořit službu systemd.

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

Přidejte do tohoto souboru následující řádky. Uvádíme, že tato služba má běžet po openconnect.service .

[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 a zavřete soubor. Poté spusťte tuto službu.

sudo systemctl start openconnect-check

Povolit automatické spouštění při spouštění.

sudo systemctl enable openconnect-check

Po spuštění této služby bude příkaz ping běžet navždy. Pokud se připojení VPN přeruší, automaticky se restartuje openconnect.service .

Klient GUI OpenConnect pro Windows a macOS

Lze je stáhnout z OpenConnect GUI stránky Github.

Rychlost

OpenConnect VPN je docela rychlá. Mohu jej použít ke sledování 4k videí na YouTube. Jak vidíte, rychlost mého připojení je 63356 Kbps , což v překladu znamená 61 Mbit/s .

A zde jsou výsledky testů na speedtest.net.

Optimalizace rychlosti

OpenConnect ve výchozím nastavení používá protokol TLS over UDP (DTLS) k dosažení vyšší rychlosti, ale protokol UDP nemůže zajistit spolehlivý přenos. TCP je pomalejší než UDP, ale může zajistit spolehlivý přenos. Jeden optimalizační tip, který vám mohu dát, je deaktivovat DTLS, použít standardní TLS (přes TCP) a poté povolit TCP BBR pro zvýšení rychlosti TCP.

Chcete-li deaktivovat DTLS, přidejte komentář (přidejte # symbol na začátku) následující řádek v konfiguračním souboru ocserv.

udp-port = 443

Uložte a zavřete soubor. Poté restartujte službu ocserv.

sudo systemctl restart ocserv.service

Chcete-li povolit TCP BBR, podívejte se na následující návod. Všimněte si, že musíte deaktivovat DTLS v ocserv, jinak TCP BBR nebude fungovat.

  • Jak snadno zvýšit výkon sítě Ubuntu povolením TCP BBR

V mém testu je standardní TLS s povoleným TCP BBR dvakrát rychlejší než DTLS.

Dalším velmi důležitým faktorem ovlivňujícím rychlost je, jak dobré je spojení mezi vaším místním počítačem a serverem VPN. Pokud žijete na Blízkém východě a server VPN se nachází v USA, rychlost by byla pomalá. Vyberte si datové centrum, které je blízko vašeho bydliště.

Zkontrolujte také průměrné zatížení procesoru. (htop lze nainstalovat pomocí sudo apt install htop ).

htop

Ujistěte se, že průměrná zátěž CPU je pod 1 . Jednou jsem měl průměrné zatížení CPU 3 , což způsobilo vysokou latenci mezi klientem VPN a serverem VPN.

Automaticky obnovit Let's Encrypt Certificate

Upravte soubor crontab uživatele root.

sudo crontab -e

Přidejte následující řádek na konec souboru. Aby server VPN vyzvedl nový certifikát a soubor klíče, je nutné znovu načíst službu ocserv.

@daily certbot renew --quiet && systemctl reload ocserv

Tipy pro odstraňování problémů

OpenVZ

Pamatujte, že pokud používáte OpenVZ VPS, ujistěte se, že jste povolili virtuální síťové zařízení TUN v ovládacím panelu VPS. (Pokud používáte Vultr VPS, pak máte VPS založené na KVM, takže si s tím nemusíte dělat starosti.)

Soubor protokolu

Pokud narazíte na nějaký problém, zkontrolujte protokol OpenConnect VPN serveru.

sudo journalctl -eu ocserv.service

Zjistil jsem, že pokud změním port 443 na jiný port, skvělý čínský firewall zablokuje toto připojení VPN.

Režim ladění

Pokud vám ocserv řekne, že nemůže načíst soubor /etc/ocserv/ocserv.conf soubor, můžete zastavit ocserv.

sudo systemctl stop ocserv

Poté jej spusťte v popředí s povoleným laděním.

sudo /usr/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf --debug=10

Výstup vám pak může napovědět, proč ocserv nefunguje.

Nelze procházet internet

Pokud jste úspěšně připojeni k serveru VPN, ale nemůžete procházet internet, je to proto, že předávání IP nebo maskování IP nefunguje. Pamatuji si, že můj poskytovatel VPS jednou provedl upgrade platformy, který změnil název hlavního síťového rozhraní z ens3 na enp3s0 , takže jsem musel aktualizovat název v souboru UFW (/etc/ufw/before.rules ).

Chyba syntaxe

Pokud se při pokusu o navázání připojení VPN zobrazí následující chyba, je to pravděpodobně proto, že ve vašem konfiguračním souboru ocserv je chyba syntaxe. Zkontrolujte deník (sudo journalctl -eu ocserv ), abyste to zjistili.

Got inappropriate HTTP CONNECT response: HTTP/1.1 401 Cookie is not acceptable

Restartujte počítač

Pokud se při pokusu o vytvoření připojení VPN zobrazí následující chyba, pravděpodobně se jedná o problém s místním počítačem. Zkuste restartovat počítač.

Server 'vpn.your-domain.com' requested Basic authentication which is disabled by default

Spojení TLS nebylo řádně ukončeno

Pokud se na klientovi při pokusu o vytvoření připojení VPN zobrazí následující chyba,

SSL connection failure: The TLS connection was non-properly terminated.

pravděpodobně byste měli restartovat ocserv služby na serveru VPN.

sudo systemctl restart ocserv

Můžete vytvořit úlohu cron pro automatické restartování ocserv jednou denně ve 4:00.

sudo crontab -e

Přidejte následující řádek.

0 4 * * * systemctl restart ocserv

Uložte a zavřete soubor.

Nastavte OpenConnect VPN server a webový server, aby používali port 443 současně

Přečtěte si prosím následující článek:

  • Spusťte OpenConnect VPN Server &Apache/Nginx na stejném boxu s HAProxy

Jak zakázat TLS 1.0 a TLS 1.1 v ocserv

Rada PCI ukončila 30. června 2018 podporu TLS 1.0 a hlavní webové prohlížeče zakážou TLS 1.0 a TLS 1.1 v roce 2020. Totéž bychom měli udělat se serverem VPN. Upravte hlavní konfigurační soubor.

sudo nano /etc/ocserv/ocserv.conf

Najděte následující řádek:

tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128"

Chcete-li zakázat TLS 1.0 a TLS 1.1 na serveru OpenConnect VPN, stačí přidat -VERS-TLS1.0 a -VERS-TLS1.1 v řádku.

tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1"

Uložte a zavřete soubor. Poté restartujte ocserv.

sudo systemctl restart ocserv

Nyní bude ocserv přijímat pouze TLS 1.3 a TLS 1.2. Další informace o konfiguraci parametru TLS v ocserv naleznete v tématu GnuTLS prioritní řetězce.

Chcete-li zkontrolovat, zda váš server OpenConnect VPN podporuje TLS 1.0, spusťte následující příkaz.

openssl s_client -connect vpn.your-domain.com:443 -tls1

A zkontrolujte TLS 1.1

openssl s_client -connect vpn.your-domain.com:443 -tls1_1

Pokud ve výstupu uvidíte následující zprávu, znamená to, že verze TLS není podporována.

New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported

Konfigurace podle uživatele nebo skupiny

Ocserv umožňuje konfigurace pro uživatele a skupiny. Chcete-li tuto funkci povolit, odkomentujte následující dva řádky v /etc/ocserv/ocserv.conf soubor.

config-per-user = /etc/ocserv/config-per-user/
config-per-group = /etc/ocserv/config-per-group/

Uložte a zavřete soubor. Poté vytvořte konfigurační adresář pro uživatele a skupinu.

sudo mkdir /etc/ocserv/config-per-user/
sudo mkdir /etc/ocserv/config-per-group/

Dále můžete vytvořit soubor v těchto dvou adresářích. Vytvořte například user1 soubor umožňující vlastní konfiguraci pro user1 .

sudo nano /etc/ocserv/config-per-user/user1

Můžete také vytvořit group1 umožňuje vlastní konfiguraci pro skupinu s názvem group1 .

sudo nano /etc/ocserv/config-per-group/group1

Do souboru můžete přidat něco jako níže, abyste povolili rozdělené tunelování.

route = 10.10.10.0/255.255.255.0
tunnel-all-dns = false
dns = 8.8.8.8
dns = 1.1.1.1

Kde:

  • První řádek znamená, že za user1 nebo uživatelé ve group1 připojit k tomuto serveru VPN, provoz pouze na 10.10.10.0/24 síť bude směrována přes VPN server. Provoz na jiné IP adresy je směrován přes původní bránu.
  • Druhý řádek zakáže tunelování dotazů DNS.
  • Třetí a čtvrtý řádek nastavuje servery DNS pro klienty VPN.

Tento trik používám k tomu, abych umožnil mému dalšímu VPS (virtuálnímu soukromému serveru) připojit se k tomuto serveru VPN bez narušení normálního provozu, takže zařízení TUN (vpns0) mého serveru VPN je vždy zapnuto, což znamená, že můj server VPN bude mít vždy soukromá IP adresa 10.10.10.1.

Uložte a zavřete soubor. Restartujte ocserv aby se změny projevily.

sudo systemctl restart ocserv

Pamatujte, že pokud povolíte IPv6 v ocserv, musíte také přidat rozsah sítě IPv6, abyste mohli používat rozdělené tunelování.

route = 10.10.10.0/255.255.255.0
route = fda9:4efe:7e3b:03ea::/48
tunnel-all-dns = false
dns = 8.8.8.8
dns = 1.1.1.1

Pokud chcete vyloučit IP adresu z výchozí trasy, použijte no-route .

no-route = 12.34.56.78/32

To znamená, že veškerý další provoz bude procházet tunelem VPN kromě provozu na IP 12.34.56.78. Parametr route a no-route akceptuje notaci masky sítě (10.10.10.0/255.255.255.0) i notaci CIDR (12.34.56.78/32)

Pokud se po povolení rozděleného tunelování zobrazí následující chyba, je to pravděpodobně proto, že jste nepoužili síťovou masku nebo zápis CIDR.

could not parse proxy protocol header; discarding connection

Rozdělit tunelování podle země

Řekněme, že chcete, aby VPN tunelovala pouze provoz do cizích zemí. Doprava do vaší země by měla využívat normální trasu. Můžete použít no-route k dosažení tohoto cíle v konfiguračním souboru ocserv.

Nejprve si musíte stáhnout rozsah IP adres pro vaši zemi na této webové stránce:https://www.ip2location.com/free/visitor-blocker, která vám umožní stáhnout rozsah IP adres ve formátu CIDR.

Uložte rozsah IP do textového souboru ip2location.txt a spuštěním následujícího příkazu v terminálu Linux přidejte no-route = na začátek každého řádku.

sed 's/^/no-route = /' -i ip2localtion.txt

Nyní otevřete soubor v textovém editoru a zkopírujte všechny řádky v něm. Tyto řádky musíme přidat do konfiguračního souboru ocserv. Pokud je řádků příliš mnoho, můžete tyto řádky přidat do konfiguračního souboru pro jednotlivé uživatele.

sudo nano /etc/ocserv/config-per-user/user1

Můžete je také přidat do konfiguračního souboru pro jednotlivé skupiny a poté přidat uživatele do skupiny.

Restartujte ocserv, aby se změny projevily.

sudo systemctl restart ocserv

Jak povolit IPv6 v OpenConnect VPN

Pokud má váš server VPN veřejnou adresu IPv6, můžete povolit IPv6 v OpenConnect VPN. Upravte konfigurační soubor ocserv.

sudo nano /etc/ocserv/ocserv.conf

Najděte následující dva řádky a odkomentujte je.

ipv6-network = fda9:4efe:7e3b:03ea::/48
ipv6-subnet-prefix = 64

Uložte a zavřete soubor. Restartujte ocserv, aby se změna projevila.

sudo systemctl restart ocserv

Poté musíme povolit předávání IP pro IPv6. Upravte sysctl.conf soubor.

sudo nano /etc/sysctl.conf

Přidejte následující řádek na konec tohoto souboru.

net.ipv6.conf.all.forwarding=1

Uložte a zavřete soubor. Poté použijte změny pomocí níže uvedeného příkazu.

sudo sysctl -p

Dále musíme nastavit maskování IPv6 ve firewallu serveru, aby se server stal virtuálním routerem pro klienty VPN.

sudo nano /etc/ufw/before6.rules

Ve výchozím nastavení existují určitá pravidla pro filter stůl. Přidejte následující řádky na konec tohoto souboru. Nahraďte ens3 s vaším vlastním názvem síťového rozhraní.

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o ens3 -j MASQUERADE

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

V textovém editoru Nano můžete přejít na konec souboru stisknutím Ctrl+W a poté stiskněte Ctrl+V .

Ve výchozím nastavení UFW zakazuje předávání paketů. Můžeme povolit předávání pro naši privátní síť IPv6. Najděte ufw6-before-forward řetězec v tomto souboru a přidejte následující 3 řádky, které budou přijímat předávání paketů, pokud je zdrojová IP nebo cílová IP v fda9:4efe:7e3b:03ea::/48 rozsah.

Uložte a zavřete soubor. Restartujte UFW, aby se změna projevila.

sudo systemctl restart ufw

Pokud nyní vypíšete pravidla v řetězci POSTROUTING tabulky NAT pomocí následujícího příkazu:

sudo ip6tables -t nat -L POSTROUTING

Můžete vidět pravidlo maškarády.

Odpojte aktuální připojení VPN, přidejte záznam AAAA pro vpn.example.com a obnovte připojení VPN. Poté přejděte na https://test-ipv6.com/ a zkontrolujte své připojení IPv6.

Pokud provozujete svůj vlastní BIND DNS resolver na VPN serveru, můžete přidat následující řádek do /etc/ocserv/ocserv.conf soubor pro nastavení serveru VPN jako překladač DNS pro klienty VPN.

dns = fda9:4efe:7e3b::1

Uložte a zavřete soubor. Abychom se mohli dotazovat na názvy DNS v IPv6, musíme nakonfigurovat BIND tak, aby umožňoval klientům IPv6 VPN.

sudo nano /etc/bind/named.conf.options

Najděte parametr allow-recursion a změňte jej na:

allow-recursion { 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; };

Uložte a zavřete soubor. Restartujte BIND9.

sudo systemctl restart named

Musíme také povolit IPv6 VPN klienta ve firewallu.

sudo ufw allow in from fda9:4efe:7e3b:03ea::/48

Virtuální hosting

Poznámka :Pokud chcete mít pouze možnost používat více názvů hostitelů pro server VPN, můžete použít certbot k získání certifikátu pro více domén. Poté restartujte ocserv a máte hotovo.

Chcete-li přidat nového virtuálního hostitele do ocserv, musíte nejprve použít metodu v kroku 3 k získání certifikátu TLS pro nového virtuálního hostitele. Poté upravte konfigurační soubor ocserv.

sudo nano /etc/ocserv/ocserv.conf

Přejděte na konec tohoto souboru. V textovém editoru Nano můžete stisknout Ctrl+W a poté Ctrl+V pro skok na konec souboru. Přidejte následující řádky. Nahraďte vpn2.example.com s názvem hostitele druhého virtuálního hostitele.

[vhost:vpn2.example.com]
#Allow password authentication and certificate authentication
enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]"
auth = "certificate"

tcp-port = 443

#uncomment the two lines if ocserv runs behind HAProxy.
#listen-host = 127.0.0.1
#listen-proxy-proto = true

# SSL/TLS configuration
ca-cert = /etc/ocserv/ssl/ca-cert.pem
server-cert = /etc/letsencrypt/live/vpn2.example.com/fullchain.pem
server-key = /etc/letsencrypt/live/vpn2.example.com/privkey.pem
cert-user-oid = 0.9.2342.19200300.100.1.1

#Networking configuration. Use a different network range for this virtual host. 
device = vpns
ipv4-network = 10.10.20.0
ipv4-netmask = 255.255.255.0
route = default
dns = 8.8.8.8
tunnel-all-dns = true

compression = true
max-clients = 0
max-same-clients = 0
try-mtu-discovery = true
idle-timeout=1200
mobile-idle-timeout=2400

config-per-user = /etc/ocserv/config-per-user/
config-per-group = /etc/ocserv/config-per-group/

Uložte a zavřete soubor. Poté restartujte ocserv.

sudo systemctl restart ocserv

Upravte konfigurační soubor UFW.

sudo nano /etc/ufw/before.rules

Najděte ufw-before-forward řetězec v tomto souboru a přidejte následující 2 řádky, které budou přijímat předávání paketů, pokud je zdrojová IP nebo cílová IP v 10.10.20.0/24 rozsah.

-A ufw-before-forward -s 10.10.20.0/24 -j ACCEPT
-A ufw-before-forward -d 10.10.20.0/24 -j ACCEPT

Uložte a zavřete soubor. Poté restartujte UFW.

sudo systemctl restart ufw

Všimněte si, že démon ocserv vám může sdělit, že některé parametry budou u virtuálního hostitele ignorovány. Zjistil jsem však, že některé ignorované parametry jsou skutečně potřeba. Pokud například odstraníte device = vpns lince z virtuálního hostitele, můžete při navazování připojení VPN k virtuálnímu hostiteli narazit na následující chybu.

VPN service unavailable; reason: Server configuration error

A server VPN by v protokolu vytvořil následující chybovou zprávu.

no networks are configured; rejecting client

Také poznámka že klient AnyConnect VPN na iOS nepodporuje TLS SNI, takže uživatelé iOS se připojí k výchozímu virtuálnímu hostiteli.

Jak spustit více instancí ocserv

Jeden proces ocserv se může vázat pouze na jeden TCP nebo UDP port na vašem serveru. Pokud chcete, aby se ocserv vázal na více portů TCP nebo UDP, musíte spustit více procesů ocserv. je to velmi jednoduché. Zkopírujte /lib/systemd/system/ocserv.service do nového souboru.

sudo cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv2.service

Poté upravte nový soubor.

sudo nano /etc/systemd/system/ocserv2.service

Změnit

/etc/ocserv/ocserv.conf

do

/etc/ocserv/ocserv2.conf

Uložte a zavřete soubor. Dále můžete upravit /etc/ocserv/ocserv2.conf soubor a přidejte své vlastní konfigurace. Jakmile budete hotovi, spusťte druhou službu ocserv.

sudo systemctl start ocserv2

Ubuntu
  1. Jak nastavit WireGuard VPN na Ubuntu (průvodce krok za krokem)

  2. Jak nastavit IKEv2 VPN server s StrongSwan na Ubuntu 22.04

  3. Jak nainstalovat Let's Encrypt SSL na Ubuntu 18.04 s Nginx

  1. Nastavte OpenConnect VPN Server (ocserv) na Debian 11 Bullseye

  2. Nastavte OpenConnect VPN Server (ocserv) na Debian 10 Buster

  3. Nastavení ověřování certifikátů v OpenConnect VPN Server (ocserv)

  1. Jak nastavit e-mailový server s Plesk na Ubuntu 20.04

  2. Jak nastavit zabezpečený FTP server s Pure-FTPd na Ubuntu

  3. Nastavte OpenConnect VPN Server (ocserv) na Ubuntu 18.04/16.04 pomocí Let’s Encrypt