我有 2 台机器和一台运行 DD-WRT 的路由器。我的机器是:
- Windows 2008,运行我的 DNS 和 IIS7
- Ubuntu 11.4 Server,运行 Apache 2。
目前,我已将对端口 80 上的外部 IP 地址的所有请求转发到我的 Windows 2008 计算机。我最近添加了额外的 Ubuntu 服务器,我想根据主机将其路由到 IP 地址。目前,端口和服务器之间只有 1 对 1 的关系,所有对端口 80 的请求都发送到 Windows 2008 计算机。例如,这就是我想要做的:
如果我的路由器上有请求example-a.com
,我会将其转发给192.168.1.2
。
example-b.com', I would forward it to
如果我对192.168.1.3有请求
这是否需要首先通过我的 2008 机器进行路由,还是我可以从路由器进行此操作?
答案1
要实现此功能,您需要一个反向代理,如果您在 ubuntu 服务器或 nginx 上使用 apache,则只需很少的额外工作即可轻松实现
简而言之,你要做的就是将路由器端口转发设置为你的 ubuntu 服务器,然后设置 Web 服务器来监听 example-a.com 和 example-b.com
假设 example-a.com 在 Windows 服务器上,那么你需要在 ubuntu 服务器上设置 example-a.com 以反向代理到你的 Windows 服务器
对于 Apache 来说这看起来像这样:
1 - 确保您的 apache2.conf 文件中有以下几行且取消注释:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
2- 为 example-a.com 创建一个虚拟主机:并向其中添加以下内容:
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http:/internalexample-a.com
ProxyPassReverse / http://internalexample-a.com
3- 在你的 ubuntu 服务器上重新启动 apache
这将允许您代理到 Windows 服务器,将 internalexaple-a.com 替换为 example-a.com 在 win 服务器上响应的 IP 或指向 Windows 服务器上同一站点的内部 DNS 名称
答案2
我不相信路由器会查看主机名。客户端在发送请求之前会解析 DNS。因此,目标 IP 将在请求中设置,路由器将根据目标 IP 进行路由。
这对 Web 服务器有效的原因在于 HTTP 协议在 HTTP 请求中包含主机名(称为主机头),但它位于数据包深处,而不是路由器可以看到的东西。
这也许有助于我们了解您需要使用什么应用程序/协议来执行此操作。HTTP?SSH?
顺便说一下,我使用 SSH 指定两个不同的端口来实现这一点。对一个服务器的请求转到端口 22,对另一个服务器的请求转到端口 29。YMMV