Bir tünel uç noktasının arkasındaki alt ağa üç yolla ulaşabilirsiniz ve bir dakikalık gerçek toplama genellikle ikisini eler. Gerçekler şunlardır: oradaki sunucular kullanıcıları ayırt etmek zorunda mı, oradan biri hiç sizin aralığınıza bağlanacak mı ve uzak uçtaki yönlendiriciyi kim düzenleyebilir. Bu üçüne cevap verin, tasarım kendini seçer. Geri kalanı uç noktayı sizin işlettiğinizi ve güvenlik duvarını düzenleyebildiğinizi varsayar.

Üç seçenek ve her birinin gerçekte neyi değiştirdiği

Önek eşleme, ana bilgisayar başına DNAT ve yönlendirilmiş bir önek hepsi paketleri aynı iki aralık arasında taşır, ancak farklı şeyleri değiştirir. Eşleme bir takma ad aralığı uydurur ve adresleri uçuş sırasında aritmetik olarak yeniden yazar. Ana bilgisayar kuralları da yeniden yazar, yalnızca her hedef elle adlandırılır. Yönlendirilmiş bir önek hiçbir şeyi yeniden yazmaz: paketler gerçek adresleri korur ve iki uç da bu adreslerin nerede yaşadığı konusunda anlaşır.

What the far side needsPrefix mappingPer-host DNATRouted prefix
Users visible to its logsOnly without source NATSame conditionYes, unchanged
To start a connection toward youNo, alias is localNo, same reasonYes, both ends route
To absorb a new hostYes, arithmetic onlyNo, one rule per addressYes, it simply routes
To require no config changeYes, with source NATYes, same conditionNo, it needs a route back

Elemeye uzak taraftan başlayın, kısıtlamaların değiştirilmesi en zor olan yer orasıdır. Oradaki bir sunucu istemci adreslerini günlüklere yazıyorsa, izin listesiyle karşılaştırıyorsa veya başka bir sisteme veriyorsa, kaynağı çevirmek onun tek tanımlayıcısını yok eder. Uzak taraf da içeri doğru bağlanmak zorundaysa çeviri tamamen devre dışıdır, çünkü orada kimse takma adın var olduğunu bilmez. Ancak uzak taraf yalnızca isteklere yanıt veriyorsa daha ucuz seçenekler güvenli hale gelir.

Önek çiftleri ve boyutlar neden eşleşmek zorunda

NETMAP, aynı uzunlukta bir önek çifti üzerinde çalışan nat tablosunun hedefidir. İçinde adres başına tablo yoktur: öneki sıyırır, ana bilgisayar bitlerini tutar ve yeni öneke yeniden bağlar, bu yüzden /24 bir /24'e eşlenir ve asla /25'e değil. Konum yönü belirler: PREROUTING'de hedef eşleşmesi paketin nereye gittiğini yeniden yazar ve POSTROUTING'de kaynak eşleşmesi nereden geldiğini yeniden yazar.

192.168.2.17'deki bir ana bilgisayar istemcilerinize 10.50.1.17 olarak görünür ve son oktet süs değildir — iki tarafta da aynı sayıdır. Yarın 192.168.2.40'a bir ana bilgisayar ekleyin, takma adı 10.50.1.40 olur, düzenlenecek kural yoktur.

İstemcilerin takma ad aralığı için kutunuza işaret eden bir rotaya hâlâ ihtiyacı vardır, takma ad zaten ulaştıkları bir alt ağın içinde değilse. Ağ geçidinin takma ad için rotaya ihtiyacı yoktur, çünkü hedef çevirisi rota aramasından önce PREROUTING'de çalışır. Yönlendirme de açık olmalıdır, yoksa çekirdek yeniden yazmadan sonra paketi düşürür. Aşağıdaki üç komut, istemcileri br0'da, takma adı 10.50.1.0/24'te ve tüneli tun0'da olan Debian tarzı bir ağ geçidindeki tüm kurulumdur.

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -i br0 -d 10.50.1.0/24 -j NETMAP --to 192.168.2.0/24
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Yanıt dönüş yolunu kendi bulmak zorunda

Hedefi yeniden yazmak yalnızca paketin nereye teslim edileceğine karar verir. Uzak sunucu yine de ulaştığı bir adrese yanıt vermek zorundadır ve bu iki şekilde düzenlenebilir. Yanıtlar kutunuza dönsün diye kaynağı çevirin ya da kaynağı bırakıp uzak tarafa istemci aralığı için bir rota verin.

