OpenVPN client-connect kancası: adresiniz aslında nereye gidiyor
client-connect betiği bir adresi yazdırarak döndüremez. Kancanın geçici dosyasının, çıkış durumunun ve topolojinin istemci IP'sini nasıl belirlediğini görün.
Bir client-connect betiğinden adres döndürmek, istemcinin IP'sini ayarlaması gerekiyormuş gibi görünür. Ama ayarlamaz: kancanın sunucuya giden tek kanalı, yolu betiğin son argümanı olarak gelen geçici bir dosyadır ve adres oraya ifconfig-push sözdizimiyle yazılmalıdır. Adresi yazdıran ya da hiçbir şey yazmadan sıfırla çıkan bir betik, havuzdan alınmış adrese sahip bağlı bir istemci üretir ve sunucu günlüğü tamamen sağlıklı görünür.
Karışıklık makul, çünkü birkaç başka kanca gerçekten çıkış kodları veya ortam değişkenleri üzerinden yanıt verir. Bunun kendi sözleşmesi var ve sözleşme bir dosya adıyla başlar.
Kanca bir dosya yazar, dönüş değeri değil
Bildirim iki satırdır: çağrıya izin vermek için script-security 2, ardından client-connect /etc/openvpn/server/assign-address.sh. Bir istemci kimlik doğruladığında sunucu bu betiği, üretilen dosya yolunu son argüman olarak ekleyerek çalıştırır; bu yol yalnızca bildirim kendi ek argümanlarını geçmiyorsa $1 olur. O istemciye uygulanan her şey o dosyaya, yapılandırmada görüneceği gibi satır başına birer sıradan direktif olarak yazılır. Kendi parametrelerini ekleyen bir sarmalayıcı konumu kaydırır ve klasik belirti --verbose gibi görünen bir yola yazan betiktir.
Çıkış durumu sözleşmenin diğer yarısıdır. Sıfır, kabul et ve dosyayı oku anlamına gelir; başka her şey bağlantıyı reddeder ve eşlenmemiş bir kimlik, sessizce havuza dönmek yerine böyle reddedilir. Başarı döndürmeden önce tam direktifi yazın, böylece yarım yazılmış bir dosya asla bir istemcinin yapılandırması olmaz.
İki direktif dikkati hak eder çünkü diğer her şeyle etkileşirler. ifconfig-push adresi sabitler, gönderilen route ise istemciye tünel üzerinden nelerin erişilebilir olduğunu söyler; birincisini döndürüp ikincisini unutursanız adresi olan ama gidecek yeri olmayan bir istemci elde edersiniz. Dosya içindeki sıra önemli değildir, eksiksizlik önemlidir. Hiçbir eşin ulaşamayacağı bir önek için rota gönderen kanca, diğer uçtan görülen aynı hatadır.
Girdiler ortam değişkenleriyle gelir: common_name, trusted_ip, ifconfig_pool_remote_ip ve geri kalanı. Hepsine sunucu dışından gelen dizeler olarak davranın, asla kabuk parçası olarak değil.
Adres eşleme bir politikadır, aritmetik değil
Cazip bir kısayol, sertifika adını ayrıştırıp rakamlarını son oktet olarak kullanmaktır. Bu bir ayırıcı değildir ve olağan şekillerde başarısız olur: aynı son eke sahip iki ad çakışır, 300 ile biten bir ad adres değildir ve bir yöneticinin yeniden adlandırdığı sertifika bir cihazı sessizce taşır. Her çağrıda alt ağ üyeliğini, kullanılabilir ana bilgisayar aralığını, ayrılmış adresleri ve benzersizliği doğrulayın ve eşlemeyi bir insanın okuyabileceği bir tabloda tutun.
Adı kim kontrol ediyorsa adresi de kontrol eder, bu yüzden bu dağıtımda common_name'in gerçekte neyi temsil ettiğine karar verin. username-as-common-name etkinse kimlik, sertifika öznesi değil oturum açma adıdır. Bu değeri asla kabuk değerlendirmesine geçirmeyin ve istemcinin bir dosya yolunu etkilemesine asla izin vermeyin.
Kayıt temelli bir ayırıcı eşzamanlılığa dayanmalıdır. Adresi atomik olarak ayırın, başarısız bir yazmayı yarım yapılandırılmış bir istemciyi kabul etmeden ele alın ve her ayırmayı ona sahip olan bağlantıyla etiketleyin, böylece daha eski bir oturumun geç kopması daha yenisinin zaten tuttuğu bir adresi serbest bırakamaz. Tek bir havuzu paylaşan birkaç sunucu örneği bu gereksinimi isteğe bağlı değil, daha keskin hale getirir.
Topoloji ifconfig-push'un ne anlama geldiğine karar verir
10.77.0.0/24 üzerinde topology subnet ile ifconfig-push 10.77.0.20 255.255.255.0 bir adres ve ağ maskesidir. topology net30 altında ikinci argüman maske değil, eş adresidir, bu yüzden alt ağ biçimini bir net30 sunucusuna kopyalamak size bağlanan ama trafik geçiremeyen bir istemci verir. Topolojiyi bilerek değiştirin, asla bir örnek tutarlı görünsün diye değil. Zaten net30 çalıştıran bir sunucunun eski adreslemede canlı istemcileri vardır, bu yüzden geçiş bakım penceresi olan bir göçtür, tek satırlık bir düzenleme değildir.
Statik adresler dinamik havuzun dışında ve diğer her statik atamanın dışında olmalıdır; sıradan client-config-dir dosyalarının dağıttıkları dahil. İki mekanizma farklı istemciler için aynı adresi üretebiliyorsa, biri sonunda bunu yapacaktır.
Ona güvenmeden önce dört durumu test edin
Aynı kontrolleri eşlenmiş kimlik, eşlenmemiş kimlik, yeniden bağlanma ve benzetilmiş kayıt hatası üzerinde çalıştırın. openvpn --config client.ovpn --verb 4 atanan adresi push yanıtında gösterir ve sunucuda grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log gerçekte ne gönderildiğini doğrular. Eşlenmemiş kimlik için beklenen sonuç havuz adresi değil, reddedilmiş bağlantıdır.
Ardından daemonun bu geçici dosyaları yazdığı dizini inceleyin. Betik düşürülmüş hizmet bağlamında çalışır, bu yüzden root'un yazabildiği ama daemonun yazamadığı bir yol her bağlantıyı günlükte birkaç satır aşağıya gömülmüş bir izin hatasıyla redde dönüştürür.
Ayırma yetkilendirme değildir: sabitlenmiş bir adres hâlâ sunucunun arkasındaki her hedefe erişim vermez. Yönlendirme ve güvenlik duvarı politikasını kendi katmanında tutun ve az önce sabitlediğiniz adrese karşı doğrulayın.