sha*_*n m 9 tcp access-control-list haproxy gameserver
我的单个主机上有多个游戏服务器 TCP 端口。目标是让用户能够连接到 server1.domain.net 并根据该子域进行定向。我的第一直觉写了以下内容,但后来我意识到 TCP 流量不会有任何要读取的标头。使用 HAProxy 1.5.8。我尝试使用多个后端、use_backend 和完整的 ACL 行做同样的事情,但得到了相同的结果(可以理解)。
listen game-listener
bind x.x.x.x: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
Run Code Online (Sandbox Code Playgroud)
是否有像 hdr(host) 这样的检查可以用于 TCP 连接?还是我做得对,而游戏玩得不好?
谢谢!
根据客户端连接的主机名将连接分派到不同的后端在 TCP 层上是不可能的。
您必须为每个主机名使用单独的 IP 地址,或者使用协议特定代码在应用程序层实现代理以检测主机名。
这种代理对于某些协议是可能的,但对于其他协议则不是。从容易到不可能,我足够了解的协议是:
我不知道任何其他带有主机名的协议,可用于此类目的。所以我猜大多数不在上面列表中的协议是不可能通过主机名代理的。
作为代理的替代方案(如果可以基于主机名,则取决于应用程序协议)您可能需要检查客户端软件是否SRV知道,在这种情况下,您应该能够单独在 DNS 中进行设置。
一个SRV记录的格式如下:
_Service._Proto.Name TTL Class SRV Priority Weight Port Target
Run Code Online (Sandbox Code Playgroud)
在您提到多个 Minecraft 实例的具体示例中,应该可以根据SRV记录执行此操作,并且记录可能如下所示:
_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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13934 次 |
| 最近记录: |