İçeriğe geç
NetDevOps
8 dk okuma Ağ Yönetimi

VyOS OpenVPN Site-to-Site VPN Tunnel Kurulumu

İki ofis arasında IPsec kurmak bazen gereksiz yük. IKE fazları, lifetime değerleri, transform set uyumu derken basit bir noktadan noktaya bağlantı için fazla çerçeve var. VyOS üzerinde OpenVPN site-to-site modu bu işi tek bir vtun arayüzü ile çözüyor, üstelik çift NAT arkasında çalışabildiği için IPsec'in takıldığı senaryolarda da yoluna devam ediyor.

Donanım router'ları IPsec'i tercih eder çünkü kriptografi ASIC üzerinde çalışır ve CPU'yü yormaz. VyOS bir yazılım router olduğu için bu kısıtlama çok yok. OpenVPN kullanıcı modunda çalışır, IPsec kernelde çalıştığı için OpenVPN daha yavaş kalır — fakat tek bir TCP ya da UDP bağlantısı olduğundan paket kaynak adreslerine bağlı değildir. Port değişimi, NAT arkası, mobil uygulama, hepsinde çalışır. Split tunnel esnekliği de cabası.

VyOS CLI'ında dikkat edilmesi gereken ilk nokta: OpenVPN set vpn altında değil, set interfaces openvpn altında tanımlanır. Bu kaç kez gözden kaçırılır, dokümantasyonda bile özellikle belirtiliyor.

Sertifika tarafı

VyOS 1.4 ile site-to-site modu iki şekilde çalışır: pre-shared key ve x.509 sertifika. Pre-shared key modu deprecated, gelecek sürümlerde kaldırılacak. TLS'den belirgin şekilde daha az güvenli olduğu açıkça yazılıyor. Yeni kurulumda sertifika yolu seçilir.

Tam bir PKI kurmak site-to-site amacıyla gereksiz. VyOS 1.4 ve sonrasında self-signed sertifikalar SHA-256 parmak izi ile doğrulanabiliyor, CA kurmadan da iki taraf birbirini doğrulayabiliyor. Her iki routerda konfigürasyon modundayken şunu çalıştır:

vyos@vyos# run generate pki certificate self-signed install openvpn-local
Enter private key type: [rsa, dsa, ec] (Default: rsa) ec
Enter private key bits: (Default: 256)
...
Enter certificate type: (client, server) (Default: server)
Do you want to encrypt the private key with a passphrase? [y/N]
2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply.

EC tipi tercih edilir. Anahtar bu routerda kullanılacağı için şifrelemeyin. compare ile pki alt ağacına eklenen sertifikayı gör, commit ile uygula.

Sertifikayı karşı tarafa göndermene gerek yok. Onun yerine SHA-256 parmak izini al:

vyos@vyos# run show pki certificate openvpn-local fingerprint sha256
5C:B8:09:64:8B:59:51:DC:F4:DF:2C:12:5C:B7:03:D1:68:94:D7:5B:62:C2:E1:83:79:F1:F0:68:B2:81:26:79

Aynı işlemi karşı routerda tekrarla, orada da bir sertifika üret ve parmak izini al. Sertifika isimleri keyfi — openvpn-local, openvpn-remote gibi kullanılıyor ama istediğini koyabilirsin.

Tünel tanımı

Örnek senaryo: lokal tarafın public IPsi 198.51.100.10, karşı taraf 203.0.113.11. Tünel içinde 10.255.1.1 ve 10.255.1.2 kullanılacak. Lokal LAN 10.0.0.0/16, karşı LAN 10.1.0.0/16. Port 1194 istemci VPN'e ayrılıyor, site-to-site için 1195 tercih ediliyor. Karşı taraf dinamik IP ise remote-host satırını atlanır, tarifede tls role zaten bağlantıyı kuracağı yönü belirler.

Lokal router:

set interfaces openvpn vtun1 mode site-to-site
set interfaces openvpn vtun1 protocol udp
set interfaces openvpn vtun1 persistent-tunnel
set interfaces openvpn vtun1 remote-host '203.0.113.11'
set interfaces openvpn vtun1 local-port '1195'
set interfaces openvpn vtun1 remote-port '1195'
set interfaces openvpn vtun1 local-address '10.255.1.1'
set interfaces openvpn vtun1 remote-address '10.255.1.2'
set interfaces openvpn vtun1 tls certificate 'openvpn-local'
set interfaces openvpn vtun1 tls peer-fingerprint <karşı router parmak izi>
set interfaces openvpn vtun1 tls role active

Karşı router:

set interfaces openvpn vtun1 mode site-to-site
set interfaces openvpn vtun1 protocol udp
set interfaces openvpn vtun1 persistent-tunnel
set interfaces openvpn vtun1 remote-host '198.51.100.10'
set interfaces openvpn vtun1 local-port '1195'
set interfaces openvpn vtun1 remote-port '1195'
set interfaces openvpn vtun1 local-address '10.255.1.2'
set interfaces openvpn vtun1 remote-address '10.255.1.1'
set interfaces openvpn vtun1 tls certificate 'openvpn-remote'
set interfaces openvpn vtun1 tls peer-fingerprint <lokal router parmak izi>
set interfaces openvpn vtun1 tls role passive

