Realm是一款由rust语言编写的开源高性能端口转发软件,支持多组端点转发,支持tcp&udp和域名解析,详见Github。本文主要介绍如何用该工具中转代理流量。
zhboner/realm
A network relay tool
Rust
1836
305
安装Realm #
为方便起见,可直接在Realm的Releases页面下载对应你系统版本的编译好的压缩文件,解压即可得对应二进制可执行文件realm。
解压完毕后,赋予其执行权限:
cd /path/to/realm
chmod +x realm
配置Realm #
创建配置文件config.toml
vim config.toml
配置示例
[log]
level = "warn"
output = "realm.log"
[network]
no_tcp = false
use_udp = true
[[endpoints]] #一对端点,监听本机5000端口的流量并将其转发到1.1.1.1的443端口
listen = "0.0.0.0:5000"
remote = "1.1.1.1:443"
[[endpoints]] #可添加多对端点,可自动解析域名
listen = "0.0.0.0:10000"
remote = "www.google.com:443"
[[endpoints]] #若本地有ipv6地址同样可以转发到别的ipv6地址
listen = "0.0.0.0:10000"
remote = "2001:4860:4860::8888:443"
更详细的设置见Github
中转情景 #
现假设有机器A、B、C,其中A为你的客户端,B为中转机器,C为已经搭载了一个节点的机器。A-C之间可能隔了一堵可悲的厚障壁,也可能路由绕球一圈,总之,让A和C直接连接并不是一个好主意。此时若使用B作为中转机器,你的流量路径(仅讨论去程)就变成了A-B-C,合理的中转机器选择会让你的网络体验丝滑无比,现在开始配置这三台机器。
首先是中转机器B,在这台机器上我们需要配置Realm端口转发服务:
[log]
level = "warn"
output = "realm.log"
[network]
no_tcp = false
use_udp = true
[[endpoints]]
listen = "0.0.0.0:8443" #监听本机的8443端口流量
remote = "IP of C:443" #将其转发到C的443端口
而作为远程端点的C,只需要正常配置节点保证其连通性即可
在客户端A上,以sing-box的配置为例,我们需要将对应某个outbound节点的server和server_port修改如下:
{
"type": "vless",
"tag": "A-B-C",
"server": "IP of B",
"server_port": 8443,
...余下配置
}
这样,流量路径就被成功调整为
A -> B:8443 -> C:443
若
A和B之间相隔了一道大墙,C上面的节点协议务必使用经过加密混淆的协议,否则可能导致悲剧的发生。从A发出的到B的流量仍然是经过加密的流量,比如落地机C使用的是vless+reality,那么A发出的流量也是该协议的流量,B仅仅作为透明转发而不关心里面的内容。
将Realm添加到系统服务 #
假设你已拥有root权限,以Debian为例:
- 创建服务单元文件
vim /etc/systemd/system/realm.service
- 在其中写入以下内容:
[Unit]
Description=Realm Service
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Type=simple
ExecStart=/path/to/realm/realm -c /path/to/realm/config.toml
User=root
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
将ExecStart中的路径换为你自己的realm路径即可
- 启用服务
systemctl daemon-reload
systemctl start realm.service
systemctl enable realm.service
systemctl status realm.service
以上命令会启用服务并显示其执行状态,若为active则表示服务启动成功
- 实时查看日志
journalctl -u realm.service -f