Назад | Перейти на главную страницу

Позволит ли nginx мне получить доступ к внутренним веб-сайтам из Интернета через поддомены без указания внутреннего порта?

В течение многих лет я просто перенаправлял порты со своего маршрутизатора на IP-адрес соответствующей машины и использовал что-то вроде http://example.com:9999. Но поскольку я использую множество устройств Интернета вещей, меня все больше беспокоит отказ от использования SSL. Я также не люблю раскрывать номер порта, чтобы некоторые хакеры не догадывались о некоторых из моих услуг. Да, я мог бы изменить внешний порт, но я бы предпочел использовать поддомен, так как это имя сразу говорит мне, для чего используется служба, не требуя от меня искать порт службы в другом месте.

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

  1. https://192.168.1.20:6668
  2. https://192.168.1.30:6669

И у меня есть машина под управлением Windows IIS (192.168.1.40), к которой я могу получить доступ по https (я использую IIS для принудительного перенаправления на https)

  1. https://site3.example.com
  2. https://site4.example.com

Я хочу иметь к ним доступ из Интернета, используя: (и все они перенаправляют на https)

https://site1.example.com
https://site2.example.com
https://site3.example.com
https://site4.example.com

До использования Ubuntu и с одной машиной Windows я мог бы просто использовать заголовки хоста в IIS для достижения этой цели. Но поскольку вы можете перенаправить внешний порт только на одну внутреннюю машину, мне понадобится какая-то служба, такая как nginx, и она будет отвечать за маршалинг запросов на правильную машину. Поскольку, похоже, я иду по этому пути, я мог бы также избавиться от перенаправления IIS http (и, возможно, заголовков хоста) и передать все в nginx. Это потребует от меня использования разных портов для SSL в IIS на каждом сайте, но это не имеет большого значения.

Если бы мой маршрутизатор перенаправлял TCP-порты с 80,443 на 192.168.1.10 (с запущенным nginx), я знаю, что мог бы создавать перенаправления, чтобы гарантировать, что все HTTP-запросы будут принудительно переведены на https, а также использовать поддомен для определения, какой компьютер и порт для пересылки запроса. Но сможет ли nginx скрыть внутренний порт от интернет-клиента? Это часть того, что подразумевается под nginx как обратным прокси?

ETA: Как в игру вступают сертификаты SSL? Я планирую использовать Let's Encrypt для получения сертификатов SSL. Как и в моем примере выше, https://site1.example.com направится к http://192.168.1.20:6668. Где мне использовать Let's Encrypt для создания этих сертификатов? Имеет смысл сделать это на веб-сайте 192.168.1.20, но нужно ли мне делать это и на nginx, поскольку именно там происходит перенаправление?

Да, это должно быть довольно просто сделать с nginx.

Во-первых, вам нужно, чтобы правило сервера по умолчанию перенаправляло все HTTP-запросы на https. Что-то вроде этого...

server {
    listen 80 default_server;
    return 301 https://$host$request_uri;
}

Затем вы должны добавить конфигурации для каждого из ваших виртуальных серверов. Что-то вроде ...

    server {
            listen 443;

            server_name site1.example.com;

            ssl_certificate     site1.example.com.crt;
            ssl_certificate_key site1.example.com.key;
            ...

            location / {
                    proxy_pass http://192.168.1.20:6668;
                    proxy_set_header Host            $host;
                    proxy_set_header X-Forwarded-For $remote_addr;
            }
    }

Вам нужно будет добавить дополнительные биты, необходимые для правильного завершения запроса SSL в nginx.

Тогда в вашем маршрутизаторе вы разрешите входящие запросы только на порты 80 и 443, поэтому к внутренним портам нельзя будет получить доступ напрямую.

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

Обновить

Вы не стали бы устанавливать сертификаты SSL на свои внутренние серверы. Только на общедоступном сервере nginx. Нет необходимости защищать соединение nginx с вашими частными серверами, так как это происходит в вашей частной сети.

Чтобы повторить итерацию, единственным сервером, который фактически подключен к Интернету, будет ваш сервер nginx. Частные внутренние серверы не будут доступны за пределами вашей сети, поэтому устанавливать SSL не нужно.

Распространенным вариантом использования является общедоступный экземпляр nginx с поддержкой SSL, перенаправляющий запросы на частные серверы через HTTP.