Wyszukiwanie w witrynie

Skonfiguruj serwer OpenConnect VPN (ocserv) na CentOS 8/RHEL 8 za pomocą Let’s Encrypt


W tym samouczku pokażemy, jak uruchomić własny serwer VPN, instalując serwer OpenConnect VPN na CentOS 8/RHEL 8. Serwer OpenConnect VPN, znany również jako ocserv, to implementacja Cisco AnyConnnect o otwartym kodzie źródłowym Protokół VPN, który jest szeroko stosowany w firmach i na uniwersytetach. AnyConnect to protokół VPN oparty na SSL, który umożliwia indywidualnym użytkownikom łączenie się z siecią zdalną.

Dlaczego warto skonfigurować własny serwer VPN?

  • Być może jesteś dostawcą usług VPN lub administratorem systemu i wypada Ci założyć własny serwer VPN.
  • Nie ufasz polityce braku rejestrowania stosowanej przez dostawców usług VPN, więc wybierasz opcję samodzielnego hostowania.
  • Możesz użyć VPN do wdrożenia polityki bezpieczeństwa sieci. Na przykład, jeśli prowadzisz własny serwer poczty e-mail, możesz wymagać od użytkowników logowania się wyłącznie z adresu IP serwera VPN, tworząc białą listę adresów IP w zaporze. W ten sposób Twój serwer e-mail jest wzmocniony, aby zapobiec działaniom hakerskim.
  • Być może jesteś po prostu ciekawy, jak działa serwer VPN.

Funkcje serwera OpenConnect VPN

  • Lekki i szybki. W moim teście mogę oglądać filmy YouTube 4K za pomocą OpenConnect VPN. YouTube jest zablokowany w moim kraju (Chiny).
  • Działa na Linuksie i większości serwerów BSD.
  • Kompatybilny z klientem Cisco AnyConnect
  • Dostępne jest oprogramowanie klienckie OpenConnect dla systemów Linux, macOS, Windows i OpenWRT. W przypadku systemów Android i iOS można korzystać z klienta Cisco AnyConnect.
  • Obsługuje uwierzytelnianie hasłem i uwierzytelnianie za pomocą certyfikatu
  • Obsługuje księgowość RADIUS.
  • Obsługuje hosting wirtualny (wiele domen)
  • Łatwy w konfiguracji

Szczególnie podoba mi się fakt, że w porównaniu do innych technologii VPN, korzystanie z OpenConnect VPN przez użytkownika końcowego jest bardzo łatwe i wygodne. Ilekroć instaluję dystrybucję Linuksa na moim komputerze i chcę szybko odblokować strony internetowe lub ukryć swój adres IP, po prostu uruchamiam następujące polecenie, aby połączyć się z moim serwerem OpenConnect VPN.

sudo openconnect -b vpn.mydomain.com

Oprogramowanie klienckie openconnect jest dostępne dla systemów Debian, Ubuntu, Fedora, RHEL, CentOS, Arch Linux i OpenSUSE. Możesz go łatwo zainstalować za pomocą menedżera pakietów.

sudo apt install openconnect
sudo dnf install openconnect
sudo pacman -S openconnect

Wymagania

Aby skorzystać z tego samouczka, będziesz potrzebować VPS (wirtualnego serwera prywatnego), który będzie miał swobodny dostęp do zablokowanych stron internetowych (poza Twoim krajem lub systemem filtrowania Internetu). Polecam Kamatera VPS, który charakteryzuje się:

  • 30-dniowy bezpłatny okres próbny.
  • Zaczyna się od 4 USD miesięcznie (1 GB RAM)
  • Wysokowydajny VPS oparty na KVM
  • 9 centrów danych na całym świecie, w tym w Stanach Zjednoczonych, Kanadzie, Wielkiej Brytanii, Niemczech, Holandii, Hongkongu i Izraelu.

Postępuj zgodnie z samouczkiem, do którego link znajduje się poniżej, aby utworzyć serwer Linux VPS w Kamatera.

  • Jak utworzyć serwer VPS z systemem Linux na Kamatera

Gdy już będziesz mieć VPS z systemem CentOS 8, postępuj zgodnie z poniższymi instrukcjami.

Potrzebujesz także nazwy domeny, aby włączyć protokół HTTPS dla OpenConnect VPN. Zarejestrowałem swoją nazwę domeny w NameCheap, ponieważ cena jest niska, a oni zapewniają bezpłatną ochronę prywatności Whois na całe życie.

