Bu, saç tokası NAT'ta kanonik bir soru olarak ortaya çıktığından, şu anda kabul edilmiş olandan daha geçerli olan bir cevabı olması gerektiğini düşündüm, (mükemmel olsa da) özellikle FreeBSD ile ilgili.
Bu soru, ağ geçidinde hedef NAT (DNAT) tanıtılarak dış kullanıcılara sunulan RFC1918 adresli IPv4 ağlarındaki sunucular tarafından sağlanan hizmetler için geçerlidir. Dahili kullanıcılar daha sonra bu servislere harici adreslerden erişmeye çalışırlar. Paketleri istemciden, hedef adresini yeniden yazan ve derhal iç ağa geri enjekte eden ağ geçidi cihazına gider. Paket , saç tokası dönüşüne benzetilerek, saç tokası NAT ismine yol açan ağ geçidinde meydana gelen bu keskin dönüşlüdür .
Sorun, ağ geçidi cihazı hedef adresi yeniden yazdığında, kaynak adresi değilken ortaya çıkar. Sunucu daha sonra dahili bir varış adresi (kendi) ve bir iç kaynak adresi (müşterinin) olan bir paket alır; doğrudan böyle bir adrese cevap verebileceğini bilir, öyle yapar. Bu cevap doğrudan olduğu için, ağ geçidi üzerinden gitmez, bu nedenle, geri dönüş paketinin kaynak adresini yeniden yazarak gelen hedef NAT'ın ilk paket üzerindeki etkisini dengeleme şansı olmaz.
Böylece müşteri harici bir IP adresine paket gönderir , ancak dahili bir IP adresinden cevap alır . İki paketin aynı konuşmanın bir parçası olduğu hakkında hiçbir fikri yok, bu yüzden konuşma gerçekleşmiyor.
Çözüm, bu tür bir hedef NAT gerektiren ve iç ağdan ağ geçidine erişen paketler için, gelen paket üzerinde genellikle kaynak ağ geçidinin adresi olacak şekilde yeniden yazarak kaynak NAT (SNAT) gerçekleştirmesidir. Sunucu daha sonra istemcinin ağ geçidi kendisi olduğunu düşünür ve doğrudan ona yanıt verir. Bu da ağ geçidine hem DNAT hem de SNAT'ın gelen paket üzerindeki etkilerini dengeleme şansını verir, hem geri dönüş paketindeki hem kaynak hem de hedef adresleri yeniden yazarak.
Müşteri harici bir sunucuyla konuştuğunu düşünüyor. Sunucu, ağ geçidi cihazıyla konuştuğunu düşünüyor. Bütün partiler mutlu. Bir şema bu noktada yardımcı olabilir:
Bazı tüketici ağ geçidi cihazları, ikinci NAT basamağının gerekli olduğu paketleri tanıyacak kadar parlaktır ve bunlar muhtemelen bir saç tokası NAT senaryosunda kullanıma hazırdır. Diğerleri değildir ve öyle olmaz ve işe yaramaları pek mümkün değildir. Sunucu Arıza için hangi tüketici sınıf cihazların konu dışı olduğu tartışması.
Düzgün ağ oluşturma cihazlarına genel olarak çalışması söylenebilir, ancak - çünkü yöneticilerini ikinci kez tahmin etme işinde olmadıkları için - bunu söylemeleri gerekir. Linux iptables
bu şekilde DNAT'ı kullanır :
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.3.11
Bu, HTTP portu için basit bir DNAT'ı açık olan bir dahili sunucuya aktaracaktır 192.168.3.11
. Ancak, saç tokası NAT'ı etkinleştirmek için birinin aşağıdaki gibi bir kurala ihtiyacı vardır:
iptables -t nat -A POSTROUTING -d 192.168.3.11 -p tcp --dport 80 -j MASQUERADE
Düzgün çalışması için bu kuralların ilgili zincirlerde doğru yerde filter
olması gerektiğine dikkat edin ve zincirdeki ayarlara bağlı olarak , NATAL trafiğinin akmasına izin vermek için ek kurallar gerekebilir. Tüm bu tartışmalar bu cevabın kapsamı dışındadır.
Ancak diğerlerinin de dediği gibi, düzgün şekilde etkinleşen saç tokası NAT, sorunu çözmenin en iyi yolu değil. En iyisi, kuruluşunuzun, dahili veya harici kullanıcılar için farklı fiziksel sunuculara sahip olarak veya DNS sunucusunu göre farklı tepki gösterecek şekilde yapılandırarak, istekte bulunan istemcinin nerede olduğuna bağlı olarak orijinal arama için farklı yanıtlar sunan split ufuk DNS'dir . talep eden müşterinin adresi.