Docker bağlantı noktası yayınlama ile VPN: yanıt nereye gider
Yayınlanan bir konteyner, ters NAT öncesinde kendi adresinden yanıt verir. İki tasarım bu yanıtı genel yolda tutabilir, farklı maliyetlerle.
Tam tünelli bir VPN ayağa kalktıktan sonra ana makine SSH'a yanıt vermeye devam ederken aynı makinede Docker ile yayınlanan bir hizmet sessizleşir. Dinleyicide bir sorun yok: konteyner çalışıyor, bağlantı noktası eşlemesi var ve paket ulaşıyor. Konteyner sağlıklı ve istek gerçekten ona ulaşıyor. Fark, Linux rotasını seçerken yanıtın nereden başladığıdır ve bu fark aşağıdaki iki tasarımdan hangisine ihtiyacınız olduğunu belirler.
Tuple'ı hedef NAT üzerinden izleyin
Ana makine 192.0.2.10 adresinde, TCP 2222'yi 172.30.240.5:22 adresindeki konteynere yayınlıyor. 198.51.100.25 adresinden gelen istek konteynere ulaşmadan önce çevrilir ve konteyner kendisi olarak yanıt verir.
WAN request: 198.51.100.25 -> 192.0.2.10:2222
after DNAT: 198.51.100.25 -> 172.30.240.5:22
container reply: 172.30.240.5:22 -> 198.51.100.25
Ana makinenin rota kararında yanıt hâlâ konteynerin kaynak adresini taşır. Ters çeviri yayınlanan tuple'ı daha sonra geri yükler, bu yüzden paket tam olarak rotanın seçildiği anda yanlış görünür.
Yalnızca ana makine için olan kural bunu neden kaçırır
WAN tablosunu yalnızca şuradan gelen paketler için seçen kural: 192.0.2.10 ana makinenin kendi daemon'larını kapsar ve bu iletilen yanıtı tamamen kaçırır. Yanıttaki kaynak adres 172.30.240.5, ana makine değil.
Aşırı düzeltme, konteynerden her şeyi WAN üzerinden yönlendirmektir; bu, konteynerin ilgisiz giden bağlantılarını da VPN'den muaf tutar. Bu, istenenden farklı bir politikadır ve genellikle birini sonradan şaşırtır.
DNAT sonrası eşleştirme başka bir hook'tur
Docker'ın güvenlik duvarı belgeleri şunu belirtir: olağan kullanıcı filtrelemesi DNAT sonrası hedefi görür, bu nedenle normal bir kuralda yayınlanan 2222 numaralı bağlantı noktasını eşleştirmek, konteynerin 22 numaralı bağlantı noktasını eşleştirmekle aynı değildir. Özgün tuple önemliyse, hangi bağlantı noktasının göründüğünü tahmin etmek yerine desteklenen özgün hedef mekanizmasını kullanın.
Bu hook karışıklığı doğru görünen ve asla eşleşmeyen kurallar üretir. Politikayı yeniden yazmadan önce kuralın kendi sayaçlarını kontrol edin. Hiç isabeti olmayan bir kural, paketin asla ulaşmadığı bir yerde değerlendirildiğini söyler.
Tasarım A: kararı bağlantı durumu olarak taşımak
Bir bağlantı işareti giriş kararını çeviri boyunca taşıyabilir, ancak önemli olan rota aramasından önce pakete geri yüklenmelidir. Aşamalar şunlardır:
- Docker, VPN veya başka bir politika sahibiyle çakışmayan bir işaret alanı ve kural önceliği ayırın.
- Yalnızca amaçlanan yeni WAN bağlantısını, bağlantı izlemenin kullanılabildiği DNAT öncesi bir noktada tanımlayın.
- Kararı bağlantı işaretine kaydedin, özgün isteğin kendisini WAN tablosuna zorlamadan.
- Yanıt yönünde, yönlendirmeden önce yalnızca kendi işaret bitlerinizi pakete geri yükleyin.
- VPN kuralının önce kazanamayacağı kadar erken tam bir WAN tablosu seçin.
O tablo gerçek bağlı yolları ve ağ geçidini gerektirir. Rota yokken tanımlı bir davranış da gerektirir. Tünele sessizce düşmek en kötü sonuçtur, çünkü yapılandırma hâlâ çalışıyor gibi görünür. Bunun yerine kapalı biçimde başarısız olun ve bunu günlüğe kaydedin.
Tasarım B: ana makinede sonlandırmak
Konteynerin önünde TCP proxy veya ters proxy gibi kasıtlı olarak yapılandırılmış ana makine tarafı bir ön uç, yanıtı ana makinenin adresinden kaynaklanır durumda tutar. O zaman ana makine için yazılmış kurallar beklendiği gibi davranır ve konteyner kendi özel ağında kalır.
Maliyet, kendi yapılandırması, kaynak adres işleme biçimi ve erişim denetimleri olan bir hareketli parça daha eklemektir. Genellikle desteklenen daha basit sınırdır ve yönlendirme politikası ayrılabilecek tek bir kişi tarafından sürdürülecekse çoğu zaman doğru yanıt budur.
Değişikliği doğrulayın, niyeti değil
Genel taraftan yeni yetkilendirilmiş bir bağlantı açın ve yanıtın amaçlanan arayüzden çıktığını doğrulayın. Ardından konteynerin başlattığı ilgisiz bir isteğin hâlâ VPN'i izlediğini kontrol edin.
Tek bir kuralı test etmek için makinenin bağlantı tablosunu boşaltmayın: mevcut girdiler önceki eşlemelerini korur ve boşaltma ana makinedeki diğer her şeyi bozar. Bir bağlantı noktası yayınlamak erişilebilirliği tanımlar. Yanıt yolunu tanımlamaz. Seçilen tasarımı tablo adlarıyla birlikte yazın ki bir sonraki kişi olay sırasında onu yeniden keşfetmek zorunda kalmasın.