基于主机名或原始 IP 的动态端口转发

use*_*398 7 networking port-forwarding node.js

我是一名程序员,试图找出我领域之外的一些东西:

假设我有一台机器,客户端将与它建立 tcp(但不是 http!)连接。我想根据客户端连接到的主机名将客户端重定向到他们自己的端口。例如client1连接client1.myserver.com,连接1234端口,client2.myserver.com -> 1235,client3.myserver.com -> 1236等。

我想动态控制主机 y 的端口 x 如何实际指向我的物理机上的端口 z。

在谷歌搜索此信息时,我看到了对防火墙、代理、反向代理的引用。我真正需要哪种软件?现有软件是否允许按需进行此类更改(我听说防火墙更改需要一天时间)?

如果我想自己编写这样一个层(因为它可能有点特定于应用程序),是否可以在 java 或 node.js 中完成(我的意思是可以使用更高级别的 API 来完成还是我必须开始拆解 ip包)?由于所有主机名都解析为同一台机器,我怎么知道客户端连接到哪个主机名?

我也会感谢指向任何阅读材料的指针。

sys*_*138 11

在 IP 级别,没有主机名这样的东西。主机名是 IP 地址的应用程序级抽象,在 Internet 或传输层它们没有任何意义。

在 HTTP 共享托管中,这个技巧是在处理HTTP会话的过程中抽象出来的,它发生TCP 会话开始之后。正是因为这个原因,运行 SSL 服务器需要一个专用的 IP 地址,因为 SSL 会话发生在 HTTP 会话之前(此后已在较新的 TLS 版本中修复,其中 HOSTNAME 现在可以作为 SSL 协商的一部分包含在内) )。

对于共享托管 HTTP 实例,协议的协商顺序大致如下:

TCP -> SSL -> HTTP
Run Code Online (Sandbox Code Playgroud)

在完成较早的协议之前,不能启动每个协议。直到最近,只有链中的最后一步知道主机名,这就是为什么要由网络服务器软件来处理主机名与 IP 的多对一关联。

对于动态端口转发,这仅在应用程序协议以某种方式知道主机名时才可行。某些设备(无论是软件还是硬件)处理与客户端的初始 TCP 连接和应用程序协议的第一步(无论是什么),并根据接收到的内容将连接转发到其最终目的地。

所需的确切步骤因应用程序协议本身而异。一些,如 HTTP,包括一个 HOSTNAME 标头,指示客户端希望与之交谈的主机名。其他协议(如某些 Microsoft 协议)利用基于 DNS 的 SRV 记录来确定精确的 IP端口组合。由于听起来您可能正在从一开始就设计自己的应用程序协议,因此我建议遵循 HTTP 的指导原则,并在您的初始协议协商步骤中包含一个 HOSTNAME 标头。


Chr*_*rpe 2

您可以使用 DNS 中的 SRV 记录最轻松地实现此目的:

http://en.wikipedia.org/wiki/SRV_record