Bir LAN aygıtını ağ geçidinin kendi tünel adreslerinden birinde sunmak için tek satır NAT yeterlidir. Bağlantı yine de başarısız olur, çünkü yanıt veren aygıt istemcinin adresine o ağ geçidi üzerinden erişilebildiğini bilmez. Paketi istemciden içeri doğru izleyin, ardından yanıtı geri dışarı doğru izleyin, ve eksik yarı ortaya çıkar.

İstemcinin bakış açısıyla başlayın

Bu örnekteki istemci VPN havuzunda, 10.62.0.0/24 içinde oturur ve 8080 bağlantı noktasında 10.62.0.1'e bağlanır. Bu adres ağ geçidinin kendisine aittir, bu yüzden paket başka bir eşe değil ağ geçidinin çekirdeğine ulaşır. Ağ geçidinin arkasında LAN 172.21.4.0/24'tür. Ağ geçidi 172.21.4.10'u tutar ve HTTP'yi gerçekten sunan aygıt 172.21.4.40'tır.

Başka bir VPN eşine ait adres, ağ geçidinin hizmet adresiyle değiştirilemez. İstemci bir eşin adresine bağlanıyorsa hiçbir ağ geçidi kuralı devrede değildir ve bu anlatının tamamı yanlış durumdur.

Hedef çevirisinin kapsamını bilerek sınırlayın

Dar sürüm bir bağlantı noktası sunar ve yalnızca hedefi yeniden yazar. Paket protokolünü ve kaynağını korur, ve anlatının geri kalanını ilginç kılan da budur.

iptables -t nat -A PREROUTING -i tun0 -s 10.62.0.0/24 -d 10.62.0.1 -p tcp --dport 8080 -j DNAT --to-destination 172.21.4.40:80

Protokol ve bağlantı noktası ölçütleri olmayan kural geniş sürümdür: istemcinin seçtiği bağlantı noktasını korur ve yalnızca adresi değiştirir. Tüm ana makine sunulacaksa bu meşrudur, tek bir hizmet amaçlandıysa yanlıştır. Kuralı geriye doğru okuyun ve arabirim adını doğrulayın. Yanlış arabirimdeki DNAT kuralı hiçbir şeyle eşleşmez, bu da eksik kural ile aynı zaman aşımını üretir ve aygıta bakarak bir saat harcatır.

Yönlendirme sınırı hemfikir olsun

Çeviri başlığı değiştirir, izin vermez. Varsayılan düşürme ilkesiyle yönlendirilen akışın kendi iznine ihtiyacı vardır ve dönüş yönünün ilkenizde muhtemelen zaten bulunan kurulu bağlantı kuralına ihtiyacı vardır.

iptables -A FORWARD -i tun0 -o lan0 -d 172.21.4.40 -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Her DNAT akışı için koşulsuz izin bu tasarımdan daha geniştir ve sonradan başkasının eklediği eşlemelere de izin verir. Hedefi ve bağlantı noktasını adlandırın, gerisini kapalı bırakın. Yönlendirme kuralındaki sayaçlar sıfırda kalırken NAT sayaçları artıyorsa paket sizin kuralınızdan önce düşürülüyordur. İkinci bir kopya eklemek yerine zincir sırasını okuyun.

Aygıt bir şekilde yanıt vermek zorundadır

Çeviriden sonra aygıt 10.62.0.0/24 içinde bir kaynak görür. Yanıtı varsayılan ağ geçidine gider, bu LAN yönlendiricisidir, VPN ağ geçidi değil, bir şey ona aksini söylemedikçe. İki düzenleme bunu düzeltir ve ikisi eşdeğer değildir. Aygıttaki veya LAN yönlendiricisindeki bir yol 10.62.0.0/24'ü 172.21.4.10'a gönderir ve istemcinin kaynağını korur. Sınırlı kaynak çevirisi ise istemciyi ağ geçidinin LAN adresinin arkasına saklar.

ip route add 10.62.0.0/24 via 172.21.4.10 dev eth1
iptables -t nat -A POSTROUTING -s 10.62.0.0/24 -d 172.21.4.40 -o lan0 -p tcp --dport 80 -j SNAT --to-source 172.21.4.10

Hizmetin neye ihtiyacı olduğuna göre seçin. İstemci başına ilke ve anlamlı günlükler yönlendirilmiş biçimi ister; yolu verilemeyen bir aygıt veya mutlaka bir LAN adresi görmesi gereken hizmet çevrilmiş biçime işaret eder. Tek bir yanıtı çalıştırmak için genel bir masquerade kuralına uzanmayın. Her istemciyi her hedeften saklar ve kaynak adreslere bağlı ilkeleri sessizce bozar.

Ağ geçidinin kendisinden test etmeyin

Ağ geçidinde 10.62.0.1'e oluşturulan istek gelen PREROUTING üzerinden değil OUTPUT zinciri üzerinden çıkar. Başarısızlığı veya başarısı istemciye bakan kural hakkında hiçbir şey söylemez, ve insanlar çalışan bir kuralın bozuk olduğu sonucuna tam böyle varır.

conntrack -L | grep 172.21.4.40
tcpdump -ni any 'port 8080 or port 80'

Gerçek bir istemci isteği çalıştırın ve ikisini de okuyun. conntrack girdisi uygulanan çeviriyi gösterir, yakalamalar isteğin LAN'a geçip geçmediğini ve tünele doğru bir yanıtın dönüp dönmediğini gösterir. Kuralları değiştirdikten sonra yeni bir bağlantı kullanın, çünkü var olan durum önceki eşlemesini korur ve eski biçimde başarısız olmaya devam eder. Ardından tüm konuşmayı doğrulayın: aygıtın adresi, yönlendirme izni ve yanıtın yolu aynı akışı tanımlar.

İlgili makaleler