persistent-tunnel önemli. Bu direktif olmadan vtun arayüzü sadece OpenVPN süreci ayakta olduğu sürece var olur; firewall politikaları buna bağlı kalır. Kalıcı tanımlayınca tünel arayüzü normal bir ethernet arayüzü gibi davranır, input/output/forward yönünde politika uygulanabilir.

tls role bir tarafı active diğerini passive yapıyor. Active olan taraf TLS görüşmesini başlatır, passive olan gelen bağlantıları bekler. Bu site-to-site modunda tercih edilen yöntem. Karşı tarafın IPsi bilinmiyorsa remote-host satırını kaldır, active taraf yine bağlantı kurar — passive tarafta sadece port dinlenir.

Güvenlik duvarı açıklaması

WAN arayüzünden gelen OpenVPN trafiği firewall'dan geçmeli. 1.4 sürümünde yapılandırma şu şekilde:

set firewall name OUTSIDE_LOCAL rule 10 action accept
set firewall name OUTSIDE_LOCAL rule 10 description 'Allow established/related'
set firewall name OUTSIDE_LOCAL rule 10 state established enable
set firewall name OUTSIDE_LOCAL rule 10 state related enable
set firewall name OUTSIDE_LOCAL rule 20 action accept
set firewall name OUTSIDE_LOCAL rule 20 description 'OpenVPN_IN'
set firewall name OUTSIDE_LOCAL rule 20 destination port 1195
set firewall name OUTSIDE_LOCAL rule 20 log enable
set firewall name OUTSIDE_LOCAL rule 20 protocol udp

1.5 sürümünde firewall yapısı nftables tabanlı yeni sözdizimine geçti:

set firewall ipv4 name OUTSIDE_LOCAL rule 10 action 'accept'
set firewall ipv4 name OUTSIDE_LOCAL rule 10 description 'Allow established/related'
set firewall ipv4 name OUTSIDE_LOCAL rule 10 state 'established'
set firewall ipv4 name OUTSIDE_LOCAL rule 10 state 'related'
set firewall ipv4 name OUTSIDE_LOCAL rule 20 action 'accept'
set firewall ipv4 name OUTSIDE_LOCAL rule 20 description 'OpenVPN_IN'
set firewall ipv4 name OUTSIDE_LOCAL rule 20 destination port '1195'
set firewall ipv4 name OUTSIDE_LOCAL rule 20 log
set firewall ipv4 name OUTSIDE_LOCAL rule 20 protocol 'udp'

set firewall ipv4 input filter rule 10 action 'jump'
set firewall ipv4 input filter rule 10 inbound-interface name eth0
set firewall ipv4 input filter rule 10 jump-target OUTSIDE_LOCAL

Established/related kuralı olmadan yanıt trafiği düşer. UDP üzerinden çalışıyor, ICMP hata mesajları ve NAT senaryolarda bu kural kritik.

Routing

Tünel ayakta ama hâlâ hiçbir şey akmıyor. Static route eklemek şart:

set protocols static route 10.1.0.0/16 interface vtun1

Karşı tarafta tersini yaz:

set protocols static route 10.0.0.0/16 interface vtun1

Bu noktada show openvpn site-to-site ile duruma bakılır. Çıktı şu formatta gelir:

vyos@vyos:~$ show openvpn site-to-site

OpenVPN status on vtun1

Client CN    Remote Host        Tunnel IP    Local Host    TX bytes    RX bytes    Connected Since
-----------  -----------------  -----------  ------------  ----------  ----------  -----------------
N/A          10.110.12.54:1195  N/A          N/A           504.0 B     656.0 B     N/A

Bağlantı kurulduktan sonra tunnel IP'lerini ping ile test et: ping 10.255.1.2. Sonra LAN'dan LAN'a geç: ping 10.1.0.1.

NAT ve tuzakları

İki taraf da PAT yapıyorsa LAN'dan LAN'a giden trafiğin NAT dışı bırakılması gerekir. Aksi halde masquerade kuralı tünel trafiğini de çevirir ve karşı taraf yanlış kaynak IP görür:

set nat source rule 10 description 'exclude_lan_from_nat'
set nat source rule 10 destination address '10.1.0.0/16'
set nat source rule 10 exclude
set nat source rule 10 outbound-interface 'eth0'

set nat source rule 20 description 'masquerade'
set nat source rule 20 outbound-interface 'eth0'
set nat source rule 20 source address '10.0.0.0/24'
set nat source rule 20 translation address 'masquerade'

Karşı tarafta da aynı şekilde ters yönde yapılır. Rule numaraları öncelik sırasını belirler — exclude kuralı masquerade'den önce gelmek zorunda.

Pre-shared key modu

VyOS 1.3 ya da daha eski bir sürümle bağlantı kurman gerekiyorsa pre-shared key hâlâ kullanılabilir, ama yeni kurulumda bu mod seçilmez. Anahtar üretimi:

