是否可以从域名指向特定端口?

Is it possible to point a specific port from a domain name?

基本上我想要的是这个:

first.name.com:25565 -> 127.0.0.1:25562
second.name.com:25565 -> 127.0.0.1:25565

这是我托管的某些 Minecraft 服务器的。

您正在寻找的是基于名称的虚拟主机。在第 4 层传输,您只能通过 IP 或端口号重定向到不同的服务,但是,包括 HTTP(S) 在内的许多协议传输请求中使用的域名,这允许反向代理服务,例如 Apache 或 Nginx重定向到同一甚至不同主机上的实际服务。 Squid 通常用作客户端的转发代理,这在这种情况下没有帮助。您想要的是服务器端的反向 HTTP(S) 代理。我最熟悉 Apache,所以我会在这里介绍它,但 Nginx 和其他人也可以这样做。您将需要 Apache 基于名称的虚拟主机来为每个主机名创建不同的服务,然后将其反向代理到其背后的真实服务。请注意,您不能在 1234 上同时拥有 Apache 运行 和

Listen 10.1.1.1:1234
NameVirtualHost 10.1.1.1:1234

<VirtualHost 10.1.1.1:1234>
    ServerName first.name.com
    ProxyPreserveHost On
    ProxyPass "/" "http://127.0.0.1:4321/"
    ProxyPassReverse "/" "http://127.0.0.1:4321/"
</VirtualHost>
<VirtualHost 10.1.1.1:1234>
    ServerName second.name.com:1234
    ProxyPreserveHost On
    ProxyPass "/" "http://127.0.0.1:1234/"
    ProxyPassReverse "/" "http://127.0.0.1:1234/"
</VirtualHost>

您还需要确保为 Apache 启用了 mod_proxy 和 mod_proxy_http 模块。在 Debian/Ubuntu 上,可以这样做:

$ sudo a2enmod proxy
$ sudo a2enmod proxy_http

最后要注意的是,您要求将来自代理的相同端口 1234 重定向到 127.0.0.1 上的本地主机。通常,我建议为实际服务使用不同的端口,但如果像我在上面的示例中使用 10.1.1.1 那样将 Apache 显式绑定到外部 IP,然后仅将内部服务绑定到 127.0,则可以共享端口.0.1。如果您使用它写为 0.0.0.0 或 * 的普通通配符绑定,那么这两个服务将发生冲突。

好的,这就是我最后做的事情:

mc.name.com 使用 CNAME 记录指向服务器的主机名

我添加的下一条记录是一条 SRV 记录,使 25565 指向 25562(或我需要的任何端口)

_minecraft._tcp.mc.muchieman.com SRV 900 0 5 25562 mc.muchieman.com.

900 是 TLS,0 是优先级,5 是权重,25562 是指向的端口