Как разместить несколько веб-сайтов за одним IP на порту 80 самостоятельно?

Вопрос или проблема

Поверьте мне, я искал, но не могу найти окончательный ответ на свой вопрос.

У меня есть домен, example.eu, и сейчас я пытаюсь настроить такие вещи, как CA/TLS, без изменения NAT с одного хоста на другой только для проверки (после установки, когда я возвращаюсь к основному серверу, это ломается).

Я хотел бы иметь следующее:

www.example.eu -> 
nc.server.example.eu (отдельная машина) 192.168.1.2 (также размещает wireguard/adguard/docker)
mattermost.server.example.eu (VM) 192.168.1.8
aapanel.server.example.eu (VM) 192.168.1.9

2/2Gbit волоконная связь с 1 IP

192.168.1.1 = edgerouter
192.168.1.2 = dns-adguard/wireguard/nextcloud
192.168.1.3 = Узел 1 Supermicro сервер ESXI8 (работает только при необходимости)
192.168.1.4 = Узел 2 Supermicro сервер ESXI8 (работает только при необходимости)
192.168.1.5 еще свободен / pfsense тест
192.168.1.6 = juniper коммутатор EX4200 48T
192.168.1.7 = тестовый NAS (будет заменен на truenas scale)

Интересно, возможно ли это? Думаю, да, но я не знаю как.

Можно ли сделать так, чтобы ‘что-то’ при входе трафика через www.example.eu направляло его на нужный сервер? Что для этого нужно? У меня есть тест с PFsense, но это для меня ново.

Я уже создал некоторые сертификаты с подстановкой, так что *.example.eu и *.*example работают на одной машине, однако я не могу разместить всё на одной машине.

У меня умеренные знания о Linux, в основном Ubuntu, и я знаю Windows.

Если кто-то может направить меня в нужное русло?

(Я видел, как кто-то спрашивал о хостах, но не могу найти, где это опубликовано?)

Это смешанные Apache и Nginx
Aapanel работает на Nginx (возможно, я могу перенести это на apache также).
Nextcloud работает на Apache (отдельная машина, если это важно)

Вы имеете в виду это?
https://httpd.apache.org/docs/2.4/vhosts/ip-based.html

Можно ли сделать так, чтобы ‘что-то’ при входе трафика через www.example.eu направляло его на нужный сервер?

На уровне IP (или даже TCP) трафик не поступает через www.example.eu – в заголовках пакетов IP и TCP нет информации о используемом имени, поэтому вы не можете сделать это только с маршрутизацией или NAT. Все, что у вас есть, это IP:порт, а именно “внешний” (публичный) IP:порт.

По той же причине, виртуальные хосты на основе IP не смогут различать различные запросы, как и сам маршрутизатор, если не используются различные номера портов (которые должны быть указаны в URL, и это несколько сводит на нет цель нескольких доменов).

Вам нужно, чтобы весь трафик поступал на что-то, что понимает конкретные протоколы, используемые в этом соединении TCP/IP, и может извлекать запрошенное имя хоста из них (предполагая, что протоколы сами по себе несут его где-то сначала). Это часто называют “обратным прокси”, и это в основном ограничено HTTP и TLS.

Таким образом, в конфигурации вашего маршрутизатора весь трафик на портах 80 и 443 должен идти на одну машину, на которой работает такой прокси (которая может работать на самом pfsense, если это ваш маршрутизатор, и я полагаю, у нее есть несколько пакетов для этого), а затем прокси будет перенаправлять TLS соединения или HTTP запросы на любой сервер, который он настроен использовать.

И Nginx, и Apache могут действовать как обратный прокси (в основном, просто определив виртуальные хосты, которые имеют ProxyPath вместо DocumentRoot). Другие распространенные выборы – это HAproxy и, думаю, Traefik? и Caddy? (Что люди часто используют с Docker.)

Существуют подобные прокси для Minecraft, но не для SSH, например, поскольку SSH не отправляет запрошенное имя хоста нигде в своем протоколе. Если вы хотите иметь доступ к нескольким внутренним хостам по SSH, вам нужно использовать различные номера внешних портов. (Или различные внешние IP адреса, но они, вероятно, уже не дешевые.)

Ок, я нашел ‘Nginx Proxy Manager’, я установил это на свой сервер truenas scale.

