Bir tünel üzerinden uzak /24'e ulaşmak: NETMAP, DNAT yoksa rota mı?
Tüm öneki NETMAP ile eşleyin, her ana bilgisayar için DNAT kuralları ekleyin veya gerçek aralığı yönlendirin ve karşı tarafın ne görmesi gerektiğine ve trafiği kimin başlatabileceğine göre karar verin.
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 needs | Prefix mapping | Per-host DNAT | Routed prefix |
|---|---|---|---|
| Users visible to its logs | Only without source NAT | Same condition | Yes, unchanged |
| To start a connection toward you | No, alias is local | No, same reason | Yes, both ends route |
| To absorb a new host | Yes, arithmetic only | No, one rule per address | Yes, it simply routes |
| To require no config change | Yes, with source NAT | Yes, same condition | No, 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 MASQUERADEYanı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 -nGirdiyi 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.