redirect port iptables tidak berfungsi untuk localhost

55

Saya ingin mengarahkan semua lalu lintas dari port 443 ke port internal 8080. Saya menggunakan konfigurasi ini untuk iptables:

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

Ini berfungsi untuk semua klien eksternal. Tetapi jika saya mencoba mengakses port 443 dari maschine yang sama saya akan mendapatkan koneksi yang ditolak kesalahan.

wget https://localhost

Bagaimana saya bisa memperpanjang aturan iptables untuk mengarahkan lalu lintas lokal juga?

Chris
sumber
Topik ini memberikan jawaban yang lebih umum: serverfault.com/questions/380447/iptables-preroute-localhost
Jeroen
1
Bisakah seseorang dengan rep menambahkan backslash ke perintah sebelum jeda baris?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

69

PREROUTING tidak digunakan oleh antarmuka loopback, Anda juga perlu menambahkan aturan OUTPUT:

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
Andy
sumber
3
Tidak perlu aturan pertama. Paket yang dihasilkan secara lokal tidak melewati rantai PREROUTING.
Khaled
9
Saya menambahkan aturan awal demi compeletion, karena dia ingin lalu lintas eksternal untuk mengarahkan juga. Aturan tidak perlu sumber / tujuan jika mereka hanya mengatakan untuk menerima semua IP
Andy
oh maaf saya tidak melihat jawaban Anda ketika saya menjawab.
Andy
Hai Andy, saya masih terhubung ke server.com | <ip> |: 443 ... gagal: Sambungan ditolak.
Chris
Halo Chris, apakah itu Menghubungkan ke localhost | 127.0.0.1 | 443 atau apakah itu domainnya? Jika yang terakhir dan Anda menjalankannya dari server Anda, Anda mungkin memiliki masalah routing internal. Anda dapat mengecek dengan mencoba wget server.com:8080 (walaupun saya berasumsi alasan Anda meneruskan porta adalah karena diblokir secara eksternal?). VPC saya sendiri memiliki masalah itu, namun Anda mungkin dapat memberikan solusi dengan mendefinisikan domain sebagai 127.0.0.1 di file / etc / hosts Anda.
Andy
10

Untuk mengarahkan paket dari localhost ke komputer lain aturannya:

 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

akan berfungsi, TETAPI Anda juga perlu mengaktifkan opsi ini di kernel:

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

Tanpa pengaturan kernel itu tidak akan berfungsi.


sumber
Itu juga akan berhasil. Saya pikir melakukan semuanya di iptables lebih bersih.
quadruplebucky
Sebenarnya, pengaturan kernel ditentukan jika tujuan berada di komputer lain, baris VM atau mesin jarak jauh.
itu bukan jika Anda memiliki dua aturan seperti yang disarankan Andy di atas.
quadruplebucky
Maaf, saya sedang berbicara tentang kasus penerusan ke mesin yang berbeda di mana DNAT tidak bekerja. Saya melihat jawaban ini untuk solusi untuk masalah ketika saya mencoba untuk meneruskan sesuatu yang mengira itu terhubung ke localhost ke penampung pada mesin yang sama. misalnya menjalankan server nama dalam wadah untuk kueri lokal.
Sebenarnya, ini tergantung pada versi kernel> = 3.6, tampaknya.
quadruplebucky
3

Bagaimana dengan ini?

iptables -t nat -P OUTPUT -d 127.0.0.1 -p tcp --port 443 -j REDIRECT --untuk port 8080

Athanasios
sumber
2

Anda bilang Anda mendapat koneksi ditolak kesalahan. Ini berarti bahwa tidak ada proses lokal mendengarkan pada port yang Anda coba sambungkan! Untuk memeriksa proses mendengarkan, gunakan perintah:

$ sudo netstat -lnp | grep 8080

Setelah menerapkan aturan tersebut, Anda harus memiliki proses mendengarkan pada port 8080 untuk terhubung.

Tampaknya Anda harus memiliki aturan berikut sebagai gantinya:

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

Ingat bahwa Anda mengirim dari localhost. Jadi, Anda perlu mengarahkan ulang paket output.

Khaled
sumber
1
Terima kasih atas jawaban Anda. Prosesnya adalah mendengarkan pada port 8080. Oleh karena itu saya ingin mengarahkan ulang semua lalu lintas ke port itu.
Chris
Apakah Anda yakin prosesnya mendengarkan pada antarmuka loop juga? Mungkin hanya mendengarkan pada antarmuka fisik Anda. Biasanya, server web Anda perlu mendengarkan 0,0.0.0 daripada, katakanlah, 192.168.10.0
MrMajestyk