Linux iptables ssh bağlantı noktası yönlendirme (Mars reddi)


12

Ev ağım için NAT performans gösteren bir Linux ağ geçidim var. Paketleri şeffaf olarak iletmek istediğim başka bir ağım var, ancak yalnızca belirli IP / bağlantı noktalarına / bağlantı noktalarından (yani VPN değil). Aşağıda çalışmak için bazı örnek IP ve bağlantı noktaları bulunmaktadır:

Source          Router          Remote Gateway     Remote Target
192.168.1.10 -> 192.168.1.1 ->  1.2.3.4        ->  192.168.50.50:5000

Kaynak makinesinin Uzak Hedef üzerindeki belirli portlarla doğrudan Yönlendiriciden yönlendirilebilirmiş gibi konuşabilmesini istiyorum. Yönlendiricide, eth0 özel ağ ve eth1 internete dönüktür. Uzak Ağ Geçidi, içine ssh edebileceğim başka bir Linux makinesidir ve doğrudan Uzak Hedef'e yönlendirilebilir.

Basit bir çözüm denemem Router'da ssh port yönlendirme kurmaktır, örneğin:

ssh -L 5000:192.168.50.50:5000 1.2.3.4

Bu, şimdi yerel olarak bağlantı noktası 5000'e bağlanabilen Yönlendirici için iyi çalışıyor. Bu nedenle, "telnet localhost 5000" beklendiği gibi 192.168.50.50:5000'e bağlanacak.

Şimdi, trafiği Kaynak ve dönüşüm hunisinden kurulan ssh tüneli üzerinden yönlendirmek istiyorum. Bunun için bir NAT kuralı denedim:

iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000

ve Yönlendirici zaten benim NAT ağ geçidim olduğundan, gerekli postrouting kuralına zaten sahip:

-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

Bu sitedeki veya başka yerlerdeki çoğu Soru-Cevap, her ikisi de başka bir yerde iyi çalıştığım sunucu bağlantı noktaları veya saç tokası NAT ile uğraşıyor gibi görünüyor, ikisi de bu durum için geçerli değil. Kesinlikle DMZ'yi Uzak Hedef portlarını Uzak Ağ Geçidi üzerinden iletebilirim, ancak portların internete erişmesini istemiyorum, sadece güvenli SSH tünelinden erişilebilir olmasını istiyorum.

Bulabildiğim en iyi cevap, Linux çekirdeğindeki Mars paket reddi ile ilgilidir:

iptables, bağlantı noktası geri döngüden yönlendirmek nasıl?

Marslıların günlüğe kaydedilmesini sağladım ve çekirdeğin bu paketleri martians olarak reddettiğini doğruladım. Bunlar dışında: Bu paketlerin ne için olduğunu, nereden geldiklerini ve nereye gittiklerini biliyorum (ssh tünelim).

Orada sunulan "dolambaçlı" çözüm bu orijinal soru için geçerlidir, ancak benim durumum için geçerli değildir.

Ancak, bu soruyu yazarken / araştırırken, SSH kaynak IP bağlamasını kullanarak sorunum etrafında çalıştım:

ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000

Geridöngü kullanmadığım için bu, Mars'ın reddi ile başa çıkıyor.

Soruyu hala iki nedenden dolayı burada gönderiyorum:

  1. Umarım gelecekte benzer bir şey yapmaya çalışan biri bunu aramalarında bulabilir ve bu geçici çözüm onlara yardımcı olabilir.
  2. Hala ssh port ileri bağlantı sadece loopback bağlı tutmak ve iptables yoluyla onlara yönlendirmek için fikir tercih. Bu paketlerin tam olarak ne olduğunu ve nereye gittiğini bildiğim için, onları Linux martian filtrelemenin reddetmemesi için işaretlemem için bir yol olmamalı mı? Bu konuda yaptığım tüm aramalar, testlerimde hiç yardımcı olmayan rp_filter'a yol açıyor. Ve işe yarasa bile, izin vermeye çalıştığım tam paketlere özgü değil.

Soruma katkıda bulunmakla ilgileniyorum ve sadece ölü uçlarla gelmek için yaptığım arama saatlerini başka birini kurtarmak için genel aramaya geçici çözüm bulmakla ilgileniyorum ve umarım birisinin hala açık kalan sorumun geri dönüş / martian bölümüne cevap vermesini istiyorum bana göre.


UL vs SF'deki Meta yazısının daha fazla okunması üzerine, Michael'ın crosspost olmamasını da talep ediyorum. Ben sadece çapraz noktaya özellikle SF de konu dışı olarak işaretlenmiş, bu yüzden sadece orijinal soruyu taşımak ve bu soruyu kapatmak daha uygun ve mümkün, çünkü bu çok iyi olurdu.
Mark

/etc/sysctl.conf dosyasına net.ipv4.conf.default.rp_filter = 0 ve net.ipv4.conf.all.rp_filter = 0 koymak ve "sudo sysctl -p" yapmak sorununuzu çözüyor mu?
Rui F Ribeiro

Her ikisini de doğrudan uygulamaya çalıştım, yani. 'sysctl net.ipv4.conf.default.rp_filter = 0', ayrıca özel arayüzüm için bir tane dahil. Ben 'sysctl -a' ile ayarlandığını doğruladım, ancak 127.0.0.1'e kadar olan martian paketleri hala reddediliyor. Ve bu işe yarasa bile, tüm arayüzlerimi martians'a açmak istediğim şey değil. Ben de tek (albiet private) bir arayüz açmak istemiyorum. Tam olarak hangi Mars paketlerine izin vermek istediğimi biliyorum ve bunu gerçekleştirmeme izin vermek için bir iptables NAT / mangle ifadesi istiyor / umuyorum.
Mark

Net.ipv4.conf.default.rp_filter = 2 ve diğer bazı iptables kurallarını isteyebilirsiniz
Rui F Ribeiro

Yanıtlar:


1

127.0.0.1:5000'e DNAT yapmayla ilgili sorun, uzak taraf yanıt verdiğinde, bu paketlerin yerel olarak (127.0.0.1'den) kaynaklanmış gibi yönlendirme motoruna geri dönmeleri, ancak bir dış hedef adreslerinin olmasıdır. Dış arabirimle eşleşen SNAT / MASQUERADE onları yakalayıp yeniden yazdı, ancak paketlerin bu arabirime ulaşması için alınması gereken yönlendirme kararları önce gelir ve varsayılan olarak sahte olan bu paketlere izin vermezler. Yönlendirme motoru, daha sonra yeniden yazmayı hatırlayacağınızı garanti edemez.

Bunun yerine yapabilmeniz gereken şey, 192.168.1.1:5000'e iptables INPUT adresinde, 192.168.1.10 kaynağından !bağımsız olarak -skaynak adres belirtiminden önce gelen argümanı kullanarak yapılan herhangi bir dış bağlantıyı reddetmektir . Reddetme mekanizması olarak TCP sıfırlaması -j REJECT --reject-with tcp-resetkullanırsanız (varsayılan ICMP hedefine erişilemez), bu adresi hiç bir şeyin dinlemediği durumla büyük ölçüde aynı olacaktır: dış dünya söz konusu olduğunda bağlantı noktası birleşimi.


0

Router'dan RemoteGateway'e bir tünel oluşturmak için openVPN'i kullanırdım.

Sonra Router'da bir rota eklerdim:

route add -host RemoteTarget gw RemoteGateway-VPNadresi

Kaynak'ın erişmesine izin verdiğiniz bağlantı noktalarını sınırlamak istediğiniz her yerde basit iptables kuralını kullanın.

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.