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.comOprogramowanie 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 openconnectWymagania
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 ocservKrok 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/udpMusimy także otworzyć port TCP 80, aby uzyskać certyfikat TLS od Let’s Encrypt.
sudo firewall-cmd --permanent --add-port=80/tcpZaładuj ponownie zaporę sieciową, aby zmiany zaczęły obowiązywać.
sudo systemctl reload firewalldKrok 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 certbotAby sprawdzić numer wersji, uruchom
certbot --version
Przykładowe wyjście:
certbot 1.14.0Krok 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.comWyjaś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.confI 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 httpdPo 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.confWklej 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 nginxPo 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.confNajpierw 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 = 443Skomentuj port UDP. (Będziemy używać algorytmu TCP BBR, aby zwiększyć prędkość protokołu TCP.)
tcp-port = 443
#udp-port = 443Jeś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.keyZastą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.pemZaleca się włączenie kompresji LZ4, więc odkomentuj następujący wiersz.
compression = trueNastępnie ustaw maksymalną liczbę klientów. Wartość domyślna to 16. Ustaw na zero, aby uzyskać nieograniczoną liczbę.
max-clients = 0Ustaw 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 = 0Domyś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 = 30Nastę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 = trueMoż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=2400Następnie ustaw domyślną domenę na vpn.example.com.
default-domain = vpn.example.comDomyś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.0Moż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.0Znajdź poniższe dwa wiersze i odkomentuj je, aby klienci VPN otrzymali prywatne adresy IPv6.
ipv6-network = fda9:4efe:7e3b:03ea::/48
ipv6-subnet-prefix = 64Jeśli zobaczysz następujący wiersz
ipv6-network = fda9:4efe:7e3b:03ea::/64Zmień to na:
ipv6-network = fda9:4efe:7e3b:03ea::/48Teraz odkomentuj następujący wiersz, aby tunelować wszystkie zapytania DNS przez VPN.
tunnel-all-dns = trueZmień adres modułu rozpoznawania nazw DNS. Możesz skorzystać z publicznego serwera DNS Google.
dns = 8.8.8.8
dns = 8.8.4.4lub publiczny serwer DNS Cloudflare.
dns = 1.1.1.1
dns = 1.0.0.1Uwaga: 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.110.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.0Na 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.xmlUwaga: 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 usernameZostaniesz 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 ocservI włącz automatyczne uruchamianie podczas uruchamiania.
sudo systemctl enable ocservMożesz sprawdzić jego status za pomocą:
systemctl status ocservPrzykł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.confUruchom 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.confNastę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.confKrok 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 firewalldSpowoduje 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 openconnectW CentOS 8 musisz włączyć repozytorium EPEL, aby zainstalować klienta.
sudo dnf install epel-release
sudo dnf install openconnectNastę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.comDomyś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-numberZostaniesz 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 ocservAby przerwać połączenie, uruchom:
sudo pkill openconnectAby 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-stdinJeś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.serviceUmieść 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.serviceWyjaśnienie zawartości pliku:
After=network-online.targetiWants=network-online.targetpowodują, ż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=alwaysiRestartSec=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
ExecStartzawijamy 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
-bdo poleceniaopenconnect. - Dyrektywa
KillSignalmówi Systemdowi, aby wysłał sygnałSIGINTpo wydaniu poleceniasystemctl 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 openconnectAby zatrzymać tę usługę Systemd, uruchom
sudo systemctl stop openconnectKlient 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 = 443Zapisz i zamknij plik. Następnie uruchom ponownie usługę ocserv.
sudo systemctl restart ocserv.serviceAby 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 -eDodaj 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 ocservWskazó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.serviceOdkrył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 ocservNastę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=10Nastę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.confZnajdź 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 ocservTeraz 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 -tls1I sprawdź TLS 1.1
openssl s_client -connect vpn.your-domain.com:443 -tls1_1Jeś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 supportedKonfiguracja 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/user1Możesz także utworzyć plik group1, aby umożliwić niestandardową konfigurację grupy o nazwie group1.
sudo nano /etc/ocserv/config-per-group/group1Możesz dodać do pliku coś takiego jak poniżej.
route = 10.10.10.0/255.255.255.0Oznacza 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 haproxyEdytuj główny plik konfiguracyjny.
sudo nano /etc/haproxy/haproxy.cfgUtwó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-v2z 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.confPrzejdź 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 ocservPamię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 errorSerwer VPN wyświetli w dzienniku następujący komunikat o błędzie.
no networks are configured; rejecting clientPamię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.serviceNastępnie edytuj nowy plik.
sudo nano /etc/systemd/system/ocserv2.serviceZmiana
/etc/ocserv/ocserv.confDo
/etc/ocserv/ocserv2.confZapisz 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 ocserv2Podsumowanie
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 🙂




