使用Caddy转发内网的Minecraft服务器小结
接上文,我搭建了一个tailscale虚拟内网,把自己的各种设备在一个虚拟网段中组织了起来。于是,通过一个拥有外网IP的节点,就可以把自己内网的Minecraft服务器转发到外网,算是一个内网穿透的新选择。
相比nginx,我更加喜欢配置简单清晰的caddy。而且还有最新最潮的自动SSL功能,实在是降低心智负担的好选择。但是,caddy和nginx都属于HTTP层的转发代理。众所周知,Minecraft使用了自定义的TCP协议进行网络通信,所以无论是nginx还是caddy,都需要通过安装额外插件的方式来支撑TCP转发。
xcaddy
xcaddy(caddyserver/xcaddy: Build Caddy with plugins (github.com))是一个编译、调试和管理caddy插件的项目。也是基于Go,所以我们需要先安装一个Go环境。
按照Go官方推荐的安装方法,我们把go环境(也就是GOROOT)安装到/usr/local/go
,默认的GOPATH则是在~/go
。
1 |
|
此时go已经安装完毕,打开go111module选项:
1 |
|
接着编译安装xcaddy:
1 |
|
此时xcaddy可执行文件被安装到了~/go/bin/xcaddy
caddy-l4
caddy-l4(mholt/caddy-l4: Layer 4 (TCP/UDP) app for Caddy (github.com))是caddy的一个TCP层代理插件,可以让caddy支持TCP/UDP/SOCKS等第四层的网络代理。
caddy的插件都将通过源码的方式编译到二进制文件中,也就是说我们需要通过xcaddy编译一个具有caddy-l4插件的二进制文件并替换我们已有的caddy可执行文件:
1 |
|
等待编译结束,此时带有caddy-l4插件的caddy将会出现在当前路径中,我们使用这个caddy将原来的caddy替换。
1 |
|
此时caddy-l4安装完成,接下来我们来配置caddy。
使用JSON配置文件
鉴于caddy-l4模块目前并不支持Caddyfile,所以我们将使用JSON格式的配置文件来运行caddy。不过该模块的Caddyfile支持也是在不断地推进当中了,不远的将来也许我们可以继续使用Caddyfile(Feature Request: Support Caddyfile · Issue #16 · mholt/caddy-l4 (github.com))。
caddy的JSON格式配置文件的说明可以从官网查看,我们可以通过以下指令将Caddyfile转换到JSON格式的配置文件:
1 |
|
可以看到官方默认的代理都在apps.http
中,caddy-l4的配置将在app.layer4
中,格式和http类似。具体的matcher和handler列表可以在github项目主页看到(但很可惜并没有相关说明,具体的使用方法只能通过看代码或者通过灵感检定获知)。
我的minecraft服务器在tailscale内网的100.64.0.17:25565端口,于是可以这样编写配置文件:
1 |
|
此配置文件将监听23343端口的TCP请求,并将其转发到100.64.17的25565端口。
更改caddy服务使用的启动选项:
1 |
|
重载并重启caddy服务:
1 |
|
在Minecraft中把指定IP的23343端口添加到服务器列表并刷新,可以看到当前已经联通(别忘了在VPS控制台放开指定端口)。查看caddy的日志可以发现确实收到了查询服务器状态的请求:
1 |
|
设置SRV转发
通过SRV转发,可以让访问Minecraft服务器时省略掉指定端口。
以腾讯云DNS为例,将_minecraft._tcp.mc
记录转发到0 5 23343 xxx.xxx.xxx.xxx.
。含义是将通过mc子域名访问的minecraft协议tcp请求转发到xxx.xxx.xxx.xxx:23343,优先级是0,权重是5。
等待DNS缓存服务器刷新。然后就可以使用mc.yourdomain.com访问Minecraft服务器了。
也可以通过以下windows指令检查SRV解析情况:
1 |
|
到此就大功告成了!可喜可贺,可喜可贺。