Solusi 1:
Saya menghapus jawaban asli saya, karena saya tidak sepenuhnya yakin bahwa itu benar. Sejak itu saya punya waktu untuk menyiapkan jaringan virtual kecil VM untuk mensimulasikan jaringan yang dimaksud. Berikut adalah seperangkat aturan firewall yang bekerja untuk saya (dalam iptables-save
format, untuk nat
tabel saja):
-A PREROUTING -d 89.179.245.232/32 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
-A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.0/24 -d 192.168.2.10/32 -p tcp -m multiport --dports 22,25,80,443 -j MASQUERADE
POSTROUTING
pertama rule adalah cara langsung untuk berbagi koneksi internet dengan LAN. Saya meninggalkannya di sana untuk kelengkapan.
PREROUTING
aturan dan yang kedua POSTROUTING
aturan bersama membuat NAT yang sesuai, sehingga koneksi ke server melalui alamat IP eksternal dapat terjadi, terlepas dari apakah koneksi tersebut berasal dari luar atau dari dalam LAN. Saat klien di LAN terhubung ke server melalui alamat IP eksternal, server melihat koneksi berasal dari alamat IP internal router (192.168.2.1).
Menariknya, ternyata ada beberapa variasi dari aturan POSTROUTING kedua yang juga berfungsi. Jika target diubah menjadi -j SNAT --to-source 192.168.2.1
, efeknya (tidak mengherankan) sama dengan MASQUERADE
:server melihat koneksi dari klien LAN lokal berasal dari internal router Alamat IP. Sebaliknya, jika target diubah menjadi -j SNAT --to-source 89.179.245.232
, maka NAT masih berfungsi, tetapi kali ini server melihat koneksi dari klien LAN lokal berasal dari eksternal router Alamat IP (89.179.245.232).
Terakhir, perhatikan bahwa PREROUTING
asli Anda /DNAT
aturan dengan -i ppp0
tidak berfungsi, karena aturannya tidak pernah cocok dengan paket yang datang dari klien LAN (karena paket tersebut tidak masuk ke router melalui ppp0
antarmuka). Dimungkinkan untuk membuatnya berfungsi dengan menambahkan PREROUTING
kedua aturan hanya untuk klien LAN internal, tetapi itu akan menjadi janggal (IMO) dan masih perlu merujuk secara eksplisit ke alamat IP eksternal.
Sekarang, bahkan setelah meletakkan solusi "jepit rambut NAT" (atau "NAT loopback", atau "refleksi NAT", atau apa pun yang orang lebih suka menyebutnya) secara mendetail, saya masih percaya bahwa solusi DNS split-horizon-- -dengan klien eksternal menyelesaikan ke IP eksternal dan klien internal menyelesaikan ke IP internal --- akan menjadi rute yang lebih disarankan untuk diambil. Mengapa? Karena lebih banyak orang yang memahami cara kerja DNS daripada memahami cara kerja NAT, dan sebagian besar dari membangun sistem yang baik adalah memilih untuk menggunakan bagian yang dapat dipelihara. Penyiapan DNS lebih mungkin dipahami, dan dengan demikian dipelihara dengan benar, daripada penyiapan NAT rahasia (IMO, tentu saja).
Solusi 2:
Saya terkejut bahwa setelah hampir 8 tahun, tidak ada yang menjelaskan bagaimana melakukan ini dengan cara yang benar menggunakan sistem konfigurasi UCI yang digunakan secara default di OpenWRT.
Jawaban Steven Monday benar, namun menggunakan iptables
perintah secara langsung, yang merupakan lapisan lebih rendah dari sistem konfigurasi UCI, dan sebaiknya tidak disentuh oleh sebagian besar pengguna OpenWRT jika memungkinkan.
Cara yang benar untuk mengakses server internal melalui kombo IP/port publik mereka dari host internal lain di UCI adalah dengan mengaktifkan opsi konfigurasi reflection
di bawah setiap target DNAT spesifik dalam file /etc/config/firewall
. Perilaku ini didokumentasikan di sini.
Misalnya:
config redirect
option target 'DNAT'
option src 'wan'
option dest 'lan'
option proto 'tcp'
option src_dport '44322'
option dest_ip '192.168.5.22'
option dest_port '443'
option name 'apache HTTPS server'
option reflection '1'
Catatan:Menurut dokumentasi OpenWRT yang ditunjukkan, reflection
diaktifkan secara default. Dalam pengujian saya, bukan itu masalahnya.
Solusi 3:
Solusi umum adalah mengarahkan host internal Anda ke server DNS lokal yang mengembalikan alamat "internal" yang benar untuk nama host tersebut.
Solusi lain -- dan kami menggunakan ini saat saya bekerja pada firewall Cisco kami -- adalah menulis ulang respons DNS pada firewall yang sesuai dengan alamat ini. Saya rasa tidak ada alat untuk Linux yang melakukan ini sekarang.
Anda harus dapat mengonfigurasi perutean di gateway Anda untuk melakukan hal yang benar. Anda mungkin perlu mengonfigurasi server untuk mengetahui alamat ip yang dipetakan secara eksternal (mis., dengan menetapkannya ke antarmuka tiruan). Dengan konfigurasi ini, komunikasi dari satu sistem internal ke sistem internal lainnya -- menggunakan alamat "eksternal" -- akan melalui router.
Solusi 4:
Apa yang ingin Anda lakukan disebut NAT Loopback
dan itu mengharuskan Anda menambahkan aturan SNAT sehingga paket yang berasal dari LAN Anda ke Server Anda akan kembali melalui router:
-A POSTROUTING -p tcp -s 192.168.2.0/24 -d 192.168.2.10 -m multiport --dports 22,25,80,443 -j SNAT --to-source 89.179.245.232