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.77
tidak 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.
- Pada host pertama tidak hanya melakukan DNAT, tetapi juga melakukan SNAT sehingga lalu lintas kembali akan dikirim kembali melalui host pertama. Aturannya bisa terlihat seperti
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
- 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.
- 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 seperti
iptables -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.
- 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.
- 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.
- 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.