Anda menjadi kacau dalam pemikiran Anda tentang bagaimana informasi mengalir di antara lapisan-lapisan protokol TCP / IP - antara DNS dan protokol-protokol lapisan aplikasi, khususnya.
Anda memiliki satu alamat IP publik. DNS Anda tentu saja dapat menyelesaikan keduanya mail.example.com
dan example.com
ke alamat IP publik yang sama.
Secara umum, datagram IP yang berisi permintaan ke alamat IP publik Anda, yang akan diterima oleh antarmuka eksternal firewall Anda, tidak mengandung nama host yang coba diakses oleh klien jarak jauh. Firewall Anda tidak dapat secara ajaib "mengetahui" nama host mana yang ditangani klien jarak jauh, karena kedua nama host tersebut memutuskan untuk alamat IP yang sama. Lapisan IP tidak mengetahui nama host yang digunakan pada lapisan aplikasi.
Protokol TCP dan UDP membedakan layanan khusus yang ditawarkan oleh host menggunakan nomor port. Dalam contoh Anda, dimungkinkan untuk menggunakan fitur penerusan port (juga disebut terjemahan alamat port, atau PAT) firewall NAT Anda untuk mengirim permintaan yang masuk ke port TCP 80 (HTTP) ke server web saat mengirim port TCP inbound 25 (SMTP) ke server email Anda.
Namun, jika Anda berencana untuk meng-host layanan yang sama di kedua mesin maka strategi ini menjadi bermasalah. Misalkan Anda akan meng-host situs web aman di server web Anda (untuk akses Pelanggan) dan situs web aman di server email Anda (untuk webmail). Permintaan yang datang ke alamat IP publik firewall NAT Anda ke port TCP 443 (HTTPS) hanya dapat dialihkan ke satu server atau yang lain.
Solusi umum untuk situasi ini adalah memiliki lebih banyak alamat IP publik. Karena alamat IPv4 menjadi langka yang juga bisa menjadi masalah.
Kami akhirnya mengatasi kelangkaan alamat IP publik di beberapa protokol pada lapisan aplikasi. Sebagai contoh, HTTP / 1.1 menambahkan Host:
header khusus untuk memungkinkan server web untuk meng-host beberapa situs web pada alamat IP publik yang sama. TLS menambahkan ekstensi Indikasi Nama Server (SNI) untuk memungkinkan pemilihan sertifikat yang sesuai berdasarkan nama host yang dimasukkan oleh klien jarak jauh.
Melakukan solusi semacam ini di lapisan aplikasi berarti bahwa setiap protokol lapisan aplikasi akan membutuhkan "perbaikan" sendiri (dan kemudian semua perangkat lunak server dan klien harus menerapkan "perbaikan" itu). Itu perintah yang sulit.
Sebagai pengganti dari memodifikasi lapisan aplikasi protokol beberapa protokol dengan mudah menerima menjadi "multiplexed" antara beberapa host menggunakan perangkat lunak yang dapat "merutekan" permintaan. Kemungkinan ini melampaui apa yang mampu dilakukan firewall NAT sederhana karena paket-paket perlu diperiksa pada lapisan aplikasi. Menggunakan reverse-proxy seperti nginx adalah contoh yang baik dari jenis "multiplexing" ini (atau aturan penerbitan Web tentang Forefront TMG atau ISA Server di lingkungan Microsoft) untuk protokol HTTP. Secara teori, protokol apa pun bisa multiplexing melalui proxy terbalik tetapi protokol yang lebih esoterik semakin besar kemungkinan Anda akan berbicara tentang memiliki kode kustom yang ditulis.
Ketika Anda perlu menawarkan layanan yang sama dari dua host berbeda pada satu alamat IP publik, Anda selalu memiliki opsi untuk memindahkan salah satu host ke port non-standar. Ini akan mengharuskan klien untuk mengetahui port non-standar. Dalam hal HTTP (S) ini menghasilkan URL dengan http://example.com:XXX
notasi (di mana XXX
nomor port non-standar). Apakah ini akan bermasalah dalam situasi Anda adalah sesuatu yang hanya Anda yang dapat memutuskan. (Pengalaman saya menunjukkan bahwa hampir tidak ada pengguna akhir yang mampu menangani :XXX
notasi port di URL apa pun yang harus mereka masukkan sendiri.)