Onlarca kullanıcıyı tek bir OpenVPN sunucusunda yönetmek, başlangıçta basit görünse de zamanla ciddi bir organizasyon meselesi haline geliyor. Kim hangi ağa erişebilir, hangi kullanıcının sertifikası süresi dolmuş, uzaktan çalışan ekip üyesi işten ayrıldığında erişimi nasıl iptal edersin? Bu sorulara cevap vermeden kurduğun OpenVPN altyapısı, er ya da geç başına bela olur.
Bu yazıda sıfırdan bir OpenVPN sunucusu kurup birden fazla istemciyi yönetmenin tüm detaylarına bakacağız. Sertifika yönetiminden, kullanıcı başına konfigürasyon dosyası oluşturmaya, erişim iptalinden log takibine kadar gerçek dünya senaryolarıyla ilerleyeceğiz.
Ortam ve Ön Gereksinimler
Anlatacağım senaryo şu şekilde: Bir şirketin 15 uzak çalışanı var, bazıları Windows kullanıyor, bazıları Linux. Bunların yanında 3 farklı departman var ve her departman farklı iç ağ segmentlerine erişebilmeli. Sunucu tarafında Ubuntu 22.04 LTS kullanıyoruz.
Başlamadan önce sisteminizin güncel olduğundan emin olun:
sudo apt update && sudo apt upgrade -y
sudo apt install openvpn easy-rsa -y
IP yönlendirmeyi aktif etmeyi unutma. Bunu kalıcı hale getirmek için:
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
PKI Altyapısını Kurma
OpenVPN’in çok istemcili yapısının temeli sertifika tabanlı kimlik doğrulamaya dayanıyor. Her istemci kendine özel bir sertifika alıyor, bu da hem güvenliği artırıyor hem de bireysel iptal imkanı sunuyor.
Easy-RSA dizinini hazırlayalım:
mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa
vars dosyasını düzenliyoruz. Bu dosya sertifika oluştururken kullanılacak varsayılan değerleri içeriyor:
cat > /etc/openvpn/easy-rsa/vars << 'EOF'
set_var EASYRSA_REQ_COUNTRY "TR"
set_var EASYRSA_REQ_PROVINCE "Istanbul"
set_var EASYRSA_REQ_CITY "Istanbul"
set_var EASYRSA_REQ_ORG "Sirketim AS"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "IT"
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_DIGEST "sha256"
EOF
EASYRSA_CERT_EXPIRE değerini 365 olarak ayarladım. Yani her kullanıcı sertifikası 1 yıl geçerli. Bu değeri organizasyonunuzun güvenlik politikasına göre değiştirebilirsiniz; ama çok kısa tutarsan sertifika yenileme işlemi seni boğar, çok uzun tutarsan güvenlik riski artar.
PKI’ı başlatıp CA sertifikasını oluşturalım:
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
./easyrsa build-ca nopass
nopass parametresi CA anahtarını parola korumasız oluşturuyor. Otomatik sertifika üretimi yapacaksanız bu gerekli, ama üretim ortamında CA anahtarını parola ile korumayı düşünmelisin.
Sunucu sertifikasını ve DH parametrelerini oluştur:
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey secret /etc/openvpn/easy-rsa/pki/ta.key
Sunucu Konfigürasyonunu Ayarlama
Temel sunucu konfigürasyonu:
cat > /etc/openvpn/server.conf << 'EOF'
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/easy-rsa/pki/ta.key 0
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
# Tum trafigi VPN uzerinden gonder
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# Istemciler arasi iletisim
client-to-client
keepalive 10 120
cipher AES-256-CBC
auth SHA256
compress lz4-v2
push "compress lz4-v2"
max-clients 50
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20
# Her istemci icin ozel konfigürasyon dizini
client-config-dir /etc/openvpn/ccd
EOF
client-config-dir direktifi bu yazının en kritik parçalarından biri. Bu dizine istemci adıyla oluşturduğun dosyalar, o istemciye bağlandığında özel ayarlar uygulamanı sağlar.
Log dizinini oluşturalım:
mkdir -p /var/log/openvpn
mkdir -p /etc/openvpn/ccd
Çok İstemcili Sertifika Yönetimi
Şimdi gerçek dünya senaryosuna geçelim. 15 kullanıcı için sertifika oluşturmayı manuel yapmak yerine bir script yazalım. Bu script hem sertifika üretiyor hem de kullanıcıya göndermek için hazır .ovpn dosyası hazırlıyor:
#!/bin/bash
# create_client.sh
EASYRSA_DIR="/etc/openvpn/easy-rsa"
OUTPUT_DIR="/etc/openvpn/clients"
SERVER_IP="203.0.113.10" # Sunucu public IP
SERVER_PORT="1194"
CLIENT_NAME=$1
if [ -z "$CLIENT_NAME" ]; then
echo "Kullanim: $0 <istemci_adi>"
exit 1
fi
mkdir -p "$OUTPUT_DIR/$CLIENT_NAME"
# Sertifika olustur
cd "$EASYRSA_DIR"
./easyrsa gen-req "$CLIENT_NAME" nopass
./easyrsa sign-req client "$CLIENT_NAME"
# .ovpn dosyasi olustur
cat > "$OUTPUT_DIR/$CLIENT_NAME/$CLIENT_NAME.ovpn" << OVPN
client
dev tun
proto udp
remote $SERVER_IP $SERVER_PORT
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
auth SHA256
compress lz4-v2
verb 3
key-direction 1
<ca>
$(cat "$EASYRSA_DIR/pki/ca.crt")
</ca>
<cert>
$(openssl x509 -in "$EASYRSA_DIR/pki/issued/$CLIENT_NAME.crt")
</cert>
<key>
$(cat "$EASYRSA_DIR/pki/private/$CLIENT_NAME.key")
</key>
<tls-auth>
$(cat "$EASYRSA_DIR/pki/ta.key")
</tls-auth>
OVPN
echo "Istemci $CLIENT_NAME olusturuldu: $OUTPUT_DIR/$CLIENT_NAME/$CLIENT_NAME.ovpn"
Bu scripti çalıştırılabilir yapıp kullanmaya başlayabilirsin:
chmod +x /usr/local/bin/create_client.sh
create_client.sh ahmet_yilmaz
create_client.sh fatma_demir
create_client.sh it_departman1
Departman Bazlı Ağ Erişim Kontrolü
En ilgi çekici kısma geldik. Diyelim ki şirketin 3 departmanı var:
- IT departmanı: Her şeye erişebilir (10.0.0.0/8)
- Muhasebe: Sadece muhasebe sunucularına erişebilir (192.168.10.0/24)
- Satış ekibi: CRM sunucusuna ve internet trafiğine yönlendirilir (192.168.20.0/24)
Her istemci için ccd dizininde ayrı konfigürasyon dosyası oluşturuyoruz:
# IT departmanı kullanıcısı için
cat > /etc/openvpn/ccd/ahmet_yilmaz << 'EOF'
# IT yonetici - tam erisim
push "route 10.0.0.0 255.0.0.0"
push "route 192.168.0.0 255.255.0.0"
ifconfig-push 10.8.0.10 255.255.255.0
EOF
# Muhasebe kullanicisi icin
cat > /etc/openvpn/ccd/fatma_demir << 'EOF'
# Muhasebe - sadece muhasebe sunuculari
push "route 192.168.10.0 255.255.255.0"
ifconfig-push 10.8.0.20 255.255.255.0
EOF
# Satis ekibi icin
cat > /etc/openvpn/ccd/satis_ali << 'EOF'
# Satis - CRM erisimi
push "route 192.168.20.0 255.255.255.0"
ifconfig-push 10.8.0.30 255.255.255.0
EOF
ifconfig-push direktifi ile her kullanıcıya sabit IP atayabiliyoruz. Bu özellikle firewall kuralları yazarken hayat kurtarıyor. Muhasebe kullanıcısının her bağlandığında aynı IP’yi almasını sağlıyorsun ve firewall’da 10.8.0.20 -> 192.168.10.0/24 kuralı daima geçerli kalıyor.
Firewall Kuralları ile Erişim Kontrolü
iptables ile VPN üzerinden gelen trafiği kontrol edelim:
# VPN arayuzunden gelen trafige temel izinler
iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# IT departmani (10.8.0.10) - tam gecis
iptables -A FORWARD -s 10.8.0.10 -i tun0 -j ACCEPT
# Muhasebe (10.8.0.20) - sadece muhasebe sunuculari
iptables -A FORWARD -s 10.8.0.20 -d 192.168.10.0/24 -i tun0 -j ACCEPT
iptables -A FORWARD -s 10.8.0.20 -i tun0 -j DROP
# Satis (10.8.0.30) - CRM sunucusu
iptables -A FORWARD -s 10.8.0.30 -d 192.168.20.0/24 -i tun0 -j ACCEPT
iptables -A FORWARD -s 10.8.0.30 -i tun0 -j DROP
# NAT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# Kurallari kalici yap
apt install iptables-persistent -y
netfilter-persistent save
Sertifika İptali ve Kullanıcı Yönetimi
Bir çalışan işten ayrıldığında veya cihazı çalındığında ne yaparsın? Sertifika iptali tam olarak bunun için var.
cd /etc/openvpn/easy-rsa
# Sertifikayi iptal et
./easyrsa revoke fatma_demir
# CRL (Certificate Revocation List) dosyasini guncelle
./easyrsa gen-crl
# CRL dosyasini OpenVPN'e kopyala
cp pki/crl.pem /etc/openvpn/
# OpenVPN'i yeniden baslat
systemctl restart openvpn@server
Sunucu konfigürasyonuna CRL direktifini eklemeyi unutma:
echo "crl-verify /etc/openvpn/crl.pem" >> /etc/openvpn/server.conf
Bu noktada kritik bir detay var: CRL dosyası süreli. Easy-RSA varsayılan olarak 180 günlük CRL oluşturuyor. CRL süresi dolunca OpenVPN tüm bağlantıları reddedebilir. Bunu önlemek için bir cron job ekliyoruz:
# Her 30 gunde bir CRL yenile
crontab -e
# Asagidaki satiri ekle:
0 2 1 * * cd /etc/openvpn/easy-rsa && ./easyrsa gen-crl && cp pki/crl.pem /etc/openvpn/ && systemctl reload openvpn@server
Aktif Bağlantıları İzleme ve Yönetim
Kimin bağlı olduğunu görmek için management interface açalım. Sunucu konfigürasyonuna ekle:
echo "management localhost 7505" >> /etc/openvpn/server.conf
systemctl restart openvpn@server
Şimdi bağlantıları görebilirsin:
# Aktif baglantilari listele
echo "status" | nc localhost 7505
# Belirli bir istemciyi kes
echo "kill fatma_demir" | nc localhost 7505
# Daha detayli izleme icin
echo "status 2" | nc localhost 7505
Bunu biraz daha kullanışlı hale getiren bir script:
#!/bin/bash
# vpn_status.sh - Aktif VPN baglantılarini goster
STATUS_LOG="/var/log/openvpn/openvpn-status.log"
echo "=== Aktif VPN Baglantilari ==="
echo ""
if [ ! -f "$STATUS_LOG" ]; then
echo "Status log bulunamadi: $STATUS_LOG"
exit 1
fi
echo "Bagli Istemciler:"
grep "^CLIENT_LIST" "$STATUS_LOG" | while IFS=',' read -r header name real_ip vpn_ip bytes_recv bytes_sent connected_since; do
echo " Kullanici : $name"
echo " Gercek IP : $real_ip"
echo " VPN IP : $vpn_ip"
echo " Bagli Since: $connected_since"
echo " Alinan/Gonderilen: ${bytes_recv} / ${bytes_sent} bytes"
echo " ---"
done
echo ""
TOTAL=$(grep -c "^CLIENT_LIST" "$STATUS_LOG" 2>/dev/null || echo "0")
echo "Toplam aktif baglanti: $TOTAL"
Sertifika Süresi Takibi
15 kullanıcının sertifika son tarihlerini takip etmek can sıkıcı olabilir. Bu scriptle tüm sertifikaları tarayıp süreleri dolmak üzere olanları görebilirsin:
#!/bin/bash
# check_certs.sh - Surecen dolmak uzere olan sertifikalari kontrol et
CERT_DIR="/etc/openvpn/easy-rsa/pki/issued"
WARN_DAYS=30
echo "=== Sertifika Durum Raporu ==="
echo "Uyari esigi: $WARN_DAYS gun"
echo ""
for cert in "$CERT_DIR"/*.crt; do
CLIENT_NAME=$(basename "$cert" .crt)
# Sunucu sertifikasini atla
if [ "$CLIENT_NAME" = "server" ]; then
continue
fi
EXPIRY=$(openssl x509 -enddate -noout -in "$cert" | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))
if [ "$DAYS_LEFT" -lt 0 ]; then
echo "[SURESI DOLMUS] $CLIENT_NAME - $DAYS_LEFT gun once doldu"
elif [ "$DAYS_LEFT" -lt "$WARN_DAYS" ]; then
echo "[UYARI] $CLIENT_NAME - $DAYS_LEFT gun kaldi ($EXPIRY)"
else
echo "[OK] $CLIENT_NAME - $DAYS_LEFT gun kaldi"
fi
done
Bu scripti günlük cron ile çalıştırıp çıktısını e-posta ile almak, sertifika yönetimini çok daha kolay hale getirir.
İki Faktörlü Kimlik Doğrulama Eklemek
Sertifika yetmez diyenler için Google Authenticator ile OTP ekleyebilirsin:
apt install libpam-google-authenticator -y
Sunucu konfigürasyonuna ekle:
# /etc/openvpn/server.conf dosyasina ekle
plugin /usr/lib/x86_64-linux-gnu/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
/etc/pam.d/openvpn dosyasını oluştur:
cat > /etc/pam.d/openvpn << 'EOF'
auth required pam_google_authenticator.so
EOF
Her kullanıcı kendi hesabında google-authenticator komutunu çalıştırarak QR kodu taramalı. İstemci konfigürasyonuna da auth-user-pass direktifini eklemeyi unutma.
Sık Karşılaşılan Sorunlar
Bağlantı kuruluyor ama iç ağa erişilemiyor: Büyük ihtimalle IP forwarding aktif değil veya iptables kuralları eksik. sysctl net.ipv4.ip_forward ile kontrol et.
CRL hatası alıyorsun: crl-verify direktifi eklenmiş ama CRL dosyası süresi dolmuş olabilir. openssl crl -in /etc/openvpn/crl.pem -noout -nextupdate komutuyla son tarihe bak.
Kullanıcı bağlanıyor ama aynı IP’yi alamıyor: ifconfig-pool-persist ve ifconfig-push birlikte kullanılıyor olmalı. Kullanıcı adının CCD dosyasındaki isimle tam eşleştiğinden emin ol.
TLS handshake hatası: tls-auth anahtarının hem sunucu hem istemci tarafında aynı yönde (key-direction) kullanıldığından emin ol. Sunucuda 0, istemcide 1 olmalı.
Sonuç
OpenVPN’in çok istemcili yönetimi, PKI altyapısını doğru kurduğunda ve sertifika yaşam döngüsünü otomatize ettiğinde aslında oldukça yönetilebilir bir hal alıyor. Burada anlattıklarını özetlemek gerekirse:
- Her kullanıcıya özgü sertifika üretmeyi ve
.ovpndosyası hazırlamayı scriptlerle otomatize et client-config-dirile her kullanıcıya veya departmana özel ağ erişim politikası uygulaifconfig-pushile sabit IP ataması yap, bunu firewall kurallarıyla birleştir- Sertifika iptalini hiç ihmal etme, özellikle işten ayrılmalarda anında uygula
- CRL yenileme işini cron’a bırak, unutma
- Sertifika son tarihlerini düzenli takip eden bir monitoring scripti kur
Onlarca kullanıcı için bu yapıyı elle yönetmek yerine, zamanla bir iç portal veya Ansible playbook’u yazmayı düşünebilirsin. Ama başlangıç için bu anlatılanlar sağlam ve üretim ortamında kullanılabilecek bir temel oluşturuyor. Herhangi bir adımda takılırsan, /var/log/openvpn/openvpn.log dosyası genellikle en doğru cevabı veriyor.