介绍
今天在水群的时候,有老哥提到,可以在openwrt软路由上跑一个gost,通过隧道代理搭建游戏节点,小白觉得这是一个很不错的想法。众所周知,众多代理协议中(真VPN除外),shadowsocks和sock5(以下简称ss和s5)是支持原生UDP的,而其他代理协议则是通过UoT(UDP over TCP)来处理UDP数据包的。以下内容摘自RPXR的进阶必读:代理协议 UDP 全方位透彻解析
- Socks5、Shadowsocks 都是原生 UDP,它们的 UDP 不走底层传输方式
- VLESS、Trojan、VMess、Mux 都是 UDP over TCP,且走底层传输方式
- HTTP 出入站不支持代理 UDP,Socks 版本 5 之前也不支持 UDP
- 这里的 FullCone 指的是 UDP 的 NAT 行为,配置时尤其注意防火墙
- 链式代理若要实现 FullCone,一般来说所有环节都要支持 FullCone
- Docker 若要实现 FullCone,相关容器的网络模式需要是 Host
补充:Socks、SS 是原生 UDP,套 TLS/WSS 后它们的 UDP 并没有被特殊处理,除非开了 Mux。SS 的 SIP003 插件也不管 UDP。
UDP over TCP 简称 UoT,特别注意,即使你用 mKCP、QUIC 作为底层传输方式,UoT 的也并不会表现出原生 UDP 的那些特性。
关于原生UDP和UoT的区别,大家可以去看不良林的这个视频。
我们先来看一下nat类型:
我们要实现在线游戏或者联机对战都是需要FullCone或者NAT1的,而最佳的方案肯定是使用ss或者s5实现原生UDP的FULLCone,但是目前这种情况下,继续使用ss或者s5,IP几乎是很快就没了……通行的做法是采用国内中转机通过隧道中转,但是并不是每个人都需要或者说想再买一台国内机器的。但是,对于很多游戏玩家来说,大部分人还是拥有一台openwrt的软路由的,openwrt本身也是Linux系统,这不是现成的中转机嘛。我们完全可以把我们的软路由当作中转机,通过隧道中转我们的ss节点。
群内老哥使用的是gost,小白我比较习惯使用realm,那我们今天来试试通过realm转发。
此处为官方项目地址:
https://github.com/zhboner/realm
具体配置文件写法,请参考:
https://github.com/zhboner/realm/tree/master/examples
realm最新发行版为v2.4.6
realm支持json和toml格式的,小白这里采用的toml格式的配置文件。
入口端配置
我们直接ssh登录软路由,新建一个realm目录并进入该目录:
mkdir realm && cd realm
下载对应的realm版本,小白的软路由为废弃笔记本改造而来,X86架构,我们选择此版本:
通过如下命令,下载:
wget https://github.com/zhboner/realm/releases/download/v2.4.6/realm-x86_64-unknown-linux-musl.tar.gz
如果你的本地环境连接GitHub比较困难,可以先下载下来,然后再上传……
解压,我们会得到realm的可执行文件:
tar -zxvf realm-x86_64-unknown-linux-musl.tar.gz
新建配置文件:
touch config.toml
写入如下内容:
[network] use_udp = true [[endpoints]] listen = "0.0.0.0:xxx" remote = "xxx.xxx.xxx.xxx:xxxx" remote_transport = "tls;sni=xxxxx.com;insecure"
其中,listen = “0.0.0.0:xxx”,请自行选择空闲端口监听,remote = “xxx.xxx.xxx.xxx:xxxx”,为隧道出口的IP和端口,remote_transport = “tls;sni=xxxxx.com;insecure”中xxxxx.com请自行填写任意域名,需与出口端保持一致。我们直接命令行realm:
./realm -c config.toml
运行结果如下:
出口端配置
新建一个realm目录并进入该目录:
mkdir realm && cd realm
下载对应的realm版本,X86架构,我们选择此版本:
通过如下命令,下载:
wget https://github.com/zhboner/realm/releases/download/v2.4.6/realm-x86_64-unknown-linux-gnu.tar.gz
解压,我们会得到realm的可执行文件:
tar -zxvf realm-x86_64-unknown-linux-gnu.tar.gz
新建配置文件:
touch config.toml
写入如下内容:
[network] use_udp = true [[endpoints]] listen = "0.0.0.0:xxxx" remote = "xxx.xxx.xxx.xxx:xxxx" listen_transport = "tls;servername=xxxxx.com"
其中,listen = “0.0.0.0:xxx”,请自行选择空闲端口监听,remote = “xxx.xxx.xxx.xxx:xxxx”,为ss节点的IP和端口,如果隧道出口机和ss节点机位同一台机器,请填写127.0.0.1:xxxx。listen_transport = “tls;servername=xxxxx.com”中xxxxx.com请填写和入口端相一致的域名。我们直接命令行realm:
./realm -c config.toml
运行结果如下:
实际测试
小白的软路由为192.168.1.4,我们直接在v2rayN中,直接填入软路由的IP和realm监听的端口:
我们来测试下nat类型,完美FullCone&NAT1。
优化
1.我们可以直接将节点填入软路由中的passwall、openclash等插件中,从而实现透明代理,全局fullcone。
2.我们可以将realm放入tmux或者screen中,后台运行。
3.关于进程守护,开机启动:
出口端可以直接采用systemctl进程守护,自己写个service文件,加入开机启动就行了,网上很多教程,小白就不赘述了。
入口端,openwrt采用的是procd实现进程管理,小白不熟,自行学习……