Krok 1: Zainstaluj serwer OpenConnect VPN (ocserv) na CentOS 8

Zaloguj się do serwera CentOS 8 przez SSH. Następnie uruchom poniższe polecenia, aby zainstalować pakiet ocserv z repozytorium EPEL.

sudo dnf install epel-release
sudo dnf install ocserv

Krok 2: Otwórz porty w zaporze sieciowej

Zapora sieciowa w CentOS jest domyślnie włączona. Zwyczajowo konfiguruje się ocserv do nasłuchiwania na porcie 443, więc uruchom następujące polecenia, aby otworzyć port TCP i UDP 443.

sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=443/udp

Musimy także otworzyć port TCP 80, aby uzyskać certyfikat TLS od Let’s Encrypt.

sudo firewall-cmd --permanent --add-port=80/tcp

Załaduj ponownie zaporę sieciową, aby zmiany zaczęły obowiązywać.

sudo systemctl reload firewalld

Krok 3: Zainstaluj klienta Let's Encrypt (Certbot) na serwerze CentOS 8

Pakiet gnutls-utils instalowany wraz z ocserv zapewnia narzędzia do tworzenia własnego urzędu certyfikacji i certyfikatu serwera, ale my uzyskamy i zainstalujemy certyfikat Let's Encrypt. Zaletą korzystania z certyfikatu Let’s Encrypt jest to, że jest on bezpłatny, łatwiejszy w konfiguracji i zaufany przez oprogramowanie klienckie VPN.

Uruchom następujące polecenie, aby zainstalować klienta Let’s Encrypt (certbot) na CentOS 8.

sudo dnf install certbot

Aby sprawdzić numer wersji, uruchom

certbot --version

Przykładowe wyjście:

certbot 1.14.0

Krok 4: Uzyskaj zaufany certyfikat TLS od Let’s Encrypt

Do uzyskania certyfikatu TLS polecam używać wtyczki standalone lub webroot.

Samodzielna wtyczka

Jeśli na serwerze CentOS 8 nie działa żaden serwer WWW, a chcesz, aby serwer OpenConnect VPN korzystał z portu 443, możesz użyć samodzielnej wtyczki, aby uzyskać certyfikat TLS od Let’s Encrypt. Ustaw rekord DNS A dla vpn.example.com na stronie rejestratora domeny, a następnie uruchom następujące polecenie, aby uzyskać certyfikat.

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

Wyjaśnienie:

  • certonly: uzyskaj certyfikat, ale go nie instaluj.
  • --standalone: użyj samodzielnej wtyczki, aby uzyskać certyfikat
  • --preferred-challenge http: Wykonaj wyzwanie http-01, aby zweryfikować naszą domenę, która będzie korzystać z portu 80.
  • --agree-tos: Zaakceptuj warunki korzystania z usługi Let's Encrypt.
  • --email: Adres e-mail służy do rejestracji konta i odzyskiwania.
  • -d: Podaj nazwę swojej domeny.

Jak widać na poniższym zrzucie ekranu, pomyślnie uzyskałem certyfikat.

Korzystanie z wtyczki webroot

Jeśli Twój serwer CentOS 8 ma serwer WWW nasłuchujący na portach 80 i 443, dobrym pomysłem jest użycie wtyczki webroot w celu uzyskania certyfikatu, ponieważ wtyczka webroot działa z prawie każdym serwerem WWW i nie musimy instalować wtyczki certyfikat na serwerze WWW.

Najpierw musisz utworzyć wirtualnego hosta dla vpn.example.com.

Apacz

Jeśli używasz serwera WWW Apache, utwórz hosta wirtualnego w katalogu /etc/httpd/conf.d/.

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

I wklej następujące wiersze do pliku.

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

        DocumentRoot /var/www/html/
</VirtualHost>

Zapisz i zamknij plik. Załaduj ponownie Apache, aby zmiany zaczęły obowiązywać.

sudo systemctl reload httpd

Po utworzeniu i włączeniu hosta wirtualnego uruchom następujące polecenie, aby uzyskać certyfikat Let's Encrypt za pomocą wtyczki webroot.

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

Nginx

Jeśli używasz serwera WWW Nginx, utwórz hosta wirtualnego w /etc/nginx/conf.d/.

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

