Ви заплутані в думці про те, як протікає інформація між шарами стеку протоколів TCP / IP - зокрема між протоколами DNS та додатком рівня.
У вас є одна загальнодоступна IP-адреса. Ваш DNS, безумовно, може вирішувати як одну mail.example.com
і example.com
ту ж загальнодоступну IP-адресу.
Загалом, дейтаграми IP, що містять запити на вашу загальнодоступну IP-адресу, які будуть отримані зовнішнім інтерфейсом вашого брандмауера, не містять імені хоста, до якого намагається отримати доступ віддалений клієнт. Ваш брандмауер не може магічно "знати", яке ім'я хоста вирішено віддаленим клієнтом, оскільки обидва імена хостів вирізняються однією і тією ж IP-адресою. IP-шару не відомо про ім'я хоста, яке використовується на рівні програми.
Протоколи TCP та UDP диференціюють конкретні послуги, пропоновані хостом, використовуючи номери портів. У випадку вашого прикладу можливо використовувати функцію переадресації портів (також званий трансляцією адрес порту або PAT) для брандмауера NAT для надсилання вхідних запитів на порт 80 TCP (HTTP) на веб-сервер під час надсилання вхідного порту TCP 25 (SMTP) на ваш сервер електронної пошти.
Якщо ж ви плануєте розміщувати одну і ту ж послугу на обох машинах, тоді ця стратегія стає проблематичною. Припустимо, ви збираєтеся розмістити як захищений веб-сайт на своєму веб-сервері (для доступу клієнта), так і захищений веб-сайт на своєму сервері електронної пошти (для веб-пошти). Запити, що надходять на загальнодоступну IP-адресу вашого брандмауера до порту 443 TCP (HTTPS), можуть бути перенаправлені лише до одного або іншого сервера.
Узагальнене рішення цієї ситуації - мати більше публічних IP-адрес. Оскільки адреси IPv4 стають дефіцитними, це також може бути проблематично.
Ми закінчуємо роботу над дефіцитом публічних IP-адрес у деяких протоколах на рівні додатків. Наприклад, HTTP / 1.1 додав Host:
заголовка спеціально, щоб дозволити веб-серверу розміщувати кілька веб-сайтів на одній публічній IP-адресі. TLS додає розширення Індикація імені сервера (SNI), щоб дозволити вибір відповідного сертифіката на основі імені хоста, введеного віддаленим клієнтом.
Виконання подібного способу вирішення на рівні додатків означає, що для кожного протоколу шару додатків знадобиться власне "виправлення" (і тоді все програмне забезпечення сервера та клієнта повинно було реалізувати це "виправлення"). Це високе замовлення.
Замість зміни протоколу рівня додатків деякі протоколи легко піддаються "мультиплексування" між декількома хостами, використовуючи програмне забезпечення, яке може "маршрутизувати" запити. Це, ймовірно, виходить за рамки того, на що здатний простий Брандмауер NAT, оскільки пакети потрібно перевірити на рівні програми. Використання зворотного проксі-сервера, наприклад nginx, є хорошим прикладом такого типу "мультиплексування" (або правил веб-публікації на Forefront TMG або ISA Server в середовищі Microsoft) для протоколу HTTP. Теоретично будь-який протокол може бути мультиплексований за допомогою зворотного проксі, але чим езотеричніший протокол, тим більше шансів на те, що ви будете писати спеціальний код.
Коли вам потрібно запропонувати одну і ту ж послугу з двох різних хостів на одній загальнодоступній IP-адресі, у вас завжди є можливість перемістити одного з хостів на нестандартний порт. Це вимагатиме, щоб клієнти знали про нестандартний порт. У випадку HTTP (S) це призводить до отримання URL-адрес із http://example.com:XXX
позначенням (де XXX
номер нестандартного порту). Чи буде це проблематично у вашій ситуації - це те, що тільки ви можете вирішити. (Мій досвід показав, що практично жоден кінцевий користувач не може обробляти :XXX
позначення портів у будь-якій URL-адресі, яку вони мають ввести.)