iptables mengalihkan permintaan luar ke 127.0.0.1

41

Saya memiliki layanan yang berjalan pada 127.0.0.1 dengan port 2222. Saya perlu meneruskan semua permintaan ke 192.168.2.2.222.22 (di luar IP) hanya dari subnet 192.168.1.0/24 ke 127.0.0.1.1222.

Saya mencoba menggunakan ini, tetapi tidak berfungsi.

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

Bagaimana saya bisa membuatnya bekerja?

UPD: Edit skema alamat.

SimWhite
sumber
Kami perlu klarifikasi. Dari mana datangnya lalu lintas? Ke mana lalu lintas awalnya pergi? Di mana lalu lintas akan pergi? Saat saya membacanya, Anda ingin lalu lintas dari 192.168.1.0/24 ke 127.0.0.1.1222 dialihkan ke 12.23.34.45 .: 2222. Tetapi jawaban Warren mengasumsikan Anda menginginkan lalu lintas dari 192.168.1.0/24 ke 12.23.34.45.222 harus diarahkan ke 127.0.0.1.122
Patrick
1
Lalu lintas berasal dari subnet 192.168.1.0/24 ke 192.168.2.2.2222 dan harus diterjemahkan ke layanan pada 127.0.0.1.1222. Saya memperbaiki skema alamat.
SimWhite
1
Anda menginginkan aturan yang memungkinkan lalu lintas ke port 2222pada antarmuka loopback dari subnet 192.168.1.0/24? Itu bukan hanya satu jenis aturan pengaturan. Lihat di sini: debuntu.org/…
slm
Iya nih. Seperti yang saya mengerti saya perlu menambahkan aturan masq? Penerusan IP sudah diaktifkan tentu saja.
SimWhite
Mengapa tidak menjalankannya pada IP "asli", dan menyaring lalu lintas yang berasal dari sumber yang tidak diinginkan? Itulah
gunanya

Jawaban:

60

Aturan iptables yang Anda gunakan akan berfungsi, tetapi ada satu perubahan tambahan yang perlu Anda lakukan:

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

(Mengganti eth0dengan nic 192.168.2.2berada di)

Secara default, nilai ini adalah 0, yang memerintahkan kernel untuk tidak merutekan lalu lintas eksternal yang dituju 127.0.0.0/8. Ini hanya untuk keamanan karena lalu lintas seperti itu tidak normal.


Catatan tambahan: aturan iptables Anda saat ini terlalu luas. Aturan Anda menentukan -d 192.168.1.0/24 --dport 2222sebagai pencocokan tujuan, yang berarti bahwa jika mesin Anda mencoba untuk berbicara dengan host lain di port 2222 (yaitu lalu lintas keluar), itu akan diarahkan juga. Anda harus mengubah -dpertandingan -d 192.168.2.2, atau menambahkan -i eth0(atau apa pun nic Anda).

Patrick
sumber
8
Info ini sangat sulit ditemukan.
Gelatik T.
Ya, informasi yang sangat sulit ditemukan! Terima kasih! Tapi saya tidak punya route_localnet. Apakah ada nama lain untuk itu? (di linux 2.6.30) 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 forwarding mc_forwarding promote_secondaries rp_filter send_redirects tag
imz - Ivan Zakharyaschev
Saya tahu, tambalan untukroute_localnet lebih baru (7 Juni 2012) dari kernel saya (2.6.30-std-def-alt15 # 1 SMP Sen 14 Des 08:45:48 UTC 2009). Ok, saya hanya akan mencapai port forwarding yang diinginkan (dari luar ke dalam) dengan proses forwarding seperti netcat( nc) xinetd,, atau opsi port-forwarding ssh(yang terakhir tidak efektif dan bodoh, tentu saja, tapi saya menyebutkannya, karena, yah, kemungkinan ini ada).
imz - Ivan Zakharyaschev
2
2 sen saya: Anda dapat mengaktifkan parameter ini untuk semua antarmuka dengansysctl -w net.ipv4.conf.all.route_localnet=1
Dmitriusan
Seperti orang lain, info ini sulit didapat. Terima kasih, jika saya menemukan ini sebelumnya, akan menyelamatkan saya banyak usaha.
Stephen Simpson
3

Anda dapat mengarahkan ulang ke localhost tetapi tidak ke loopback (127.0.0.0/8). Loopback adalah celah. Anda harus mengarahkan ulang ke salah satu antarmuka nyata Anda. Coba gunakan REDIRECT.

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

dresende
sumber
Ini mungkin jawaban terbaik tanpa sysctl voodo ...
Lester Cheung
Masih tidak membantu jika port 222 hanya didengarkan di localhost (aturan tidak akan mengubah alamat tujuan)
sanmai
Dalam hal ini, gunakan-j DNAT --to-destination w.x.y.z:222
dresende
2

Bagaimana jika jawaban yang benar dengan route_localnettidak berhasil? ..

Jika kernel Anda tidak menyertakan tambalanroute_localnet , maka ... tingkatkan kernel!

Atau ada cara lain untuk meneruskan lalu lintas yang datang ke satu antarmuka ke port lain pada antarmuka lain (khususnya, ke localhost) dengan menjalankan proses yang akan mendengarkan pada antarmuka eksternal dan meneruskan lalu lintas.

netcat( nc),, xinetddan ssh(dan mungkin lebih) adalah contoh program yang dapat melakukan ini (walaupun memilih sshakan aneh dan tidak efektif).

Saya telah menulis konfigurasi xinetduntuk ini. Sekarang layanan ini secara otomatis ditampilkan:

# 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.obadalah nama host ini pada antarmuka jaringan eksternal.)

Setelah a service xinetd reload, mari kita periksa apakah ia mendengarkan:

# 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)
# 

Dan memang, koneksi memang lewat!

imz - Ivan Zakharyaschev
sumber