Saya memiliki jaringan kecil dengan router, yang memelihara koneksi ke Internet, server dan beberapa workstation di jaringan lokal.
Server dimaksudkan untuk diakses dari Internet, dan ada beberapa entri DNAT yang diatur dalam iptables router, seperti ini:
-A PREROUTING -i ppp0 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
Paket eksternal datang ke router melalui ppp0
antarmuka, dan yang internal berasal br-lan
, yang sebenarnya termasuk sakelar dan adaptor WLAN. Masalahnya adalah, sementara akses eksternal berfungsi dengan baik, mencoba mengakses server dari dalam LAN dengan IP eksternal yang diselesaikan DNS (ditugaskan untuk ppp0
) gagal.
Satu-satunya solusi yang saya dapat ciptakan adalah menambahkan entri statis ke router /etc/hosts
menunjuk ke IP internal, tetapi karena tidak ada wildcard (dan saya memiliki setidaknya tiga domain tingkat atas yang ditugaskan untuk sistem itu, tidak menghitung puluhan subdomain), itu agak renyah dan cenderung gagal. Bisakah Anda menyarankan sesuatu yang lebih baik?
Saya hanya menemukan pertanyaan ini , yang tidak terlalu membantu.
Jika itu relevan, router menjalankan OpenWRT 10.03 Kamikaze dengan dnsmasq.
Jawaban:
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 IP publik / kombo port dari host internal lain di UCI adalah dengan mengaktifkan opsi konfigurasi di
reflection
bawah setiap target DNAT tertentu dalam file/etc/config/firewall
. Perilaku ini didokumentasikan di sini .Sebagai contoh:
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, ini tidak terjadi.sumber
Saya menghapus jawaban asli saya, karena saya tidak sepenuhnya yakin bahwa itu benar. Sejak itu saya punya waktu untuk mengatur jaringan virtual VMs untuk mensimulasikan jaringan yang dimaksud. Berikut adalah seperangkat aturan firewall yang berfungsi untuk saya (dalam
iptables-save
format, hanya untuknat
tabel):POSTROUTING
Aturan pertama adalah cara langsung berbagi koneksi internet dengan LAN. Saya meninggalkannya di sana untuk kelengkapan.The
PREROUTING
Aturan dan keduaPOSTROUTING
aturan bersama-sama membangun Nat yang tepat, sehingga koneksi ke server melalui alamat IP eksternal bisa terjadi, terlepas dari apakah koneksi berasal dari luar atau dari dalam LAN. Ketika klien pada 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 aturan POSTROUTING kedua yang juga berfungsi. Jika target diubah ke
-j SNAT --to-source 192.168.2.1
, efeknya (tidak mengherankan) sama denganMASQUERADE
: server melihat koneksi dari klien LAN lokal berasal dari alamat IP internal router. Di sisi lain, 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 alamat IP eksternal router (89.179.245.232).Akhirnya, perhatikan bahwa Anda asli
PREROUTING
/DNAT
aturan dengan-i ppp0
tidak bekerja, karena aturan tidak pernah sesuai paket yang datang dari klien LAN (karena mereka tidak memasuki router melaluippp0
interface). Akan memungkinkan untuk membuatnya bekerja dengan menambahkanPREROUTING
aturan kedua hanya untuk klien LAN internal, tetapi itu akan menjadi tidak valid (IMO) dan masih perlu merujuk secara eksplisit ke alamat IP eksternal.Sekarang, bahkan setelah meletakkan "hairpin NAT" (atau "loopback NAT", atau "refleksi NAT", atau apa pun yang orang suka menyebutnya) solusi secara rinci, saya masih percaya bahwa solusi DNS split-horizon - -dengan klien eksternal yang memutuskan untuk IP eksternal dan klien internal yang memutuskan untuk IP internal --- akan menjadi rute yang lebih baik untuk diambil. Mengapa? Karena lebih banyak orang memahami cara kerja DNS daripada memahami cara kerja NAT, dan sebagian besar membangun sistem yang baik memilih untuk menggunakan bagian yang dapat dipelihara. Pengaturan DNS lebih mungkin dipahami, dan dengan demikian dipelihara dengan benar, daripada pengaturan NAT yang misterius (IMO, tentu saja).
sumber
Solusi umum adalah mengarahkan host internal Anda di server DNS lokal yang mengembalikan alamat "internal" yang benar untuk nama host ini.
Solusi lain - dan kami menggunakan ini di mana saya bekerja pada firewall Cisco kami - adalah menulis ulang tanggapan DNS pada firewall yang sesuai dengan alamat-alamat ini. Saya tidak berpikir ada alat untuk Linux yang melakukan ini sekarang.
Anda harus dapat mengkonfigurasi perutean pada 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 dummy). Dengan konfigurasi ini, komunikasi dari satu sistem internal ke sistem internal lainnya - menggunakan alamat "eksternal" - akan melalui router.
sumber
ip rule add to 89.179.245.232 dev br-lan table 10; ip route add 89.179.245.232 via 192.168.2.10 dev br-lan table 10
dan tidak berfungsi.Apa yang Anda minta lakukan disebut
NAT Loopback
dan mengharuskan Anda menambahkan aturan SNAT sehingga paket yang berasal dari LAN Anda ke Server Anda akan kembali melalui router:sumber
-i ppp0
opsi dalam aturan saya yang dimaksud, karena itu ditangani oleh rantai lain; aturan ini akan mencegah perutean paket yang berasal dari LAN (dan jika saya mengaktifkannya, paket akan pergi dari sumber yang salah dan akan ditolak).komentar larsks tentang hosting versi internal dari namespace \ domain umumnya adalah cara saya menangani masalah ini di masa lalu. Tentu saja, Anda memerlukan server DNS secara internal untuk melakukan ini.
sumber
cname
tidak mendukung topeng, dan dengan demikian tidak berlaku bagi saya karena jumlah subdomain.Saya datang dengan solusi berikut untuk memungkinkan jaringan tamu saya terhubung ke port yang diteruskan dari jaringan saya ke jaringan LAN. Skrip ini ditempatkan di bagian "Jaringan -> Firewall -> Aturan Kustom" saya:
Untuk mendukung reboot, saya perlu menjalankan yang berikut dari baris perintah ssh di openwrt (jika tidak, saya percaya ada kondisi balapan di mana beberapa aturan ditambahkan dan kemudian dibilas selama reboot):
Refleksi NAT adalah pengaturan untuk koneksi dalam jaringan LAN untuk dirinya sendiri, tetapi tidak untuk jaringan lain jika Anda telah membuat beberapa antarmuka untuk mengisolasi lalu lintas. Saya mencoba mengonfigurasi aturan penerusan dari antarmuka web, tetapi itu mengirim semua lalu lintas ke port dari jaringan tamu ke host LAN tersebut. Di atas hanya memotong permintaan ke WAN IP, bukan semua lalu lintas jaringan.
DNS internal dapat digunakan sebagai pengganti ini, tetapi hanya jika semua port forward hanya pergi ke satu host. Jika Anda memiliki beberapa host tempat Anda meneruskan berbagai port, Anda dapat mengulangi aturan untuk port yang berbeda ke
tgthost
IP dan port yang berbeda.sumber
conntrack
modul pertandingan. Dan yang Anda butuhkan untuk menyelesaikan masalah ini adalah dengan menggunakan aturan tunggal seperti itu:iptables -t nat -A POSTROUTING --dst <lan-net> ! --src <lan-gw-ip> -m conntrack --ctstate DNAT --ctorigdst <wan-gw-ip> -j MASQUERADE