Çıkışta masquerade daha kısa yoldur: POSTROUTING'de bir kural ve uzak taraf tünel adresinizi görür, böylece kendi rotasına ihtiyacı olmaz. Bedel, her kullanıcının tek bir adrese sıkışması ve kullanıcı başına günlüklerin anlamını yitirmesidir. Kaynağı bozulmadan bırakmak bu bilgiyi korur, ama o zaman uzak site istemci aralığının yanıtlarını tünelden geri göndermek zorundadır.OpenVPN sunucusunda bu, push edilen bir push "route 10.50.9.0 255.255.255.0", artı bir route 192.168.2.0 255.255.255.0 satırıdır.

Pahalı hata, her birinin yarısını yapmaktır. Trafiğin bir kısmını masquerade ederken uzak taraf başka trafik için bir dönüş rotası da taşıyorsa, yanıtlar bağlantı izleme girdisinin hiç görülmediği bir arayüze gelir. İstemci, sunucunun sunuldu olarak kaydettiği bir istek için zaman aşımı bildirir. Bir akışın iki yönü de aynı netfilter örneğinden geçmelidir: çeviren tek bir ağ geçidi, seri bağlı iki güvenlik duvarı değil.

conntrack -L -d 10.50.1.17
iptables -t nat -L PREROUTING -v -n

Girdiyi iki yönde okuyun: orijinal tuple hedefte takma adınızı tutar, yanıt tuple'ı ise gerçek adresi taşır. Yanıt tuple'ı yoksa sorun kural değil, dönüş yoludur. PREROUTING sayaçları hiç hareket etmediyse paket o hook'a hiç ulaşmamıştır.

Çakışmalar ve ilk çalışan arama

İki farklı aralık çakışabilir ve iki arıza da kötü kuraldan çok bozuk bir tünel gibi görünür. Uydurduğunuz takma ad tüm yol boyunca kullanılmamış olmalı ve gerçek uzak aralık ağınızda zaten bulunmamalıdır. Bir kopya, yanlış ana bilgisayara aralıklı trafik üretir; bu, reddedilen bir bağlantıdan teşhis edilmesi daha zordur. Bir kural eklemeden önce yönlendirme tablosuna sorun.

Ağ geçidinde, ip route get 192.168.2.17 tünel aygıtını adlandırmalıdır; yerel bir bridge uzak aralığın gölgelendiği ve hiçbir nat kuralının onu düzeltemeyeceği anlamına gelir. Ağınız zaten 192.168.2.0/24 kullanıyorsa, çakışmanın üzerine eşleme yığmak yerine uzak siteyi yeniden numaralandırın.

Gerçek bir istemciden test etmek, sonra saklamak

Takma adı gerçekten kullanacak makineden test edin, ağ geçidinden değil, çünkü yerel olarak üretilen trafik PREROUTING'den asla aynı şekilde geçmez. Takma adlı bir ana bilgisayara bağlantı açın ve sayaçlarla conntrack girdisinin birlikte belirdiğini izleyin, sonra kapatın ve girdinin gittiğini doğrulayın. Eski bir girdi yarı açık bir bağlantıya işaret eder, bu da genellikle yanıtın hiç dönmediği anlamına gelir.

curl -sv http://10.50.1.17/ -o /dev/null
ss -tn dst 10.50.1.17
conntrack -L -d 10.50.1.17

İki veya üç başarılı bağlantı aritmetiği kanıtlar, ancak kalıcılık veya sıradaki mühendis hakkında hiçbir şey söylemez. Kuralları önyükleme sürecinin okuduğu yere kaydedin, Debian ve Ubuntu'da bu iptables-save > /etc/iptables/rules.v4 netfilter-persistent etkinken demektir. Yeniden başlatmada kaybolan bir eşleme hiç yoktan kötüdür, çünkü kesinti suçlanacak yeni bir değişiklik olmadan gelir.

Kuralların yanına bir not bırakın: takma ad aralığı, gerçek aralık, çiftin nedeni ve hangi tarafın başlatabileceği. Bu not, bir tasarımı kimsenin silmeye cesaret edemediği bir kural yığınından ayırır. Sonradan gelen soruyu da çözer: uzak site bir ana bilgisayar eklediğinde ve kimsenin yapılandırmadığı bir adres zaten yanıt verdiğinde. Not uzak tarafın dönüş rotasına ihtiyacı olduğunu söylüyorsa, sonraki kişi masquerade kuralını kaldırmanın bağlantıyı koparacağını bilir. Burada belgeleme ucuz; gece üçte NAT bağımlılığını yeniden keşfetmek değil.

İlgili makaleler