 Autor: [Adam Nadolny](/autorzy/adam-nadolny) Ekspert DevOps i infrastruktury · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  OpenVPN na VPS — konfiguracja

# 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      "admin@mojafirma.pl"
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

## Najczęstsze pytania

Jaki port wybrać dla OpenVPN — UDP 1194 czy TCP 443? +

UDP 1194 to domyślny port OpenVPN — niższe opóźnienia, lepsza wydajność dla tunelu VPN. TCP 443 wybierz gdy sieć blokuje UDP lub chcesz udawać ruch HTTPS (głęboka inspekcja pakietów go przepuści). Wadą TCP jest podwójny narzut retransmisji (TCP wewnątrz TCP), co pogarsza latencję przy stratach pakietów.

Co to jest Easy-RSA i do czego służy? +

Easy-RSA to zestaw skryptów do zarządzania własnym CA (Certificate Authority). Generuje klucze i certyfikaty dla serwera OpenVPN oraz każdego klienta. Bez Easy-RSA musiałbyś ręcznie używać openssl do generowania CA, podpisywania CSR i zarządzania CRL. Easy-RSA automatyzuje ten proces: init-pki tworzy strukturę katalogów, build-ca generuje CA, gen-req tworzy klucz+CSR, sign-req podpisuje certyfikat.

Jak działa kill switch w OpenVPN? +

Kill switch blokuje cały ruch sieciowy gdy tunel VPN się rozłączy — zamiast przesyłać dane przez niezabezpieczone łącze ISP. Na Linuksie implementuje się go regułami iptables: domyślna polityka DROP na OUTPUT, następnie reguły akceptujące tylko ruch przez interfejs tun0 (VPN) i niezbędny ruch (DNS do VPN, sam port OpenVPN). Przy zerwaniu połączenia tun0 znika i żaden pakiet nie przechodzi.

Czy mogę podłączyć wiele urządzeń do jednego konta OpenVPN? +

Tak, ale każde urządzenie powinno mieć własny certyfikat klienta (osobna para klucz+cert z Easy-RSA). Używanie tego samego certyfikatu na wielu urządzeniach jednocześnie powoduje konflikty IP i rozłączanie. W pliku server.conf dyrektywa duplicate-cn pozwala na wielokrotne użycie tego samego CN (common name), ale jest to ryzykowne. Zalecane: osobne certyfikaty per urządzenie.

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

VPS z dedykowanym IP — idealny jako prywatny serwer VPN dla firmy lub domu

VPS

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

Mikrus

Tani VPS do testowania konfiguracji OpenVPN przed produkcją

Dev/Test

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

LH.pl

Hosting współdzielony dla stron firmowych obok własnego VPN-a

Hosting

[Aktywuj rabat →](/out/lh-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/lh-pl)

## Powiązane strony

-   [Bezpieczeństwo VPS — checklist](/baza-wiedzy/bezpieczenstwo-vps-checklist)
-   [Nginx load balancer — konfiguracja](/baza-wiedzy/nginx-load-balancer-konfiguracja)
-   [Zero-downtime deployment z Nginx](/baza-wiedzy/zero-downtime-deployment-nginx)
-   [Wszystkie artykuły](/baza-wiedzy/)