В течение многих лет я просто перенаправлял порты со своего маршрутизатора на IP-адрес соответствующей машины и использовал что-то вроде http://example.com:9999. Но поскольку я использую множество устройств Интернета вещей, меня все больше беспокоит отказ от использования SSL. Я также не люблю раскрывать номер порта, чтобы некоторые хакеры не догадывались о некоторых из моих услуг. Да, я мог бы изменить внешний порт, но я бы предпочел использовать поддомен, так как это имя сразу говорит мне, для чего используется служба, не требуя от меня искать порт службы в другом месте.
Допустим, у меня есть два веб-сайта на двух машинах Ubuntu, к которым я могу получить доступ изнутри следующим образом:
И у меня есть машина под управлением Windows IIS (192.168.1.40), к которой я могу получить доступ по https (я использую IIS для принудительного перенаправления на https)
Я хочу иметь к ним доступ из Интернета, используя: (и все они перенаправляют на 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.