如何将来自不同子域的流量路由到不同的内部 IP 地址?
我已经设置了一个具有一个公共 IP 和一个指向该 IP 的域名的 Debian 路由器,我希望不同的子域可以访问不同的内部机器。
我在这里谈论的是 HTTP、SSH 和 FTP 流量,并且我在路由器上安装了 Shorewall 和 dnsmasq。
例如,URL:ftp.example.com 我想指向一台内部 IP 为 192.168.1.10 的机器,然后 dev.example.com 我想访问另一个内部 IP。比如 192.168.1.200
如果我可以指定哪些子域允许使用哪些协议,并明确将每个协议和端口路由到内部机器,那就太好了。
答案1
对于某些协议,仅通过端口转发根本无法实现这一点,除非您在非标准端口上运行它们(因此路由器本身在 SSH 的端口 22 上,内部机器 1 出现在公共 IP 的端口 23 上,内部机器出现在端口 24 上,等等)或拥有多个公共地址。
HTTP- 这可以通过使用反向代理来实现。运行类似 nginx 的程序,并让其首先接收端口 80 上的所有流量,然后使用代理功能根据请求的(子)域将请求分发到相关机器。其他 Web 服务器也有类似的代理功能(例如 Apache,但如果您只需要代理功能,运行像 nginx 这样的较小程序会更有效)。
HTTPS- 如果所有连接的客户端都支持 SNI,那么您可以使用与上面提到的 HTTP 相同的方法。不幸的是,在 Windows XP 下运行的 Internet Explorer 版本都不支持 SNI,因此根据您的客户端群,这可能是一个问题。受影响的浏览器将向其用户显示证书错误。另一种解决方法是获取一个对您需要的所有名称都有效的证书(即,如果理论上名称非常不同,则获取多名称证书;如果它们都是单个名称的子域,则获取通配符证书),但这些证书通常比单名称证书更昂贵。
SSH- 不是直接可行的。不过,您可以直接通过 SSH 进入路由器,然后从那里通过 SSH 进一步进入网络。如果您正确使用咒语,即使是端口转发等也可以通过像这样的多跳工作。如果您让 SSH 工作,那么请记住,在许多情况下,SFTP 或 SCP 是 FTP 的可行替代方案,并带来 FTP 无法带来的好处。
FTP- 我已经很久没有运行 FTP 服务器了,所以我不是这方面的专家。可能有反向代理选项,但根据我对协议运作方式的了解,我对此表示怀疑。这里的一个选项是拥有一个 FTP 服务并让它通过网络共享访问网络上的不同机器(这可能不切实际,具体取决于您的身份验证要求,但对于很多事情来说应该足够了)。您还可以考虑使用 SCP 或 SFTP(通过 SSH),它比 FTP 更高效、更安全。
答案2
您想为此使用反向代理。Apache 的 mod_proxy应该可以解决问题。