И это работает в основном
Множество вещей правильно перенаправляется при использовании вне моей локальной сети.

Я тестировал, используя свой телефон и телефонный хотспот + ноутбук.

Единственное, что не работает в данный момент, это мой сайт Nextcloud.
При попытке подключения я получаю ‘ERR_TOO_MANY_REDIRECTS’

Когда я использую свой VPN, это работает, в локальной сети это тоже работает.

Ответ или решение

Для размещения нескольких веб-сайтов за одним IP-адресом и портом 80 вам потребуется организовать инфраструктуру с использованием обратного прокси-сервера. Этот подход позволит перенаправлять запросы по доменным именам на различные внутренние серверы в зависимости от требуемого виртуального хоста. Давайте рассмотрим теорию, практические примеры и применение на вашем случае.

Теория

Обратный прокси-сервер берет входящие запросы, анализирует информацию, такую как доменное имя в HTTP-заголовке Host, и перенаправляет их на нужные серверы внутри вашей сети. Это выполняется независимо от того, на каком именно сервере размещается ваш сайт с определенным поддоменом. Обратные прокси-серверы также могут выполнять роль балансировщиков нагрузки и обеспечивать SSL/TLS шифрование.

Чаще всего используются обратные прокси-серверы, такие как Nginx, Apache, HAProxy и Traefik, которые позволяют настраивать правила переадресации для поддоменов (например, nc.server.example.eu, mattermost.server.example.eu). Таким образом, все входящие HTTP-запросы на ваш публичный IP-адрес проходят через обратный прокси, который затем направляет их на нужные внутренние адреса.

Пример

В вашей ситуации, вы уже задействовали Nginx Proxy Manager, что является отличным выбором для управления входящими HTTP/HTTPS-запросами. Ваша текущая сеть выглядит следующим образом:

  • www.example.eu на Nginx Proxy Manager.
  • Внутренние серверы (192.168.1.2, 192.168.1.8, 192.168.1.9) обрабатывают специфические поддомены.

Логика работы такая: запрос на www.example.eu обрабатывается Nginx Proxy Manager, который затем перенаправляет его на соответствующий сервер, основываясь на конфигурации. Nginx читает заголовок Host и передает запрос серверу по адресу, указанному в настройке для этого домена.

Применение

Чтобы все корректно функционировало, необходимо установить и настроить обратный проксии на вашем сервере:

  1. Настройка NAT и перенаправление на Proxy Manager: ваш маршрутизатор должен направлять все входящие подключения на порты 80 и 443 к вашему серверу с Nginx Proxy Manager.

  2. Настройка SSL/TLS: поскольку у вас есть многодоменный сертификат (wildcard), настройка SSL должна выполняться на уровне Proxy Manager, который будет обеспечивать шифрование и безопасные соединения для всех поддоменов.

  3. Настройка правил в Proxy Manager: создайте обратное проксирование для каждого домена. Например:

    • nc.server.example.eu -> 192.168.1.2:80
    • mattermost.server.example.eu -> 192.168.1.8:8065 (или соответствующий порт Mattermost)
    • aapanel.server.example.eu -> 192.168.1.9:8888 (например, если используется этот порт)
  4. Ошибки и устранение неполадок: ошибка ERR_TOO_MANY_REDIRECTS указывает на цикл перенаправлений. Это может быть связано с неправильной конфигурацией URL (например, включение в конфигурации redirect HTTP на HTTPS или наоборот). Проверьте конфигурацию для Nextcloud внутри Proxy Manager на наличие конфликтов, например, когда сервер возвращает переадресацию обратно к Proxy.

  5. Тестирование и отладка: убедитесь, что все поддомены правильно настроены и тестируются как из Интернета, так и внутри локальной сети. Важно, чтобы конфигурация на всех уровнях (маршрутизатор, Proxy Manager, внутренние серверы) была согласованной и правильной.

Таким образом, с помощью обратного прокси, вы можете эффективно управлять несколькими веб-сайтами и серверами из одного публичного IP-адреса без необходимости изменять физическую инфраструктуру или добавлять дополнительные IP-адреса. Это позволяет вам гибко и масштабируемо развертывать ваши веб-приложения и сервисы.

Оцените материал
Добавить комментарий

Капча загружается...