Bagaimana cara melakukan port forwarding dari satu ip ke ip lain di jaringan yang sama?

77

Saya ingin melakukan beberapa NATdi iptables. Sehingga, semua paket yang datang 192.168.12.87dan port 80akan diteruskan ke 192.168.12.77port 80.

Bagaimana melakukan ini dengan iptables?

Atau

Adakah cara lain untuk mencapai hal yang sama?

duduk
sumber
@ Matthewlfe, Untuk beberapa alasan, saya perlu meneruskan semua permintaan apache dari (192.168.12.87) ke (192.168.12.77).
sat
1
@ Matthewlfe, saya punya dua server produksi. Satu terhubung dengan alamat ip statis publik. Karena beberapa masalah konektivitas, saya tidak dapat terhubung ke DB dan sistem lain dari 192.168.12.87. Jadi, saya perlu meneruskan semua permintaan 192.168.12.77.
sat
@lain, saya tidak kenal iptables. Dan, saya melihat beberapa contoh. Tapi, sepertinya membutuhkan dua ethernet. Tautan: revsys.com/writings/quicktips/nat.html
sat
Anda juga dapat menggunakan mode proxy di konfigurasi server web Anda untuk mengirim permintaan ke 192.168.12.77 dari 192.168.12.87 (jika server web Anda mendukungnya)
krisFR

Jawaban:

75

Aturan-aturan ini harus berfungsi, dengan asumsi yang iptablesberjalan di server 192.168.12.87:

#!/bin/sh

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -t nat -F
iptables -X

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87

Anda harus DNAT lalu lintas masuk di port 80, tetapi Anda juga harus SNAT lalu lintas kembali.


Alternatif (dan IMHO pendekatan terbaik):

Bergantung pada apa Server Web Anda (Apache, NGinx), Anda harus mempertimbangkan Proxy HTTP pada server front-end Anda (192.168.12.87):

KRFFR
sumber
Bekerja selama ufw dinonaktifkan, meskipun portnya memungkinkan di ufw, tetapi jika ufw diaktifkan, barang penerusan ini tidak berfungsi, tahu?
Sudhir N
1
Pertanyaan yang bagus dengan jawaban yang bagus. Kasus penggunaan lain yang bermanfaat untuk ini adalah jika Anda perlu mengalihkan sementara semua lalu lintas yang datang ke satu layanan, katakan squid, ke ip / port lain untuk melakukan pemeliharaan pada layanan asli tanpa perlu mengkonfigurasi ulang semua klien! Sangat berguna!
PF4Public
3
"tapi kamu juga harus MENGATASI lalu lintas kembali." -> Anda menyelamatkan hari saya. Terima kasih
obayhan
Solusi ini tidak berfungsi untuk saya. Saya perlu meneruskan dari eth0 ke jaringan virtual (virb0) yang digunakan oleh tamu KVM. Saya mencoba menambahkan opsi -i dan -o tetapi -o tidak diizinkan untuk melakukan prerouting. Ada saran?
Lostiniceland
Hati-hati dengan solusi ini. Saya benar-benar kehilangan akses ke mesin jarak jauh saya sekarang.
Sören
28

Alasan yang tampaknya jelas iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77tidak akan berfungsi adalah bagaimana paket-paket kembali akan dialihkan.

Anda dapat mengatur aturan yang akan menyebabkan paket mengirim ke 192.168.12.87 menjadi hanya NATted ke 192.168.12.77, tetapi 192.168.12.77 kemudian akan mengirim balasan langsung ke klien. Balasan-balasan itu tidak akan melalui host di mana aturan iptables Anda melakukan NAT, maka paket-paket dalam satu arah diterjemahkan, tetapi paket-paket di arah lain tidak.

Ada tiga pendekatan untuk menyelesaikan masalah ini.

  1. Pada host pertama tidak hanya melakukan DNAT, tetapi juga melakukan SNAT sehingga lalu lintas kembali akan dikirim kembali melalui host pertama. Aturannya bisa terlihat sepertiiptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
  2. Ambil inspirasi dari penyeimbangan beban DSR dan DNAT paket pada lapisan Ethernet dan bukan pada lapisan IP. Dengan mengganti MAC tujuan dari paket dengan MAC 192.168.12.77 dan mengirimkannya ke Ethernet tanpa menyentuh lapisan IP, maka 192.168.12.77 dapat membuat 192.168.12.87 dikonfigurasi pada antarmuka dummy dan dengan demikian dapat mengakhiri koneksi TCP dengan IP server yang diketahui klien.
  3. Gunakan solusi naif (tetapi tidak berfungsi) pada host pertama. Kemudian menangani paket kembali pada host kedua dengan melakukan SNAT pada lalu lintas kembali. Sebuah aturan bisa terlihat sepertiiptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87

Masing-masing dari ketiga solusi tersebut memiliki kelemahan, jadi Anda perlu mempertimbangkan dengan cermat, jika Anda benar-benar perlu melakukan penerusan khusus ini.

  1. Menggunakan SNAT akan kehilangan IP klien, jadi host nomor 2 akan berpikir semua koneksi berasal dari 192.168.12.87. Selain itu Anda akan menggunakan bandwidth melalui host nomor 1 untuk semua paket balasan, yang akan mengambil rute yang lebih langsung dengan pendekatan lain.
  2. Pendekatan DSR akan memutus semua komunikasi lain antara kedua node. Pendekatan DSR benar-benar hanya tepat ketika alamat server bukan IP utama dari host mana pun. Setiap host harus memiliki IP primer, yang bukan DSR IP.
  3. Menggunakan pelacakan koneksi pada satu host untuk menerjemahkan dalam satu arah dan pelacakan koneksi pada host lain untuk menerjemahkan ke arah lain adalah sangat buruk, dan ada berbagai cara yang dapat merusaknya. Sebagai contoh jika nomor port dimodifikasi oleh NAT pada kedua host, tidak ada cara untuk merekonstruksi mereka. Ini juga tidak diberikan, bahwa pelacakan koneksi akan bekerja dengan benar, jika paket pertama yang dilihatnya adalah SYN-ACK daripada ACK.

Dari tiga pendekatan saya pikir yang pertama adalah yang paling mungkin berhasil. Jadi, jika Anda tidak perlu tahu alamat IP klien, itu yang akan saya rekomendasikan.

Anda juga dapat memilih untuk melupakan tentang NAT sama sekali dan tidak mencoba menyelesaikan masalah pada MAC atau layer IP. Anda bisa sampai ke lapisan HTTP dan mencari solusi di sana. Dalam hal ini solusinya adalah proxy HTTP. Jika Anda menginstal proksi HTTP pada 192.168.12.87 dan mengkonfigurasinya dengan tepat, Anda dapat membuatnya meneruskan permintaan ke 192.168.12.77 dan meneruskan jawaban kembali. Selain itu dapat memasukkan header X-Forwarded-For yang mempertahankan IP klien asli. Server pada 192.168.12.77 maka perlu dikonfigurasi untuk mempercayai header X-Forwarded-For dari 192.168.12.87.

kasperd
sumber
Saya terkejut -j MASQUERADEtidak disebutkan di sini; bukankah itu pendekatan biasa dengan DNAT?
remram
3
@remram saya sebutkan SNATalih-alih MASQUERADE, karena itulah yang dikatakan dokumentasi. Kata-kata yang tepat dalam dokumentasi adalah:It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
kasperd