将流量从互联网路由到正确的内部服务器(基于主机名)

将流量从互联网路由到正确的内部服务器(基于主机名)

我的本地网络上有两台服务器,我想让它们可以访问互联网。

我希望所有流量都server1.example.com被路由到 10.0.0.1,所有流量都server2.example.com被路由到 10.0.0.2

如果需要,我可以设置第三台服务器来运行代理或任何需要的东西。我更喜欢 Mac/Linux 解决方案。

我见过的大多数其他解决方案仅代理特定服务。我想代理所有流量。

我如何根据主机名进行路由?

答案1

正如@Andriy 所说,仅仅使用 IP 是不可能的。

当您的计算机连接到 时server1.example.com,它实际上正在将其解析为 IP 地址,例如:123.123.123.123

一旦它获得了 IP 地址,它就会尝试连接到主机上的相关端口123.123.123.123。此时,还没有“主机名' 或 DNS。


如果您想实现这一点,那么您有两个选择:

  • 通过使用不同的公网IP地址来区分服务。
  • 通过使用不同的端口来区分服务。

您已经声明过“不希望它是特定于协议的“,但(例如)如果您使用 HTTP(S),那么这将是可能的。

这是唯一可能的,因为 HTTP 在其标头中包含了附加信息,在连接到主机后,123.123.123.123它会说“请假装我在跟server1.example.com“。

连接123.123.123.123并说“请假装我在跟someotherhost.example.com“—即使此主机未公开宣传。此请求是否执行取决于您的配置。

答案2

不幸的是,IP 路由中没有主机名,只有 IP 地址。IP 标头仅包含源 IP 和目标 IP,而不包含主机名。

因此,您不能根据名称代理所有流量,因为 IP 数据包内部没有域名。

但是,某些协议(如 HTTP 1.1)确实带有域名。因此,您可以设置反向 HTTP 代理,查看 HTTP 请求,并根据这些请求中的域名/URL 将其转发到您的内部服务器。

HTTP 反向代理有很多种。基本上,大多数 HTTP 服务器(如 Apache)都可以配置为反向代理。以下是此类配置的示例:

https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html

相关内容