这是我的情况
家庭网络、Windows 机器、1 个面向外部的 IP 地址(允许端口 80)1 个始终开启的 Windows 家庭服务器机器,计划很快升级到 WHS 2011。几个使用自己的网络服务器并可直接访问的 IP 摄像机。
我的问题/目标:
我希望能够通过子域名、端口 80 从外部访问我家庭网络上的 IP 摄像机和服务器。例如:cam1.mydomain.com、cam2.mydomain.com、nas.mydomain.com 等。
它们目前已设置端口转发,但我工作所在的许多网络都已锁定所有非标准端口,因此我需要将它们全部放在端口 80 上。据我了解,这无法在路由器级别完成,而需要在 Web 服务器级别完成,这样就可以了。
本质上,这只是根据子域名在内部路由到不同的服务器,我希望这是一个常见问题,并有一个相对简单的解决方案。
如果我遗漏了什么,请告诉我。提前谢谢您。
(顺便说一句,如果其他条件相同,IIS 比 Apache 更可取)
答案1
如果您通过 HTTP 访问服务(即直接通过 Web 浏览器而不是通过插件或其他客户端应用程序),那么您可以使用 nginx 之类的反向代理来执行此操作 - 它可以选择根据传入的“主机”标头行将其代理的每个请求发送到何处(通过为每个子域设置一个具有自己的代理传递设置的“服务器”指令)。
除非您正在运行某些自定义固件,并且该固件运行(或允许您安装)像 nginx 这样的可以充当反向代理的程序,否则您将无法在路由器上执行此操作,但如果您将 TCP80 端口转发到运行 nginx 的机器,那么该技术就会起作用。
https://help.ubuntu.com/community/Nginx/ReverseProxy给出了 nginx 作为反向代理的示例配置(如果您需要更多示例,还会有更多示例)。许多其他 Web 服务器或专门设计用于提供反向代理服务的任何应用程序都应该能够为您做到这一点。如果您有 mod_proxy(如果我没记错的话,它通常存在,但默认情况下不加载),Apache 就可以做到这一点。如果我没记错的话,IIS不能无需第三方附加组件(可能需要花钱),但大多数开源工具都有 Windows 版本可以完成这项工作,因此即使您处于完全的 Windows 环境中,您仍然可以使用它们。
答案2
您可以通过在公共地址上运行一个 apache 实例来实现此目的(实际上,这仅意味着将端口 80 从路由器转发到任何可以为您运行 apache 的内部框)并为每个子域定义一个虚拟主机并使用代理传递将其传递给真实的内部地址:
<VirtualHost *:80>
ServerName cam1.domain.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyErrorOverride On
ProxyPass / http://192.168.1.123/
ProxyPassReverse / http://192.168.1.123/
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName cam2.domain.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyErrorOverride On
ProxyPass / http://192.168.1.124/
ProxyPassReverse / http://192.168.1.124/
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>
其中 cam1 内部为 192.168.1.123,cam2 内部为 192.168.1.124 等。