vyos@local# run generate pki openvpn shared-secret install s2s
2 value(s) installed. Use "compare" to see the pending changes, and "commit" to apply.

Karşı routerda anahtarı elle tanımla:

vyos@remote# set pki openvpn shared-secret s2s key <üretilen anahtar stringi>

Arabirimde kullan:

set interfaces openvpn vtun1 shared-secret-key s2s

Brezular'ın blogundaki laboratuvar kurulumu bu yöntemi kullanıyor, ek olarak hash sha512 ve encryption aes256 ile sağlamlaştırıyor. Bunlar NCP devre dışı ya da OpenVPN 2.4 öncesi sürümlerde geçerli. İki tarafın şifreleme ayarları birebir aynı olmalı, aksi halde tünel ayağa kalkmaz.

Performans ve DCO

OpenVPN IPsec'e göre yavaş kalır. Bunun sebebi sadece protokol katmanı değil, user-space ile kernel arasında sürekli geçiş yapması. OpenVPN Data Channel Offload (DCO) bu sorunu çözmek için gelişti, paket işleminin çoğunu kernelde tutuyor.

VyOS 1.4 sürümünde DCO tünel bazında açılır:

set interfaces openvpn vtun1 offload dco

Varsayılan olarak kapalı. Mevcut tünel üzerinde açınca arayüz resetlenir. Dokümantasyonun tavsiyesi DCO'lu yeni bir tünel kurmak, var olanı riske atmamak. DCO henüz tüm OpenVPN özellikleriyle uyumlu değil, deneysel kabul ediliyor; kısıtlamaları OpenVPN wiki'de listeleniyor.

Birden çok site-to-site tünel kurulacaksa OpenVPN bunları birbirinden ayırt edebilmeli. Ya her tünelde farklı public IP kullanılır ya da farklı port. Aynı IP üzerinden 1195, 1196, 1197 diye ilerlemek sık kullanılan yöntem.

Kriptografi tarafında dokümantasyonun default'u NCP açıkken aes256gcm, HMAC için SHA-1. SHA-1 zayıf kabul ediliyor, hash sha256 ya da sha512 ile değiştirilebilir. Tünel her iki ucta aynı algoritmaları görmeli, uyuşmazlık olduğunda açık hata mesajı gelmiyor, tünel sessizce kurulamıyor.

IPsec yapılamadığında ya da firewall arkasında kaldığında OpenVPN site-to-site iyi bir alternatif. Tek port açık kalır, UDP seyahati çoğu ağda sorunsuz. Küçük ofis, lab, test ortamı, geçici bağlantı — hepsinde kurulması 15 dakika sürmez.

Laravel-NDFirewall

Laravel için geliştirilmiş; panelsiz, route tabanlı ve hafif bir WAF (Web Application Firewall) kütüphanesidir. RCE, SQLi, XSS ve SSRF saldırılarını tespit eder; girdileri asla çalıştırmaz ve olası ha…

PHP

ctCertWatch

SSL sertifika yayınlarını gerçek zamanlı takip eden bir izleme servisi. Regex filtreleme, DNS çözümleme ve webhook uyarıları ile phishing domainlerini, marka taklidini ve yetkisiz sertifikaları anında…

Rust

ipReconary

IP aralıkları, alt ağlar ve ASN bilgilerine dayalı olarak host, domain ve servis keşfi yapan bir ağ keşif (recon) aracı. Güvenlik uzmanları ve OSINT araştırmacıları için ağ altyapısını hızlı ve güveni…

Rust

Wireguard-Server-Panel

Web arayüzüne sahip, kendi sunucunuzda barındırılan bir WireGuard VPN servisi. İstemci yönetimi, mobil bağlantı için QR kod desteği, gerçek zamanlı trafik istatistikleri ve bağlantı kayıtları sunar. T…

LoadAlertTracker

Sistem yükünü neredeyse hiç kaynak tüketmeden izleyen, hafif bir servis. Belirlenen eşikler aşıldığında Telegram, Discord ve Mattermost gibi platformlara gerçek zamanlı uyarı gönderir.

Rust

Trustsslroot

Tek komutla eksiksiz bir özel PKI yapısı (Kök CA → Ara CA → sunucu ve istemci sertifikaları) oluşturan araç. Farklı formatlarda (p12/bks/jks) paketler üretir ve kullanıma hazır çıktı klasörleri sunar.

Go

DDNS-FW

Değişken IP adresini DDNS üzerinden gerçek zamanlı takip eden, hafif ve güvenilir bir araç. İzin verilen IP listelerini otomatik güncelleyerek kesintisiz erişim ve güvenlik sağlar. Tek dosyadan çalışı…

Rust

Cloudfiltred

Sunucu üzerinde 80/443 portlarına erişimi yalnızca Cloudflare IP aralıklarıyla sınırlandıran, tek dosyadan çalışan bir Linux servisi. Kendini kurar, sistem servisi olarak çalışır ve IP listelerini düz…

Rust

node_exporter

Linux için geliştirilmiş, hafif ve tek dosyadan çalışan, güvenli erişim kontrollü bir sistem metrikleri servisi.

Rust