多年来,我一直将端口从路由器转发到相应机器的 IP 地址,并使用类似http://example.com:9999。但由于我一直在使用大量 IoT 设备,我越来越担心不使用 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 处理一切。这将要求我为每个站点在 IIS 上使用不同的 SSL 端口,但这不是什么大问题。
如果我的路由器将 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 上执行此操作,因为重定向就是在那里进行的?
答案1
是的,使用 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;
}
}
您需要添加所需的任何额外位来正确终止 nginx 中的 SSL 请求。
在您的路由器中,您将只允许端口 80 和 443 上的传入请求,因此无法直接访问内部端口。
请注意,这些 proxy_set_header 语句可能不是必需的。这只是为了让后端服务器收到正确的主机头和远程 IP 地址,以防它们需要这些。
更新
您不会在后端服务器上安装 SSL 证书。只需在面向公众的 nginx 服务器上安装。无需保护从 nginx 到您的私有服务器的连接,因为这发生在您的私有网络内。
再次重申,实际上直接暴露在互联网上的唯一服务器是您的 nginx 服务器。私有后端服务器无法从您的网络外部访问,因此不需要安装 SSL。
一个常见的用例是让面向公众的支持 SSL 的 nginx 实例通过 HTTP 将请求转发到私有服务器。