chirp+sunshine+moonlight+反向隧道实现远程串流
在chirp 1.1.6版本时,突然收到一个网友发来的消息,网友想要Sunshine搭配 Moonlight进程远程游戏串流。于是在1.1.7版本时,chirp果断适配了udp。1.1.8版本实现了udp/tcp共存,1.2.0版本实现了反向隧道,彻底摆脱udp被丢包的问题。
在chirp 1.1.7版本刚刚支持udp的时候,当我通过局域网测试正常通过Moonlight访问了Sunshine,但是通过chirp内网穿透之后,我的公网ip还是无法到访问到内网的Sunshine,Moonlight 显示 RTSP handshake failed 。
经过多轮测试发现
- 服务器udp服务正常通讯,但是对于我的本地 moonlight rtsp始终无法通讯。
- 服务器udp服务正常通讯,普通udp发送消息正常通讯
- 程序在纯内网udp时连接正常,普通udp消息通讯正常,rtsp连接正常
最终结论,运营商对音视频的udp流量进行了无差别限制。想到这里又揣测了Tailscale的原理,于是产生了一个大胆的想法。
能否模仿像Tailscale这样,两边都是局域网进行访问,中间建立一条无形的隧道,这样一来有两个好处。
- 服务器不再需要暴露更多的端口
- 公网只做数据转发,不必在遵守通用的udp、tcp的套路

最终效果如上图,我们可以从局域网a的内网ip端口,直接访问内网b的ip端口。当然,chirp也是支持自定义任意内网a和内网b的ip和端口,两边的局域网不必保持相同的ip和端口。
sunshine配置
登录sunshine后台,在应用处增加一个Desktop的应用

在配置页面,记录所有的端口和协议

chirp客户端配置
如果您是首次使用chirp,可以参考这篇文章进行安装部署https://mp.weixin.qq.com/s/FZsrcp1F3LI5FvA2GfFfIg。
首先在sunshine所在的局域网,打开chirp客户端,在隧道管理页面,依次添加隧道。

注意,内网ip软件默认为127.0.0.1,可根据实际局域网ip灵活调整
添加完,所有的ip、端口、协议。然后,依次启动多有的通道

然后我们找到另一个局域网的电脑,安装chirp客户端。
在反向隧道栏,点击刷新按钮,列表就会自动显示出sunshine穿透出来的所有ip

我们可以依次启动这些反向隧道,如果端口冲突,还可以点击编辑按钮,修改为新的端口。

moonlight
我们现在可以打开moonlight,输入反向隧道的所在的局域网ip。



最终查看这个画质,还不错。

结束语
chirp 还是一个比较年轻的穿透工具,原生的网页操作页面就做的很好,比起frp复杂的配置,使用起来更加便捷,对小白用户友好,易于上手。目前已经适配开箱即用的反向隧道模式,可以无缝使用异地局域网模拟内网互相访问。