GNU/Linux >> Belajar Linux >  >> Linux

Mengakses server web DNAT dari dalam LAN

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

Linux
  1. Cara Mencari Web Dari Terminal Di Linux

  2. Temukan Geolokasi Alamat IP Dari Commandline

  3. Koneksi Ssh Ditolak Dari Dalam Lan?

  1. Pengkodean ke base32 dari shell

  2. Apakah ada cara untuk mendapatkan versi BIOS dari dalam Linux?

  3. Apa gunanya opsi -o dalam perintah useradd?

  1. Menggunakan Reddit dari konsol pada tahun 2020

  2. Bagaimana Cara Membuat Indentasi Heredoc Di Dalam Heredoc Dengan Cara yang Benar?

  3. Bagaimana Mendeteksi Jika Shell Dikendalikan Dari Ssh?