GNU/Linux >> Belajar Linux >  >> Linux

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

Solusi 1:

Aturan ini harus bekerja, dengan asumsi bahwa iptables sedang berjalan 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 traffic masuk pada port 80, tetapi Anda juga harus melakukan SNAT traffic kembali.

Alternatif (dan IMHO pendekatan terbaik):

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

  • mod_proxy (Apache)

  • proxy_pass (NGinx)

Solusi 2:

Alasannya 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 yang dikembalikan akan dialihkan.

Anda dapat mengatur aturan yang akan menyebabkan paket yang dikirim ke 192.168.12.87 menjadi NAT ke 192.168.12.77, tetapi 192.168.12.77 kemudian akan mengirim balasan langsung kembali ke klien. Balasan tersebut tidak akan melalui host tempat aturan iptables Anda melakukan NAT, oleh karena itu paket dalam satu arah diterjemahkan, tetapi paket ke arah lain tidak.

Ada tiga pendekatan untuk memecahkan masalah ini.

  1. Pada host pertama jangan hanya melakukan DNAT, tetapi juga lakukan SNAT sehingga trafik balik 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
  2. Ambil inspirasi dari penyeimbangan muatan DSR dan DNAT paket pada lapisan Ethernet, 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 memiliki 192.168.12.87 yang 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 tangani paket yang kembali pada host kedua dengan melakukan SNAT pada lalu lintas yang kembali. Sebuah aturan dapat 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 kekurangan, jadi Anda perlu mempertimbangkan dengan hati-hati, jika Anda benar-benar perlu melakukan penerusan khusus ini.

  1. Menggunakan SNAT akan kehilangan IP klien, jadi host nomor 2 akan menganggap semua koneksi berasal dari 192.168.12.87. Selain itu, Anda akan menggunakan lebar pita melalui nomor host 1 untuk semua paket balasan, yang akan mengambil rute yang lebih langsung dengan pendekatan lain.
  2. Pendekatan DSR akan memutus semua komunikasi lain antara dua node. Pendekatan DSR benar-benar hanya sesuai bila alamat server bukan IP utama dari salah satu host. Setiap host harus memiliki IP primer, yang bukan IP DSR.
  3. Menggunakan pelacakan koneksi di satu host untuk menerjemahkan ke satu arah dan pelacakan koneksi di host lain untuk menerjemahkan ke arah lain benar-benar jelek, dan ada berbagai cara yang bisa merusaknya. Misalnya jika nomor port diubah oleh NAT di salah satu host, tidak ada cara untuk merekonstruksinya. Ini juga tidak diberikan, bahwa pelacakan koneksi akan berfungsi dengan benar, jika paket pertama yang dilihatnya adalah SYN-ACK, bukan ACK.

Dari ketiga pendekatan tersebut menurut saya yang pertama adalah yang paling mungkin berhasil. Jadi, jika Anda tidak perlu mengetahui alamat IP klien, itulah yang akan saya rekomendasikan.

Anda juga dapat memilih untuk melupakan NAT sama sekali dan tidak mencoba menyelesaikan masalah pada lapisan MAC atau IP. Anda dapat membuka hingga lapisan HTTP dan mencari solusi di sana. Dalam hal ini solusi yang akan Anda temukan adalah proxy HTTP. Jika Anda menginstal proxy HTTP pada 192.168.12.87 dan mengonfigurasinya dengan tepat, Anda dapat meneruskan permintaan ke 192.168.12.77 dan meneruskan kembali jawabannya. Selain itu dapat memasukkan header X-Forwarded-For yang mempertahankan IP klien asli. Server pada 192.168.12.77 kemudian perlu dikonfigurasi untuk mempercayai header X-Forwarded-For dari 192.168.12.87.


Linux
  1. Bagaimana Anda Mencerminkan Stdout Dari Satu Terminal Ke Terminal Lainnya?

  2. Bagaimana Cara Memindahkan File Dari Satu Akun Pengguna Ke Akun Pengguna Lain Di Komputer Yang Sama?

  3. Bagaimana cara menghapus garis yang muncul pada file B dari file A lainnya?

  1. Bagaimana cara mengganti semua isi dari satu folder dengan yang lain

  2. Bagaimana cara meneruskan port dari satu mesin ke mesin lainnya?

  3. IPTables - Port ke ip &port lain (dari dalam)

  1. Cara menyalin atau mengkloning izin dari satu file ke file lain di Linux

  2. Bagaimana Cara Menyalin Pengaturan Dari Satu Mesin Ke Mesin Lainnya?

  3. Bagaimana cara mengarahkan subdomain ke port lain di server yang sama?