Port aynı ağda bir ipten diğer ipe yönlendirme nasıl yapılır?


77

Bazı yapmak istiyorum NATiçinde iptables. Böylece, tüm paketlerin geliyor 192.168.12.87ve liman 80iletilir 192.168.12.77port 80.

Bunu iptables ile nasıl yapabilirim?

Veya

Aynısını elde etmenin başka yolları var mı?


@Matthewlfe, Bazı sebeplerden dolayı, tüm apache talebini (192.168.12.87) 'den (192.168.12.77)' ye iletmem gerekiyor.
doymuş

1
@Matthewlfe, iki tane üretim sunucum var. Bir kamu statik ip adresi ile bağlanır. Bazı bağlantı sorunları nedeniyle, DB ve diğer sistemlerden bağlanamıyorum 192.168.12.87. Bu yüzden, tüm isteği iletmem gerekiyor 192.168.12.77.
oturdu

@lain, aşina değilim iptables. Ve bazı örnekler gördüm. Ancak, iki ethernet gerektiriyor gibi görünüyor. Bağlantı: revsys.com/writings/quicktips/nat.html
sat

192.168.12.87'den 192.168.12.77'ye 192.168.12.77'ye istek göndermek için web sunucunuzda proxy modunu da kullanabilirsiniz (web sunucunuz destekliyorsa)
krisFR

Yanıtlar:


75

Bu kurallar iptables, sunucuda çalıştığını varsayarak çalışmalıdır 192.168.12.87:

#!/bin/sh

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -t nat -F
iptables -X

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87

80 numaralı bağlantı noktasında gelen trafiği DNAT'a aktarmanız gerekir, ancak trafiği yeniden SNAT'a yerleştirmeniz de gerekir.


Alternatif (ve en iyi yaklaşım IMHO):

Web Sunucunuzun ne olduğuna bağlı olarak (Apache, NGinx) ön uç sunucunuzda bir HTTP Proxy düşünmelisiniz (192.168.12.87):


Ufw devre dışı bırakıldığı sürece, bağlantı noktası ufw'ye izin vermesine rağmen çalışır, ancak ufw etkinse, bu iletme öğeleri işe yaramaz mı?
Sudhir N

1
Harika bir cevap, harika bir cevap. Bunun faydası için başka bir kullanım durumu, bir müşteriye gelen tüm trafiği geçici olarak yeniden yönlendirmeniz, kalamar, başka bir ip / bağlantı noktasına yönlendirmeniz gerekirse, tüm müşterileri yeniden yapılandırmaya gerek kalmadan orijinal hizmette bazı bakımlar yapmak! Çok kullanışlı!
PF4Public

3
"ama aynı zamanda trafiği tekrar SNAT etmeniz gerekecek." -> Günümü kurtardın. Teşekkür ederim
obayhan

Bu çözüm benim için çalışmıyor. Eth0'dan KVM konuğu tarafından kullanılan sanal bir ağa (virb0) iletmem gerekiyor. -İ ve -o seçeneklerini eklemeye çalıştım ama -o ön yönlendirme için izin verilmedi. Baska öneri?
lostiniceland

Bu çözüme dikkat edin. Şimdi uzaktaki makineme erişimimi tamamen kaybettim.
Sören

28

Görünüşe göre bariz bir iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77şekilde işe yaramayacağının nedeni iade paketlerinin nasıl yönlendirileceğidir.

192.168.12.87'ye gönderilen paketlerin yalnızca 192.168.12.77'ye NATlanmış olmasına izin verecek kuralları ayarlayabilirsiniz, ancak 192.168.12.77 daha sonra doğrudan müşteriye yanıtları gönderir. Bu yanıtlar iptables kuralınızın NAT yaptığı ana makineden geçmeyecektir, dolayısıyla bir yöndeki paketler çevrilmiştir, ancak diğer yöndeki paketler değildir.

