iptables dış istekleri 127.0.0.1'e yönlendirir


41

127.0.0.1’de 2222 numaralı bağlantı noktasında çalışan bir servisim var. Tüm istekleri yalnızca 192.168.1.0/24 - 127.0.0.1:2222 alt ağından 192.168.2.2:2222’ye (IP dışında) iletmem gerekiyor.

Bunu kullanmaya çalışıyorum ama işe yaramıyor.

$ iptables -t nat -I PREROUTING -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0.1:2222

Bunun işe yaramasını nasıl sağlayabilirim?

UPD: Adres şemasını düzenleyin.


Biraz açıklamaya ihtiyacımız var. Trafik nereden geliyor? Trafik aslen nereye gidiyor? Trafik nereye gidiyor? Okuduğum gibi, 192.168.1.0/24 - 127.0.0.1:2222 arasındaki trafiğin 12.23.34.45:2222’ye yönlendirilmesini istiyorsunuz. Ancak Warren'ın cevabı, 192.168.1.0/24 - 12.23.34.45:2222 arasındaki trafiğin 127.0.0.1:222
Patrick

1
Trafik 192.168.1.0/24 alt ağından 192.168.2.2:2222 tarihine kadar gelir ve 127.0.0.1:2222 tarihinde hizmete çevrilmelidir. Adres şemasını düzelttim.
SimWhite

1
Trafiğin 2222geridöngü arabiriminde alt ağdan portlanmasına izin veren bir kural mı istiyorsunuz 192.168.1.0/24? Bu sadece tek bir kural kurulum şekli değildir. Buraya bakın: debuntu.org/…
slm

Evet. Anladığım kadarıyla masq kuralı eklemem gerekiyor mu? IP iletme elbette zaten etkin.
SimWhite

Neden "gerçek" bir IP ile yayınlamıyor ve istenmeyen kaynaklardan gelen trafiği filtrelemiyorsunuz? Güvenlik duvarları aslında bunun için ...
vonbrand

Yanıtlar:


60

Kullandığınız iptables kuralı işe yarayacak, ancak yapmanız gereken ek bir değişiklik daha var:

sysctl -w net.ipv4.conf.eth0.route_localnet=1

( eth0nic ile değiştirilir 192.168.2.2)

Varsayılan olarak, bu değer 0çekirdeğe, hedeflenen harici trafiği yönlendirmemesi talimatını verir 127.0.0.0/8. Bu, sadece trafik için normal olmadığı için güvenlik içindir.


Ek not: Geçerli iptables kuralınız çok geniş. Kuralınız -d 192.168.1.0/24 --dport 2222, hedef eşleşmesi olarak belirlenir , yani makineniz 2222 numaralı bağlantı noktasındaki (örneğin, giden trafik) başka bir ana bilgisayarla konuşmaya çalışırsa, yönlendirileceği anlamına gelir. Ya -dmaçı değiştirmeli -d 192.168.2.2ya da eklemelisin -i eth0(ya da senin nişanı ne olursa olsun).


8
Bu bilgiyi bulmak şaşırtıcı derecede zordur.
Wren T.

Evet, çok değerli bilgi bulmak zor! Teşekkür ederim! Ama bende yok route_localnet. Bunun için başka isimler var mı? (linux 2.6.30 cinsinden) ls /proc/sys/net/ipv4/conf/lan/: accept_redirects arp_accept arp_filter arp_notify disable_policy force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm yönlendirme mc_forwarding promote_secondaries rp_filter send_redirects etiketi
IMZ - Ivan Zakharyaschev

Gördüğüm gibi , yamanınroute_localnet çekirdeğime göre daha yeni (7 Haziran 2012) (2.6.30-std-def-alt15 # 1 SMP Pzt 14 Aralık 08:45:48 UTC 2009). Tamam, sadece netcat( nc) gibi bir yönlendirme işlemiyle (dışardan içeriye) istenen bağlantı noktası iletme işlemine xinetdveya sshikincisi için bağlantı noktası yönlendirme seçeneklerine erişeceğim. çünkü, bu olasılık var işte).
imz - Ivan Zakharyaschev

2
2 sysctl -w net.ipv4.conf.all.route_localnet=1
sentim

Diğerleri gibi, bu bilgi gelmek zordu. Teşekkürler, bunu daha önce bulsaydım, bir ton çaba harcadım.
Stephen Simpson

3

Localhost'a yönlendirebilirsiniz ancak geridönüşe geçemezsiniz (127.0.0.0/8). Geri döngü bir kaçamaktır. Gerçek arayüzlerden birine yönlendirmen gerekiyor. REDIRECT kullanmayı deneyin.

iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222


Bu muhtemelen sysctl voodo olmadan en iyi cevaptır ...
Lester Cheung

222 numaralı bağlantı noktası yalnızca localhost'ta dinleniyorsa hala yardımcı olmuyor (kural hedef adresini değiştirmeyecek)
sanmai

Bu durumda, 0-j DNAT --to-destination w.x.y.z:222
58'de

2

Ya doğru cevap route_localnetişe yaramazsa? ..

Eğer çekirdeğiniz için düzeltme ekiroute_localnet yoksa , ... çekirdeği yükseltin!

Veya harici arabirimde dinleyen ve trafiği ileten bir işlemi çalıştırarak bir arabirime gelen trafiği başka bir arabirimdeki başka bir bağlantı noktasına (özellikle de yerel ana bilgisayara) iletmenin başka yolları da vardır.

netcat( nc), xinetdve ssh(ve belki de daha fazlası) bunu yapabilen programların örnekleridir (seçim sshtuhaf ve etkisiz olur).

Bunun için bir konfigürasyon yazdım xinetd. Şimdi bu servis otomatik olarak açılır:

# cat /etc/xinetd.d/z-from-outside 
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
    disable         = no
    socket_type     = stream
    type        = UNLISTED
    wait            = no
    user            = nobody
    bind        = vaio.ob
    port        = 7070
    redirect    = localhost 7070
}
# 

( vaio.obharici ağ arayüzündeki bu ana bilgisayarın adıdır.)

Bir sonra service xinetd reload, dinleyip dinlemediğini kontrol edelim:

# lsof -i -P | fgrep 7070
xinetd    556      root    6u  IPv4 1797906      0t0  TCP vaio.ob:7070 (LISTEN)
sshd    27438 tun_zzoom    4u  IPv4 1059100      0t0  TCP localhost.localdomain:7070 (LISTEN)
# 

Ve gerçekten, bağlantılar geçiyor!

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.