iptables port yönlendirme localhost için çalışmıyor


54

Tüm trafiği 443 numaralı bağlantı noktasından 8080 numaralı bağlantı noktasına yönlendirmek istiyorum. Bu yapılandırma iptables için kullanıyorum:

iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
         --dport 443 -j REDIRECT --to-ports 8080

Bu, tüm dış istemciler için çalışır. Ama aynı makineden 443 numaralı bağlantı noktasına erişmeye çalışıyorsam bağlantı reddedildi hatası alıyorum.

wget https://localhost

İptables kuralını yerel trafiği yönlendirmek için nasıl genişletebilirim?


Bu konu daha genel bir cevap sunmaktadır: serverfault.com/questions/380447/iptables-preroute-localhost
Jeroen

1
Temsilcisi olan biri, satır sonundan önce komuta ters eğik çizgi ekleyebilir mi?
Ciro Santilli

Yanıtlar:


68

PREROUTING geridöngü arabirimi tarafından kullanılmaz, ayrıca bir ÇIKIŞ kuralı eklemeniz gerekir:

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080

3
İlk kurala gerek yok. Yerel olarak üretilen paketler PREROUTING zincirinden geçmiyor.
Khaled

9
Dış trafiğin de yönlendirilmesini istediği için, tamamlamanın iyiliği için ilk kuralı ekledim. Kural, yalnızca tüm IP'leri kabul etmek için söylerlerse kaynağa / hedefe ihtiyaç duymaz
Andy

aaa cevap verdiğimde cevabını görmedim.
Andy

Merhaba Andy, hala server.com'a bağlanıyorum | <ip> |: 443 ... başarısız oldu: Bağlantı reddedildi.
Chris,

Merhaba Chris, bu yerel sunucuya mı bağlanıyor | 127.0.0.1 | 443 mı, etki alanı mı? İkincisi ve onu sunucunuzdan çalıştırıyorsanız, dahili bir yönlendirme sorununuz olabilir. Wget server.com: 8080'i deneyerek iki kez kontrol edebilirsiniz (port yönlendirme yaptığınızın sebebinin harici olarak engellenmiş olmasının neden olduğunu varsaysam da). Kendi VPC'mde bu sorun var, ancak / etc / hosts dosyanızda etki alanını 127.0.0.1 olarak tanımlayarak bir geçici çözüm koyabilirsiniz.
Andy

10

Paketleri localhost'tan başka bir makineye yönlendirmek için kural:

 iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT  --to-destination 10.x.y.z:port

çalışacak, ancak çekirdeğin içinde bu seçeneği de etkinleştirmeniz gerekir:

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

Bu çekirdek ayarı olmadan işe yaramaz.


Bu da işe yarayacak. Ben hepsini iptables içinde yapmak daha temiz olduğunu düşünüyorum.
quadruplebucky

Aslında, hedef başka bir makinedeyse, bir VM veya uzaktaki bir makineye hizalanmışsa çekirdek ayarı belirtilir.

öyle değil Andy yukarıda önerildiği şekilde iki kural varsa.
quadruplebucky

Üzgünüm, DNAT’ın çalışmadığı farklı bir makineye yönlendirme hakkında konuştum. Yerel makineye aynı makinedeki bir kapsayıcıya bağlandığını düşündüğü bir şeyi iletmeye çalışırken bir sorunun çözümü için bu cevaba bakıyordum. örneğin, yerel sorgular için ad sunucusunu bir kap içinde çalıştırma.

Aslında, görünüşe göre, çekirdek sürüm> = 3.6'ye bağlı.
quadruplebucky

3

Buna ne dersin?

iptables -t nat -A ÇIKIŞI -d 127.0.0.1 -p tcp --dest 443 -j REDIRECT - bağlantı noktası 8080


2

Bağlantı reddedildi hatası alıyorsunuz demiştiniz . Bu, bağlanmaya çalıştığınız bağlantı noktasını dinleyen yerel bir işlem olmadığı anlamına gelir! Dinleme işlemlerini kontrol etmek için şu komutu kullanın:

$ sudo netstat -lnp | grep 8080

Kuralı uyguladıktan sonra, bağlantı kurmak için bağlantı noktasını 8080 dinleyen bir işlem olmalıdır.

Bunun yerine aşağıdaki kurala sahip olmanız gerekiyor gibi görünüyor:

$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
                                       --dport 443 -j REDIRECT --to-ports 8080

Yerelden gönderdiğinizi unutmayın. Bu yüzden çıktı paketini yönlendirmeniz gerekiyor.


1
Cevabınız için teşekkürler. İşlem 8080 numaralı bağlantı noktasını dinliyor. Bunun için tüm trafiği bu bağlantı noktasına yönlendirmek istiyorum.
Chris,

İşlemin döngü arabiriminde de dinlediğinden emin misiniz? Sadece fiziksel arayüzünüzü dinliyor olabilir. Genelde, web sunucunuzun 192.168.10.0
02.05.2005
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.