OpenVPN na VPS — instalacja, certyfikaty Easy-RSA, konfiguracja klienta i kill switch
Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / Bezpieczeństwo
Własny serwer VPN na VPS to pełna kontrola nad ruchem sieciowym, brak limitów prędkości i brak logowania przez zewnętrznego dostawcę. OpenVPN to sprawdzone, open-source rozwiązanie działające na Linuksie, Windows, macOS i urządzeniach mobilnych. W tym przewodniku skonfigurujesz działający tunel VPN od zera — od instalacji Easy-RSA przez generowanie certyfikatów aż do pliku .ovpn dla klienta i kill switcha.
Instalacja OpenVPN i Easy-RSA
Zacznij od aktualizacji systemu i instalacji pakietów. Poniższe komendy działają na Ubuntu 22.04 / Debian 12:
sudo apt update && sudo apt upgrade -y sudo apt install -y openvpn easy-rsa # Sprawdź wersje openvpn --version ls /usr/share/easy-rsa/
Utwórz katalog PKI (Public Key Infrastructure) dla Easy-RSA:
make-cadir ~/openvpn-ca cd ~/openvpn-ca # Edytuj vars — ustaw dane organizacji nano vars
W pliku vars zmień pola organizacji (opcjonalne, ale porządne):
set_var EASYRSA_REQ_COUNTRY "PL" set_var EASYRSA_REQ_PROVINCE "Mazowieckie" set_var EASYRSA_REQ_CITY "Warszawa" set_var EASYRSA_REQ_ORG "MojaFirma" set_var EASYRSA_REQ_EMAIL "[email protected]" set_var EASYRSA_REQ_OU "IT" set_var EASYRSA_KEY_SIZE 2048 set_var EASYRSA_CA_EXPIRE 3650 set_var EASYRSA_CERT_EXPIRE 825
Generowanie certyfikatów Easy-RSA
Inicjalizacja PKI, budowa CA, generowanie certyfikatu serwera i klucza Diffie-Hellman:
cd ~/openvpn-ca # 1. Inicjalizacja PKI ./easyrsa init-pki # 2. Buduj CA (Certificate Authority) — podaj hasło i Common Name ./easyrsa build-ca # 3. Generuj klucz i CSR serwera (bez hasła — nopass) ./easyrsa gen-req server nopass # 4. Podpisz certyfikat serwera przez CA ./easyrsa sign-req server server # 5. Parametry Diffie-Hellman (może zająć kilka minut) ./easyrsa gen-dh # 6. Klucz HMAC (ochrona przed atakami DoS na handshake) openvpn --genkey secret pki/ta.key # 7. Certyfikat klienta (np. dla laptop-jan) ./easyrsa gen-req laptop-jan nopass ./easyrsa sign-req client laptop-jan
Skopiuj pliki do katalogu OpenVPN:
sudo cp pki/ca.crt /etc/openvpn/server/ sudo cp pki/issued/server.crt /etc/openvpn/server/ sudo cp pki/private/server.key /etc/openvpn/server/ sudo cp pki/dh.pem /etc/openvpn/server/ sudo cp pki/ta.key /etc/openvpn/server/ # Uprawnienia — klucze prywatne tylko dla root sudo chmod 600 /etc/openvpn/server/server.key sudo chmod 600 /etc/openvpn/server/ta.key
Konfiguracja serwera OpenVPN
Utwórz plik konfiguracyjny serwera /etc/openvpn/server/server.conf:
# Protokół i port proto udp port 1194 # Interfejsy wirtualne dev tun # Certyfikaty ca /etc/openvpn/server/ca.crt cert /etc/openvpn/server/server.crt key /etc/openvpn/server/server.key dh /etc/openvpn/server/dh.pem # HMAC ochrona handshake tls-auth /etc/openvpn/server/ta.key 0 cipher AES-256-GCM auth SHA256 # Sieć VPN — pula adresów dla klientów server 10.8.0.0 255.255.255.0 # Routuj CAŁY ruch klientów przez VPN push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 1.1.1.1" push "dhcp-option DNS 8.8.8.8" # Keepalive i limity keepalive 10 120 max-clients 10 # Bezpieczeństwo — drop uprawnień po starcie user nobody group nogroup persist-key persist-tun # Logi status /var/log/openvpn-status.log log-append /var/log/openvpn.log verb 3
Włącz IP forwarding i uruchom usługę:
# Włącz IP forwarding (trwale)
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# iptables NAT — maskuj ruch VPN jako publiczne IP serwera
IFACE=$(ip route | grep default | awk '{print $5}')
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o $IFACE -j MASQUERADE
# Zapisz reguły iptables
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
# Uruchom i włącz autostart OpenVPN
sudo systemctl start openvpn-server@server
sudo systemctl enable openvpn-server@server
sudo systemctl status openvpn-server@server Konfiguracja klienta — plik .ovpn
Plik .ovpn to self-contained konfiguracja klienta — zawiera certyfikaty wbudowane
inline. Utwórz skrypt generujący plik dla klienta laptop-jan:
#!/bin/bash
# gen-client-ovpn.sh
CLIENT=${1:-laptop-jan}
SERVER_IP="1.2.3.4" # publiczne IP Twojego VPS
PKI_DIR="/root/openvpn-ca/pki"
OUTPUT="${CLIENT}.ovpn"
cat > "$OUTPUT" <<EOF
client
dev tun
proto udp
remote $SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
key-direction 1
verb 3
EOF
echo "<ca>" >> "$OUTPUT"
cat "$PKI_DIR/ca.crt" >> "$OUTPUT"
echo "</ca>" >> "$OUTPUT"
echo "<cert>" >> "$OUTPUT"
cat "$PKI_DIR/issued/${CLIENT}.crt" >> "$OUTPUT"
echo "</cert>" >> "$OUTPUT"
echo "<key>" >> "$OUTPUT"
cat "$PKI_DIR/private/${CLIENT}.key" >> "$OUTPUT"
echo "</key>" >> "$OUTPUT"
echo "<tls-auth>" >> "$OUTPUT"
cat "$PKI_DIR/ta.key" >> "$OUTPUT"
echo "</tls-auth>" >> "$OUTPUT"
echo "Wygenerowano: $OUTPUT" chmod +x gen-client-ovpn.sh sudo bash gen-client-ovpn.sh laptop-jan # Skopiuj .ovpn do klienta przez SCP scp laptop-jan.ovpn user@komputer-klienta:/home/user/
Kill switch — blokada ruchu poza VPN
Kill switch uniemożliwia wyciek danych przez publiczne łącze gdy VPN się rozłączy. Dodaj do
pliku klienta .ovpn lub skonfiguruj iptables na kliencie:
# Kill switch przez iptables (na komputerze klienta) # Zapisz w /etc/openvpn/client/kill-switch.sh #!/bin/bash VPN_SERVER="1.2.3.4" # IP serwera VPN VPN_PORT="1194" # Zresetuj reguły iptables -F iptables -X # Domyślna polityka DROP iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # Zezwól na loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Zezwól na nawiązanie połączenia z serwerem VPN iptables -A OUTPUT -d $VPN_SERVER -p udp --dport $VPN_PORT -j ACCEPT iptables -A INPUT -s $VPN_SERVER -p udp --sport $VPN_PORT -j ACCEPT # Zezwól na CAŁY ruch przez interfejs tun0 (VPN) iptables -A INPUT -i tun0 -j ACCEPT iptables -A OUTPUT -o tun0 -j ACCEPT echo "Kill switch aktywny. Ruch tylko przez tun0."
Możesz też użyć dyrektywy w pliku .ovpn (dla klientów Linux):
# Dodaj do pliku .ovpn klienta: script-security 2 up /etc/openvpn/client/kill-switch.sh
Porównanie protokołów VPN
| Protokół | Port domyślny | Wydajność | Konfiguracja | Kiedy używać |
|---|---|---|---|---|
| OpenVPN UDP | 1194/UDP | Dobra | Średnia | Standardowy VPN, routing ruchu |
| OpenVPN TCP | 443/TCP | Gorsza (double TCP) | Średnia | Sieci z blokadą UDP, DPI |
| WireGuard | 51820/UDP | Najlepsza | Prosta | Nowe projekty, mobilne klienty |
| IPSec/IKEv2 | 500/UDP | Bardzo dobra | Złożona | Urządzenia mobilne (natywne wsparcie iOS) |
| L2TP/IPSec | 1701/UDP | Słaba | Prosta | Legacy — unikaj w nowych projektach |
Unieważnienie certyfikatu klienta (odwołanie dostępu)
Gdy klient odchodzi z firmy lub zgubia urządzenie — unieważnij jego certyfikat bez restartu VPN:
cd ~/openvpn-ca # Unieważnij certyfikat klienta ./easyrsa revoke laptop-jan # Wygeneruj nową listę CRL ./easyrsa gen-crl # Skopiuj CRL do OpenVPN sudo cp pki/crl.pem /etc/openvpn/server/ # Dodaj do server.conf (raz): # crl-verify /etc/openvpn/server/crl.pem sudo systemctl reload openvpn-server@server