Bir hizmeti operatör düzeyinde NAT arkasındaki dizüstü bilgisayara koyun, o bilgisayarı VPN üzerinden bir VPS'e yönlendirin ve dışarıdan kimse ona ulaşamasın. VPS'e bir hedef NAT kuralı eklersiniz ve sessizlikten daha kötü bir şey alırsınız: bağlantılar açılır, sonra takılır. Yanıt kaybolmuştur değil, istemcinin kendi varsayılan rotasından çıkıyordur, bu da sunucunun onu hiç görmediği anlamına gelir. Bu beş kontrolü sırayla yapın ve ilk tutmayan noktada durun.

Sunucunun hiç değilse iletip iletmeyeceğini doğrulayın

Tek bir çeviri yazmadan önce bu kutuyu işaretleyin. Çekirdeğin iletmeyi reddettiği bir paket için DNAT kuralını kural ayrıştırıcı kabul eder ve ardından iletme yolu onu atar, bu da güvenlik duvarı sorunu gibi görünen bir zaman aşımı üretir.

sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1

Çalışan bir çekirdekte ayarlamak, yeniden başlatma boyunca ayarlamakla aynı şey değildir. net.ipv4.ip_forward=1 satırını /etc/sysctl.d/ altındaki bir dosyaya yazın, sysctl --system komutunu çalıştırın ve ardından dosyanın alındığına güvenmek yerine değeri geri okuyun. Kendi ağ ad alanını yöneten bir kapsayıcı, aynı değeri o ad alanının içinde de ister, yalnızca ana makinede değil.

Geri okuma hâlâ sıfırsa burada durun. Aşağıdaki hiçbir şey çalışmayacaktır.

Herhangi bir kural ona atıfta bulunmadan önce tünel adresini sabitleyin

Havuz adresleri bağlantı sırasına göre dağıtır, bu nedenle bugünün kiralaması için yazılan bir kural gelecek hafta sessizce başka bir istemciyi işaret edebilir. Adresi varış sırasına değil, sertifikanın kimliğine bağlayın.

client-config-dir /etc/openvpn/ccd
ifconfig-push 10.77.0.14 10.77.0.13

Bu çift, noktadan noktaya bir tünelin istemci ucu ve eş ucudur; sunucu sertifikanın ortak adına anahtarlanmıştır. Alt ağ topolojisinde ikinci değer bunun yerine ağ maskesi olarak okunur, bu yüzden kullanılan topolojiye uyan biçimi yazın. Ardından istemciyi yeniden bağlayın ve adresi istemcinin kendi üzerinde okuyun, çünkü sunucunun havuz görüşü istemcinin ne yapılandırdığının kanıtı değildir.

Yeniden bağlanmadan sonra adres değişirse durun. Hareketli bir hedefi izleyen NAT kuralı aralıklı olarak başarısız olur ve size hiçbir şey öğretmez.

İki yönde de çevirin

Hedef çevirisi gelen paketi istemciye gönderir. Kaynak çevirisi, istemcinin orijinal gönderen yerine sunucuya yanıt vermesini sağlayan şeydir ve insanların atladığı kural odur.

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 29443 -j DNAT --to-destination 10.77.0.14:29443
iptables -t nat -A POSTROUTING -d 10.77.0.14 -p tcp --dport 29443 -j SNAT --to-source 10.77.0.13

İkinci kural olmadan istemci kendi ISP yukarı bağlantısı üzerinden yanıt verir, bu yüzden uzak eş hiç konuşmadığı bir kaynak adresi görürken sunucuda yanıt için hiçbir izleme kaydı yoktur. Dışarıdaki gözlemci yarısı tamamlanan bir el sıkışma görür ve bu tam olarak insanları var olmayan bir güvenlik duvarı hatasını aramaya gönderen belirtidir.

İki kuralı da iptables -t nat -S ile geri okuyun ve arayüz adının genel adresi taşıyan ad olduğunu doğrulayın. Zaten nftables ile filtreleyen bir ana makinede çeviriyi, araçları karıştırmak yerine eşleşen adres ailesinin nftables NAT zincirine yazın.

Filtre tablosunun geçmesine izin verin

NAT tabloları başlıkları yeniden yazar; izin vermezler. Varsayılan DROP politikasıyla iletilen akışın kendi kabulüne, artı çoğu politikanın established,related kuralıyla zaten kapsadığı dönüş yönüne ihtiyacı vardır.

iptables -A FORWARD -i eth0 -o tun0 -p tcp --dport 29443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Herhangi bir şey eklemeden önce FORWARD zincirinin politikasını kontrol edin, çünkü erken bir DROP'un sırası kuralınızın hiç danışılıp danışılmayacağını belirler. Filtrelemesi nftables'te yaşayan bir ana makinede eşdeğer kuralı inet tablosunun forward kancasına ekleyin ve temel zincirin yalnızca yerel girişi değil, gerçekten iletilen trafiği gördüğünü doğrulayın. Yeni kuraldaki paket sayacı sıfırda kalırken NAT sayaçları artıyorsa paket kuralınızdan önce atılıyordur. Bu, zincir sırasını okuma sinyalidir, aynı kuralın ikinci kopyasını ekleme sinyali değil.

Bunu harici bir ağdan kanıtlayın

İlgisiz bir ağdan test edin. Aynı LAN'daki başka bir makineden yapılan sonda hairpin NAT desteğinden geçebilir ve uzak istemcinin kullandığı yolu hiç çalıştırmaz, bu yüzden oradaki yeşil sonuç yanlış şeyi kanıtlar.

tcpdump -ni any port 29443
conntrack -L | grep 29443

Yakalamayı sunucuda ve istemcide aynı anda çalıştırın. Sunucudaki yakalama, çevrilen paketin tünele doğru çıkıp çıkmadığını gösterir; istemcideki yakalama, isteğin gelip gelmediğini ve yanıtın nereye adreslendiğini gösterir. conntrack -L içindeki çeviri girdisi kuralın eşleştiğini kanıtlar, yokluğu ise paketin NAT zincirine hiç ulaşmadığını kanıtlar.

Port tarayıcıları zayıf kanıttır. Uygulama bağlanıp dinlemeye başlayana kadar portu kapalı bildirirler, bu yüzden gerçek hizmete gerçek bir bağlantı kullanın. Sonunda çalıştığında, maruziyeti o tek portta tutun: ilk kural tuhaf geldiği için SSH veya bir yönetim panelini iletmek, bir hizmeti yayımlamaktan çok daha büyük bir karardır.

İlgili makaleler