通过主机名代理TCP

我的单个主机上有多个游戏服务器TCP端口。 目标是让用户能够连接到server1.domain.net,并根据该子域名进行定向。 我的第一本能写了下面的内容,但后来我意识到,TCPstream量不会有任何头来读取。 使用HAProxy 1.5.8。 我尝试使用多个后端,use_backend和完整的ACL线做同样的事情,但得到了相同的结果(可以理解)。

listen game-listener bind xxxx:22222 mode tcp use-server server1 if { hdr(host) -i server1.domain.net } use-server server2 if { hdr(host) -i server2.domain.net } server server1 localhost:22201 check server server2 localhost:22202 check 

是否有像我可以用于TCP连接的hdr(主机)检查? 还是我做对了,游戏只是不好玩?

谢谢!

作为代理的替代(如果可以根据应用程序协议来决定是否可以根据主机名进行),您可能需要检查客户端软件是否支持SRV ,在这种情况下,您应该可以单独在DNS中进行设置。

SRVlogging具有以下格式:

 _Service._Proto.Name TTL Class SRV Priority Weight Port Target 

在你提到的Minecraft多个实例的具体例子中,应该可以根据SRVlogging来做到这一点,logging可能是这样的:

 _minecraft._tcp.foo.example.com. 86400 IN SRV 0 5 25565 server1.example.com. _minecraft._tcp.bar.example.com. 86400 IN SRV 0 5 25566 server1.example.com. 

根据连接到客户端的主机名在TCP层上不可能做到,将连接分派到不同的后端。

您必须为每个主机名使用不同的IP地址,或者在应用层使用协议特定的代码来实现代理来检测主机名。

这样的代理对某些协议是可能的,但对其他协议不可行。 从简单到不可能,我所了解的协议是:

  • HTTP很容易支持。 所有HTTP / 1.1客户端和大多数HTTP / 1.0客户端将在发送服务器的任何答案之前发送一个主机头。 没有主机头的客户可能早就不在了,因为现在很多网站在没有主机头的情况下都不能运行。
  • 支持SNI的所有客户端都可以使用HTTPS。 SNI比HTTP / 1.1更为标准化,在没有SNI支持的情况下,仍然有less数客户。
  • DNS可以支持,但有一点棘手。 在大多数情况下,您只需在公共IP地址上直接操作授权DNS服务器,而不是使用代理服务器。
  • SMTP是可能的支持,但也棘手。 SMTP的代理可能最终看起来更像是一个SMTP中继,而不像代理。
  • SSH是不可能支持的。 主机名的概念根本不存在于协议中。 客户端可以使用DNSparsing服务器的IP地址,并且可以将存储的主机密钥与其主机名关联起来,但是这完全是客户端的实现细节。 这对于代理来说是不可见的,所以它不能用来分派连接。 而且没有有用的信息以明文forms发送,甚至在SSH协议开始时以明文forms发送的less量信息在协议中稍后被authentication,所以如果你得到任何错误的部分,通信就会中断。 什么使得这个更不可能处理的事实是,客户端不会发送一个字节的有效载荷,直到服务器向客户端发回一个标题。 因此,代理将没有任何信息工作。

我不知道任何其他协议与主机名,可用于这种目的。 所以我猜测大多数协议不在上面的列表是不可能的主机名代理。