Bu sorunu çözmek için üç yaklaşım var.

  1. İlk ana bilgisayarda sadece DNAT değil, aynı zamanda geri dönüş trafiğinin ilk ana bilgisayardan geri gönderileceği şekilde SNAT da yapar. Kural gibi bir şey olabiliriptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
  2. DSR yük dengelemesinden ilham alın ve paketleri IP katmanı yerine Ethernet katmanında DNAT yapın. Paketlerin hedef MAC'larını 192.168.12.77 MAC'iyle değiştirip IP katmanına dokunmadan Ethernet'e göndererek, 192.168.12.77, sahte bir arayüzde yapılandırılmış 192.168.12.87'ye sahip olabilir ve böylece TCP bağlantısını sonlandırabilir. istemciye bilinen sunucu IP'si ile.
  3. İlk konakta saf (ancak çalışmıyor) çözümünü kullanın. Ardından, geri dönüş trafiğinde bir SNAT yaparak geri dönüş paketlerini ikinci ana bilgisayar üzerinde kullanın. Bir kural gibi görünebiliriptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87

Bu üç çözümün dezavantajları vardır, bu yüzden bu özel iletmeyi gerçekten yapmanız gerekiyorsa, dikkatlice düşünmeniz gerekir.

  1. SNAT kullanımı istemci IP'sini kaybedecek, böylece 2 numaralı ana bilgisayar tüm bağlantıların 192.168.12.87'den geldiğini düşünecek. Ek olarak, diğer yaklaşımlarla daha doğrudan bir rota izleyen tüm cevap paketleri için ana bilgisayar numarası 1 üzerinden bant genişliğini kullanacaksınız.
  2. DSR yaklaşımı, iki düğüm arasındaki diğer tüm iletişimi koparır. DSR yaklaşımı gerçekten, yalnızca sunucu adresi ana bilgisayarların hiçbirinin birincil IP'si olmadığında uygundur. Her ana bilgisayarın, DSR IP'si olmayan bir birincil IP'ye sahip olması gerekir.
  3. Bir yöne çevirmek için bir ana bilgisayar üzerinde bağlantı izlemeyi kullanmak ve diğer yöne çevirmek için başka bir ana bilgisayardan bağlantı izlemeyi kullanmak çirkindir ve kırılmasının çeşitli yolları vardır. Örneğin, port numaraları NAT tarafından her iki ana bilgisayarda da değiştirilirse, bunları yeniden yapılandırmanın bir yolu yoktur. Ayrıca, ilk gördüğü paket bir ACK yerine bir SYN-ACK ise, bağlantı izlemenin düzgün çalışacağı da verilmez.

Üç yaklaşımdan ilki işe yaraması muhtemel olan ilk yaklaşım olduğunu düşünüyorum. Dolayısıyla, istemcinin IP adreslerini bilmeniz gerekmiyorsa, tavsiye edeceğim adres budur.

Ayrıca NAT'ı tamamen unutmayı seçebilir ve sorunu MAC veya IP katmanında çözmeye çalışabilirsiniz. HTTP katmanına kadar gidebilir ve orada bir çözüm arayabilirsiniz. Bu durumda bulacağınız çözüm bir HTTP proxy'sidir. 192.168.12.87'ye bir HTTP proxy yükler ve uygun şekilde yapılandırırsanız, istekleri 192.168.12.77'ye iletmesini ve yanıtları geri iletmesini sağlayabilirsiniz. Ek olarak, orijinal istemci IP'sini koruyan bir X-Forwarded-For başlığı da ekleyebilir. 192.168.12.77'deki sunucunun, 192.168.12.87'den X-Forwarded-For başlığına güvenecek şekilde yapılandırılması gerekir.


Şaşırdım -j MASQUERADEburada belirtilmez; DNAT ile olağan yaklaşım değil mi?
19

3
@Remram SNATyerine bahsetmiştim MASQUERADE, çünkü belgelerin dediği şey bu. Belgelerdeki tam ifadeler:It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
kasperd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.