Wklej następujące wiersze do pliku.

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

      root /usr/share/nginx/html/;

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

Zapisz i zamknij plik. Załaduj ponownie Nginx, aby zmiany zaczęły obowiązywać.

sudo systemctl reload nginx

Po utworzeniu i włączeniu hosta wirtualnego uruchom następujące polecenie, aby uzyskać certyfikat Let's Encrypt za pomocą wtyczki webroot.

sudo certbot certonly --webroot --agree-tos --email [email  -d vpn.example.com -w /usr/share/nginx/html/

Krok 5: Edytuj plik konfiguracyjny serwera OpenConnect VPN

Edytuj plik konfiguracyjny ocserv.

sudo nano /etc/ocserv/ocserv.conf

Najpierw skonfiguruj uwierzytelnianie hasłem. Domyślnie włączone jest uwierzytelnianie hasłem poprzez PAM (Pluggable Authentication Modules), co pozwala na używanie kont systemowych CentOS do logowania się z klientów VPN. To zachowanie można wyłączyć, komentując następujący wiersz.

auth = "pam"

Jeśli chcemy, aby użytkownicy do logowania korzystali z oddzielnych kont VPN zamiast kont systemowych, musimy dodać następujący wiersz, aby umożliwić uwierzytelnianie hasłem za pomocą pliku haseł.

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

Po zakończeniu edycji tego pliku konfiguracyjnego zobaczymy, jak użyć narzędzia ocpasswd do wygenerowania pliku /etc/ocserv/ocpasswd, który zawiera listę nazw użytkowników i zakodowanych haseł.

Uwaga: Ocserv obsługuje uwierzytelnianie za pomocą certyfikatu klienta, ale Let's Encrypt nie wystawia certyfikatu klienta. Jeśli chcesz włączyć uwierzytelnianie za pomocą certyfikatu, musisz skonfigurować własny urząd certyfikacji, który będzie wystawiał certyfikat klienta.

Następnie znajdź następujące dwie linie.

tcp-port = 443
udp-port = 443

Skomentuj port UDP. (Będziemy używać algorytmu TCP BBR, aby zwiększyć prędkość protokołu TCP.)

tcp-port = 443 
#udp-port = 443

Jeśli nie chcesz, aby ocserv używał portu TCP 443 (istnieje serwer WWW korzystający z portu 443?), zmień numer portu TCP. W przeciwnym razie zostaw to w spokoju.

Następnie znajdź następujące dwie linie. Musimy je zmienić.

server-cert = /etc/pki/ocserv/public/server.crt
server-key = /etc/pki/ocserv/private/server.key

Zastąp ustawienie domyślne ścieżką certyfikatu serwera Let's Encrypt i pliku klucza serwera.

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

Zaleca się włączenie kompresji LZ4, więc odkomentuj następujący wiersz.

compression = true

Następnie ustaw maksymalną liczbę klientów. Wartość domyślna to 16. Ustaw na zero, aby uzyskać nieograniczoną liczbę.

max-clients = 0

Ustaw liczbę urządzeń, z których użytkownik może się jednocześnie zalogować. Wartość domyślna to 2. Ustaw na zero, aby uzyskać nieograniczoną liczbę.

max-same-clients = 0

Domyślnie pakiety podtrzymujące są wysyłane co 32400 sekund (9 godzin). Wolę używać krótkiego czasu (30 sekund), aby zmniejszyć ryzyko zerwania połączenia VPN.

keepalive = 30

Następnie znajdź następujący wiersz. Zmień false na true, aby włączyć wykrywanie MTU, które może zoptymalizować wydajność VPN.

try-mtu-discovery = true

Możesz ustawić czas, przez który klient może pozostać bezczynny przed rozłączeniem, za pomocą dwóch poniższych parametrów. Jeśli wolisz, aby klient pozostawał połączony przez czas nieokreślony, skomentuj te dwa parametry.

idle-timeout=1200
mobile-idle-timeout=2400

Następnie ustaw domyślną domenę na vpn.example.com.

default-domain = vpn.example.com

Domyślna konfiguracja sieci IPv4 jest następująca. Będzie to powodować problemy, ponieważ większość routerów domowych ustawia również zakres sieci IPv4 na 192.168.1.0/24.

#ipv4-network = 192.168.1.0
#ipv4-netmask = 255.255.255.0

Możemy użyć innego prywatnego zakresu adresów IP (takiego jak 10.10.10.0/24), aby uniknąć kolizji adresów IP, więc odkomentuj powyższe dwie linie i zmień wartość ipv4-network na 10.10. 10.0.

ipv4-network = 10.10.10.0
ipv4-netmask = 255.255.255.0

Znajdź poniższe dwa wiersze i odkomentuj je, aby klienci VPN otrzymali prywatne adresy IPv6.

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

Jeśli zobaczysz następujący wiersz

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

Zmień to na:

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

Teraz odkomentuj następujący wiersz, aby tunelować wszystkie zapytania DNS przez VPN.

tunnel-all-dns = true

Zmień adres modułu rozpoznawania nazw DNS. Możesz skorzystać z publicznego serwera DNS Google.

dns = 8.8.8.8
dns = 8.8.4.4

lub publiczny serwer DNS Cloudflare.

dns = 1.1.1.1
dns = 1.0.0.1

Uwaga: jeśli jesteś dostawcą usług VPN, dobrą praktyką jest uruchomienie własnego modułu rozpoznawania nazw DNS. Jeśli na tym samym serwerze działa program rozpoznawania nazw DNS, określ DNS jako

dns = 10.10.10.1

10.10.10.1 to adres IP serwera OpenConnect VPN w sieci VPN. Przyspieszy to nieco wyszukiwanie DNS dla klientów, ponieważ wyeliminowane jest opóźnienie sieciowe między serwerem VPN a modułem rozpoznawania nazw DNS.

Następnie skomentuj wszystkie parametry trasy (dodaj znak # na początku kolejnych wierszy), co spowoduje ustawienie serwera jako bramy domyślnej dla klientów.

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

#no-route = 192.168.5.0/255.255.255.0

Na koniec przewiń w dół do końca pliku (w edytorze tekstu Nano możesz przejść na koniec pliku, naciskając Ctrl+W, a następnie naciskając Ctrl+V ) i skomentuj parametr user-profile, ponieważ plik XML profilu użytkownika nie jest potrzebny klientom OpenConnect ani klientowi Cisco AnyConnect w systemach iOS i Android.

#user-profile = profile.xml

Uwaga: jeśli profil użytkownika jest włączony, klient Cisco AnyConnect na iOS wyświetli następujący błąd podczas łączenia się z serwerem OpenConnect VPN.

Failed to download the AnyConnect profile. Please try again.

Zapisz i zamknij plik.

Krok 6: Tworzenie kont VPN

Teraz użyj narzędzia ocpasswd do wygenerowania kont VPN.

sudo ocpasswd -c /etc/ocserv/ocpasswd username

Zostaniesz poproszony o ustawienie hasła dla użytkownika, a informacje zostaną zapisane w pliku /etc/ocserv/ocpasswd. Aby zresetować hasło, po prostu uruchom ponownie powyższe polecenie.

Teraz możemy uruchomić usługę ocserv.

sudo systemctl start ocserv

I włącz automatyczne uruchamianie podczas uruchamiania.

sudo systemctl enable ocserv

Możesz sprawdzić jego status za pomocą:

systemctl status ocserv

Przykładowe wyjście:

● ocserv.service - OpenConnect SSL VPN server
   Loaded: loaded (/usr/lib/systemd/system/ocserv.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2020-01-03 19:04:53 CST; 15s ago
     Docs: man:ocserv(8)
 Main PID: 19851 (ocserv-main)
    Tasks: 2 (limit: 5061)
   Memory: 3.2M
   CGroup: /system.slice/ocserv.service
           ├─19851 ocserv-main
           └─19853 ocserv-sm

Wskazówka: Jeśli powyższe polecenie nie zakończy się natychmiast, możesz nacisnąć klawisz Q, aby odzyskać kontrolę nad terminalem.

Domyślnie serwer OpenConnect VPN nasłuchuje na porcie TCP i UDP 443. Jeśli jest używany przez serwer WWW, nie można uruchomić serwera VPN. Zobaczymy, jak sprawić, by serwer OpenConnect VPN i serwer WWW korzystały z tego samego portu później.

Krok 7: Włącz przekazywanie IP w jądrze Linuksa

Aby serwer VPN mógł kierować pakiety pomiędzy klientami VPN a Internetem, musimy włączyć przekazywanie IP, uruchamiając następujące polecenie.

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

Uruchom także następujące dwa polecenia, aby włączyć algorytm TCP BBR w celu zwiększenia szybkości protokołu 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

Następnie zastosuj zmiany za pomocą poniższego polecenia. Opcja -p załaduje ustawienia sysctl z pliku /etc/sysctl.d/60-custom.conf. To polecenie zachowa nasze zmiany po ponownym uruchomieniu systemu.

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

Krok 8: Skonfiguruj maskowanie adresów IP w zaporze sieciowej

Uruchom następujące polecenie, aby włączyć maskowanie adresów IP dla podsieci 10.10.10.0/24 w zaporze serwera.

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.10.0/24" masquerade'
sudo systemctl reload firewalld

Spowoduje to ukrycie Twojej sieci VPN przed światem zewnętrznym. Zatem Internet może zobaczyć tylko adres IP Twojego serwera VPN, ale nie może zobaczyć adresu IP Twojego klienta VPN, tak jak router domowy ukrywa Twoją prywatną sieć domową.

Teraz serwer OpenConnect VPN jest gotowy do akceptowania połączeń klientów.

Zainstaluj i używaj klienta OpenConnect VPN na komputerze stacjonarnym CentOS 8/Fedora

Uruchom następujące polecenie, aby zainstalować klienta wiersza poleceń OpenConnect VPN na komputerze stacjonarnym Fedory.

sudo dnf install openconnect

W CentOS 8 musisz włączyć repozytorium EPEL, aby zainstalować klienta.

sudo dnf install epel-release
sudo dnf install openconnect

Następnie możesz połączyć się z serwerem VPN z wiersza poleceń, jak poniżej. Flaga -b sprawi, że będzie działać w tle po nawiązaniu połączenia.

sudo openconnect -b vpn.example.com

Domyślnie klient openconnect wysyła żądanie do portu 443 serwera. Jeśli skonfigurowałeś inny port dla serwera, możesz dodać numer portu.

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

Zostaniesz poproszony o podanie nazwy użytkownika i hasła VPN. Jeśli połączenie zostanie pomyślnie nawiązane, pojawi się następujący komunikat.

Got CONNECT response: HTTP/1.1 200 CONNECTED
CSTP connected. DPD 90, Keepalive 32400
Connected as 10.10.10.139, using SSL + lz4
Continuing in background; pid 2137
Established DTLS connection (using GnuTLS). Ciphersuite (DTLS1.2)-(PSK)-(AES-256-GCM).

Jeśli połączenie nie powiodło się, możesz sprawdzić dziennik ocserv, aby dowiedzieć się dlaczego. (Być może nie wpisałeś poprawnie hasła.)

sudo journaltcl -eu ocserv

Aby przerwać połączenie, uruchom:

sudo pkill openconnect

Aby uruchomić klienta w sposób nieinteraktywny, użyj następującej składni.

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

Jeśli pomyślnie nawiązałeś połączenie z serwerem VPN, ale Twój publiczny adres IP się nie zmienia, oznacza to, że nie działa przekazywanie adresu IP lub maskowanie adresu IP.

Automatyczne łączenie przy uruchomieniu systemu

Aby klient OpenConnect VPN automatycznie łączył się z serwerem podczas uruchamiania, możemy utworzyć systemową jednostkę usługową.

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

Umieść następujące linie w pliku. Zastąp czerwony tekst.

[Unit]
  Description=OpenConnect VPN Client
  After=network-online.target
  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

Zapisz i zamknij plik. Następnie włącz tę usługę, aby uruchomiła się w momencie rozruchu.

sudo systemctl enable openconnect.service

Wyjaśnienie zawartości pliku:

  • After=network-online.target i Wants=network-online.target powodują, że ta usługa działa po uruchomieniu sieci.
  • W rzeczywistości ta usługa może nadal działać, zanim sieć zostanie uruchomiona. Dodajemy Restart=always i RestartSec=2, aby ponownie uruchomić tę usługę po 2 sekundach, jeśli ta usługa się nie powiedzie.
  • Systemd nie rozpoznaje przekierowania potoku. Zatem w dyrektywie ExecStart zawijamy polecenie w pojedyncze cudzysłowy i uruchamiamy je z powłoką Bash.
  • Ponieważ klient OpenConnect VPN będzie działał jako usługa systemowa działająca w tle, nie ma potrzeby dodawania flagi -b do polecenia openconnect.
  • Dyrektywa KillSignal mówi Systemdowi, aby wysłał sygnał SIGINT po wydaniu polecenia systemctl stop openconnect. Spowoduje to czyste zamknięcie poprzez wylogowanie sesji i przywrócenie ustawień serwera DNS oraz tabeli routingu jądra Linux.

Aby natychmiast uruchomić tę usługę Systemd, uruchom

sudo systemctl start openconnect

Aby zatrzymać tę usługę Systemd, uruchom

sudo systemctl stop openconnect

Klient GUI OpenConnect dla systemów Windows i MacOS

Można je pobrać ze strony Github OpenConnect GUI.

Prędkość

OpenConnect VPN jest dość szybki. Mogę go używać do oglądania filmów w rozdzielczości 4K na YouTube. Jak widać, prędkość połączenia wynosi 63356 Kbps, co przekłada się na 61 Mbit/s.

A oto wyniki testu na speedtest.net.

Optymalizacja prędkości

OpenConnect domyślnie korzysta z protokołu TLS przez UDP (DTLS), aby osiągnąć większą prędkość, ale protokół UDP nie zapewnia niezawodnej transmisji. TCP jest wolniejszy niż UDP, ale może zapewnić niezawodną transmisję. Jedną wskazówką optymalizacyjną, jaką mogę ci dać, jest wyłączenie DTLS, użycie standardowego TLS (przez TCP), a następnie włączenie protokołu TCP BBR w celu zwiększenia szybkości protokołu TCP.

Możesz także wyłączyć DTLS, aby ominąć ograniczenia zapory, ponieważ DTLS używa portu UDP 443. Standardowy TLS używa portu TCP 443.

Aby wyłączyć DTLS, skomentuj (dodaj symbol # na początku) następujący wiersz w pliku konfiguracyjnym ocserv.

udp-port = 443

Zapisz i zamknij plik. Następnie uruchom ponownie usługę ocserv.

sudo systemctl restart ocserv.service

Aby włączyć protokół TCP BBR, zapoznaj się z poniższym samouczkiem. Jest napisany dla Ubuntu, ale działa również dla CentOS. Pamiętaj, że musisz wyłączyć DTLS w ocserv, w przeciwnym razie TCP BBR nie będzie działać.

  • Jak łatwo zwiększyć wydajność sieci serwerów, włączając TCP BBR

W moim teście standardowy TLS z włączoną obsługą TCP BBR jest dwa razy szybszy niż DTLS.

Kolejnym bardzo ważnym czynnikiem wpływającym na prędkość jest to, jak dobre jest połączenie między komputerem lokalnym a serwerem VPN. Jeśli mieszkasz na Bliskim Wschodzie, a serwer VPN znajduje się w USA, prędkość będzie niska. Wybierz centrum danych znajdujące się blisko Twojego miejsca zamieszkania.

Automatyczne odnawianie certyfikatu Let’s Encrypt

Edytuj plik crontab użytkownika root.

sudo crontab -e

Dodaj następujący wiersz na końcu pliku, aby codziennie uruchamiać zadanie Cron. Jeśli certyfikat wygaśnie za 30 dni, certbot spróbuje go odnowić. Konieczne jest ponowne uruchomienie usługi ocserv, aby serwer VPN mógł pobrać nowy certyfikat i plik klucza.

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

Wskazówki dotyczące rozwiązywania problemów

Pamiętaj, że jeśli korzystasz z OpenVZ VPS, pamiętaj o włączeniu wirtualnego urządzenia sieciowego TUN w panelu sterowania VPS. (Jeśli korzystasz z Vultr VPS, to masz VPS oparty na KVM, więc nie musisz się tym martwić.)

Jeśli napotkasz jakiś problem, sprawdź dziennik serwera OpenConnect VPN.

sudo journalctl -eu ocserv.service

Odkryłem, że jeśli zmienię port 443 na inny, świetna zapora sieciowa w Chinach zablokuje to połączenie VPN.

Jeśli ocserv poinformuje Cię, że nie może załadować pliku /etc/ocserv/ocserv.conf, możesz zatrzymać ocserv.

sudo systemctl stop ocserv

Następnie uruchom go na pierwszym planie z włączonym debugowaniem.

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

Następnie wynik może dać ci wskazówki, dlaczego ocserv nie działa.

Jeśli pomyślnie nawiązałeś połączenie z serwerem VPN, ale nie możesz przeglądać Internetu, oznacza to, że nie działa przekazywanie adresów IP lub maskowanie adresów IP.

W tym systemie nie zainstalowano adaptera Tap-Windows

Jeśli używasz klienta OpenConnect GUI dla systemu Windows i znalazłeś w dziennikach błąd „W tym systemie nie zainstalowano adaptera Tap-Windows” (Widok - okno dziennika), jest to prawdopodobnie spowodowane zainstalowaniem innych klientów VPN później jak OpenVPN.

Aby naprawić ten błąd, musisz odinstalować klienta GUI OpenConnect i zainstalować go ponownie. W kreatorze instalacji będziesz mieć możliwość zainstalowania sterownika TAP.

Spraw, aby serwer OpenConnect VPN i serwer WWW korzystały jednocześnie z portu 443

Proszę przeczytać następujący artykuł:

  • Uruchom serwer OpenConnect VPN i Apache/Nginx na tym samym urządzeniu z HAProxy

Jak wyłączyć TLS 1.0 i TLS 1.1 w ocserv

Rada PCI wycofała protokół TLS 1.0 30 czerwca 2018 r., a główne przeglądarki internetowe wyłączą TLS 1.0 i TLS 1.1 w 2020 r. To samo powinniśmy zrobić z serwerem VPN. Edytuj główny plik konfiguracyjny.

sudo nano /etc/ocserv/ocserv.conf

Znajdź następującą linię:

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

Aby wyłączyć TLS 1.0 i TLS 1.1 na serwerze OpenConnect VPN, zamień go na:

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

Zapisz i zamknij plik. Następnie uruchom ponownie ocserv.

sudo systemctl restart ocserv

Teraz ocserv akceptuje tylko TLS 1.3 i TLS 1.2. Aby uzyskać więcej informacji na temat konfigurowania parametru TLS w ocserv, zobacz ciągi priorytetów GnuTLS.

Aby sprawdzić, czy Twój serwer OpenConnect VPN obsługuje protokół TLS 1.0, uruchom następujące polecenie.

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

I sprawdź TLS 1.1

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

Jeśli na wyjściu zobaczysz następujący komunikat, oznacza to, że wersja TLS nie jest obsługiwana.

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

Konfiguracja dla użytkownika lub grupy

Ocserv umożliwia konfiguracje dla poszczególnych użytkowników i grup. Aby włączyć tę funkcję, odkomentuj następujące dwie linie w pliku /etc/ocserv/ocserv.conf.

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

Zapisz i zamknij plik. Następnie utwórz katalog konfiguracyjny dla użytkownika i grupy.

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

Następnie możesz utworzyć plik w tych dwóch katalogach. Na przykład utwórz plik user1, aby umożliwić niestandardową konfigurację dla user1.

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

Możesz także utworzyć plik group1, aby umożliwić niestandardową konfigurację grupy o nazwie group1.

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

Możesz dodać do pliku coś takiego jak poniżej.

route = 10.10.10.0/255.255.255.0

Oznacza to, że po połączeniu user1 z tym serwerem VPN, tylko ruch do sieci 10.10.10.0/24 będzie kierowany przez serwer VPN. Ruch do innych adresów IP jest kierowany przez oryginalną bramę. Nazywa się to tunelowaniem dzielonym i jest przydatne, gdy:

  • Chcesz po prostu, aby klienci VPN mogli przeglądać zasoby wewnętrzne i nie chcesz, aby cały ruch przechodził przez serwer VPN.
  • Musisz zbudować prywatną sieć dla serwerów w chmurze.
  • Klient musi połączyć się z wieloma sieciami VPN. Jedna sieć VPN może korzystać z dzielonego tunelowania, a druga z pełnego tunelu.

Zapisz i zamknij plik. Uruchom ponownie ocserv, aby zmiany zaczęły obowiązywać.

Jak skonfigurować przekaźnik VPN

Załóżmy, że istnieją dwa serwery: serwer A i serwer B.

  • Masz dobre połączenie z serwerem A. Opóźnienie jest bardzo małe i żaden pakiet nie jest odrzucany.
  • Masz złe połączenie z serwerem B. Opóźnienie jest duże i pakiet jest odrzucany.
  • Połączenie między serwerem A i serwerem B jest dobre.

Naturalnie chcesz zainstalować VPN na serwerze A. Ale co, jeśli chcesz, aby Internet widział Twój ruch pochodzący z adresu IP serwera B? Cóż, możesz zainstalować ocserv VPN na serwerze B, a następnie skonfigurować HAProxy na serwerze A, aby proxy ruchu pomiędzy twoim komputerem a serwerem B.

Na serwerze A zainstaluj HAProxy.

sudo dnf install haproxy

Edytuj główny plik konfiguracyjny.

sudo nano /etc/haproxy/haproxy.cfg

Utwórz frontend i backend tak jak poprzednio. Zamień 12.34.56.78 na publiczny adres IP serwera A. Zamień 12.34.56.79 na publiczny adres IP serwera B.

frontend https
   bind 12.34.56.78:443
   mode tcp
   tcp-request inspect-delay 5s
   tcp-request content accept if { req_ssl_hello_type 1 }

   use_backend ocserv if { req_ssl_sni -i vpn.example.com }

   default_backend ocserv

backend ocserv
   mode tcp
   option ssl-hello-chk
   server ocserv 12.34.56.79:443 send-proxy-v2

Zapisz i zamknij plik. Na serwerze B powinieneś skonfigurować ocserv tak, aby nasłuchiwał na publicznym adresie IP i włączyć protokół proxy, tak jak poprzednio. Następnie edytuj rekord A vpn.example.com. Należy wskazać adres IP serwera A.

Uruchom ponownie HAProxy i Ocserv i powinno działać.

Uwaga: Jeśli serwer B również używa HAProxy, powinieneś usunąć parametr send-proxy-v2 z powyższej konfiguracji HAProxy.

Hosting wirtualny

Aby dodać nowy host wirtualny w ocserv, najpierw musisz zastosować metodę z kroku 4, aby uzyskać certyfikat TLS dla nowego hosta wirtualnego. Następnie edytuj plik konfiguracyjny ocserv.

sudo nano /etc/ocserv/ocserv.conf

Przejdź na dół tego pliku. W edytorze tekstu Nano możesz nacisnąć Ctrl+W, a następnie Ctrl+V, aby przejść na dół pliku. Dodaj następujące linie. Zastąp vpn2.example.com nazwą hosta drugiego hosta wirtualnego.

[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/

Zapisz i zamknij plik. Następnie uruchom ponownie ocserv.

sudo systemctl restart ocserv

Pamiętaj, że demon ocserv może poinformować Cię, że niektóre parametry zostaną zignorowane w przypadku hosta wirtualnego. Odkryłem jednak, że niektóre z ignorowanych parametrów są rzeczywiście potrzebne. Na przykład, jeśli usuniesz linię device=vpns z hosta wirtualnego, podczas ustanawiania połączenia VPN z hostem wirtualnym może wystąpić następujący błąd.

VPN service unavailable; reason: Server configuration error

Serwer VPN wyświetli w dzienniku następujący komunikat o błędzie.

no networks are configured; rejecting client

Pamiętaj, że klient AnyConnect VPN na iOS nie obsługuje TLS SNI, więc użytkownicy iOS będą łączyć się z domyślnym hostem wirtualnym.

Jak uruchomić wiele instancji ocserv

Jeden proces ocserv może powiązać się tylko z jednym portem TCP lub UDP na serwerze. Jeśli chcesz pozwolić ocserv na łączenie się z wieloma portami TCP lub UDP, musisz uruchomić wiele procesów ocserv. To jest bardzo proste. Skopiuj /usr/lib/systemd/system/ocserv.service do nowego pliku.

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

Następnie edytuj nowy plik.

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

Zmiana

/etc/ocserv/ocserv.conf

Do

/etc/ocserv/ocserv2.conf

Zapisz i zamknij plik. Następnie możesz edytować plik /etc/ocserv/ocserv2.conf i dodać własne konfiguracje. Gdy już skończysz, uruchom drugą usługę ocserv.

sudo systemctl start ocserv2

Podsumowanie

Otóż to! Mam nadzieję, że ten samouczek pomógł Ci zainstalować i skonfigurować OpenConnect VPN na serwerze CentOS 8/RHEL 8. Jak zawsze, jeśli uważasz ten post za przydatny, zapisz się do naszego bezpłatnego biuletynu, aby uzyskać więcej porad i wskazówek. Uważaj 🙂

Powiązane artykuły