İki DNS adı, tek bir OpenVPN portu: gerçekte ne seçiyor
Aynı adrese işaret eden iki ana bilgisayar adı yine tek bir dinleyiciye ulaşır. Bir arka ucu yalnızca istemcinin gönderdiği bir alan seçebilir ve yerel OpenVPN hiçbirini göndermez.
İki A kaydı, tek adres, tek daemon: kullanıcı hangi adı yazarsa yazsın gelen paket aynıdır ve 1194 portuna bağlı sürecin ikisini ayırt edecek hiçbir şeyi yoktur. Bu, onarım bekleyen bir yapılandırma hatası değil; ad aramasının ifade edebileceğinin sınırıdır. İki OpenVPN örneği arasında seçim yapan her şey, istemcinin bağlantıya koyduğu ve ön ucun geri okuyabildiği bir değer olmalıdır ve standart bir OpenVPN istemcisi böyle bir değeri açıkta koymaz. Aşağıda bunun sizi nerede bıraktığı ve hangi düzenlerin trafiği gerçekten böldüğü anlatılıyor.
Çözümleyicinin döndürdüğü şeyle başlayın
İstemci vpn-a.example için sorgular ve bir adres alır; o adres ile bir port, çevirdiği her şeydir. Ad, arama sırasında yerel olarak tüketilir ve hiçbir zaman tel üzerinde bir alan olmaz, bu yüzden diğer uçtaki dinleyici hangi etiketin kullanıldığını göremez. vpn-a.example ve vpn-b.example adreslerini aynı ana bilgisayara yönlendirin; iki arama da aynı hedefi verir, bu yüzden daemon fark kaydetmeden iki bağlantıyı tek örnekte emer. Adres tabanlı profiller de aynı nedenle ad tabanlı profiller gibi davranır.
Bu aynı zamanda baştan çıkarıcı bir kaçış yolu ailesini de kapatır: ek takma adlar, tek bir sokette her ad için sertifika seçmek ya da sorgulanan ada bağlı bir güvenlik duvarı kuralı. Hiçbiri, ilk paket istemciden çıkmadan önce zaten atılmış bilgi üzerinde işlem yapamaz. İki sunucu ayrı kalacaksa, bölünme bağlantının kendisiyle birlikte yolculuk etmelidir, yani bir adres, bir port ya da protokolün tanımladığı bir yük alanı.
Sayılan tek seçici paketin içinde gider
HTTP bunu bir Host başlığıyla, TLS ise ClientHello içindeki sunucu adı uzantısıyla çözer ve böylece tek bir adres tek bir dinleyicinin arkasında birçok siteye hizmet eder. İkisi de kablodaki protokol belirli bir hizmete yönelik istek taşıdığı için çalışır. OpenVPN ile ilgili önemli gerçek, bu alanların ikisinin de araya giren kutunun incelediği katmanda bulunmamasıdır.
Standart bir düzenlemede denetim kanalını koruyan TLS el sıkışması, dış oturum kurulduktan sonra gerçekleşir ve onun içinde taşınır, bu yüzden o oturumu sonlandırmamış bir dinleyici opak bir akış görür. Hâlâ bunun OpenVPN olduğunu söyleyebilir, çünkü açılış baytlarındaki işlem kodu ve çerçeveleme tanınabilir, ancak sunucu adı varsa şifrelenmiş kısımda oturur. Sanal sunucuyu dış paketten okumayı bekleyen bir tasarım, protokolün oraya hiç yazmadığı bir alanı okuyordur. Bu, tünelin nasıl inşa edildiğinden kaynaklanır, daha zekice bir desen eşleşmesinin kapatabileceği bir boşluktan değil.
Protokol ayrıştırıcısının durduğu yer
sslh projesinin belgelendirdiği türden bir çoklayıcı tek bir portu dinler, açılış baytlarını inceler ve bağlantıyı tanıdığı protokolü konuşan arka uca devreder. Tek bir portun SSH, HTTPS ve OpenVPN'e birlikte hizmet etmesi gerektiğinde bu gerçek bir değerdir.
sslh her protokol için ayrı bir sonda tutar ve TLS sondası gerçek bir ClientHello'dan sunucu adı ya da ALPN değeri çekebilir. Yerel OpenVPN'i tanımak, bir TLS uzantısını okumaktan farklı bir sınıflandırmadır ve ikisi birleşmez, çünkü dinleyen sokete hiç ClientHello göndermeyen bir istemci sondayı okuyacak hiçbir şey olmadan bırakır. Bu yüzden OpenVPN ile eşleşen bir kural “bu bir OpenVPN istemcisi” diye yanıtlar ve öte gitmez. O kuralın arkasındaki iki OpenVPN arka ucu ayırt edilemez, ön ucun seçim için hiçbir temeli yoktur ve her oturum aynı yere iner. Çoklama, tek bir portu farklı hizmetler arasında paylaşır; tek bir hizmetin içinde sanal barındırma yapmaz.
İki sunucuyu gerçekten ayıran düzenler
En ucuz dürüst bölünme, her örnek için bir tane olmak üzere ikinci bir genel adrestir ve mevcut profiller gerekeni zaten taşır çünkü farklı adreslere işaret ederler. Sıradaki, aynı adres üzerinde farklı bir porttur ve her profildeki bir sayı dışında hiçbir maliyeti yoktur. TCP ve UDP ayrı port tabloları tutar, bu yüzden 1194/tcp ve 1194/udp ilgisiz soketlerdir ve her birinden biri aynı ana bilgisayarda bir arada bulunabilir; bu ad tabanlı yönlendirme değil taşıma ayrımıdır ve sık sık onunla karıştırılır. İki seçenek de güvenlik duvarı incelemesinden geçer, çünkü kural paketin gerçekten içerdiği bir şeyle eşleşir.
İhtiyacınız olan sınır iki uygulama arasında değil kullanıcı grupları arasında geçiyorsa, farklı istemci yapılandırmaları, kendi sertifika işleyişi ve açık bir erişim politikası olan tek bir örnek bunu kapsayabilir. Bunun satın aldığı şey sunucu içinde politika, sunucular arasında yalıtım değil ve ikisi farklı gereksinimlerdir. Uzlaşma altında dayanması gereken yalıtım hâlâ adrese ya da güvenlik duvarı kenarına ihtiyaç duyar.
OpenVPN'in önüne konan bir TLS sonlandırıcısı, yetenekli bir ön uca gerçek bir sunucu adı açığa çıkarabilir, ancak istemci tarafı da o ek katman için yapılandırıldığında. Mevcut profiller yalnızca aynı adrese yönlendirilerek bu davranışı kazanmaz.
Kurmadan önce seçiciyi kanıtlayın
Bir arka ucu tanımlayacak alanı adlandırın, sonra istemcinin onu gerçekten gönderdiğini doğrulayın; yanıt bir adresse plan ayakta kalır, dinleyiciye hiç ulaşmayan bir el sıkışmanın içindeki sunucu adıysa hiçbir DNS çalışması onu kurtarmaz. Üç komut dinleyen tarafı hızla netleştirir.
ss -lntup | grep -E ':443|:1194'
openssl s_client -connect vpn-a.example:443 -servername vpn-a.example </dev/null | head -n 20
journalctl -u openvpn-server@server-a -n 20 --no-pager
openssl satırı yalnızca o adreste bir şey TLS'i sonlandırdığında sertifika verir; yerel bir OpenVPN dinleyicisi karşısında takılır ya da başarısız olur ve bu kendi başına dış katmanın neyi açığa çıkardığının yanıtıdır. journal satırı, her arka uçta okunduğunda hangi örneğin oturumu kabul ettiğini gösterir. Ön uç günlükleri neyin sınıflandırıldığını kaydeder ve asla neyin amaçlandığını kaydetmez, bu yüzden kullanıcının nereye indiği konusunda tek yetkili arka uç olarak kalır.
Farklı sunuculara ulaşmak için tasarlanmış iki profille bitirin, bunları tek tek bağlayın ve her biri için arka uç günlüğünü not edin. Her iki oturum da aynı journal'da görünüyorsa seçici yanlış yapılandırılmış değil eksiktir ve düzeltme istemcinin hedefleyebileceği bir adres ya da porttur. Yönlendirme kuralını düzenlemek yardımcı olmaz, çünkü kurala hiçbir zaman yönlendirecek bir şey verilmemiştir. Bölünme gerçek olduğunda, sıradaki kişi ikinci bir takma ad ekleyip onun işi yapmasını beklemesin diye bunu profillerin yanına yazın.