如何开启 Shiliew 的同时连接公司内网
Updated at: 2026-02-01
需求
一个 Shiliew 客户遇到一个场景:远程办公,使用公司提供的 OpenVPN 客户端进入公司网络来访问公司内网的服务,如果运行 OpenVPN 客户端,就无法同时运行 Shiliew 客户端。
原因是:OpenVPN 客户端在尝试接管底层系统网络,而 Shiliew 客户端也会尝试接管整个系统的网络,所以一般情况下无法同时运行。如果一个网络软件可以和 OpenVPN 客户端同时运行,那么这个网络软件可能只是创建了一个 socks5 或 http 代理,属于工作在应用层,而非从更底层进行网络处理。而应用层代理无法接管很多应用的网络,往往也只能处理 TCP 和 IPv4。而 Shiliew 则可以接管整个系统的网络,TCP/UDP/IPv4/IPv6。
那么公司提供 OpenVPN 方案只是手段,最终的目的是给远程办公的员工提供一个加密隧道,以让员工可以通过这个加密隧道进入公司网络,进而访问公司内网的服务。所以可以不用 OpenVPN 方案,让员工只用一个 Shiliew 客户端就可以实现目的。
解决方案
我们知道 Shiliew 客户端包含所有 Brook Plus 客户端的功能,所以也可以通过编程实现任意的网络需求。
我们先看一下公司采用 OpenVPN 方案时员工电脑的网络拓扑:

现在将 OpenVPN 方案替换掉。员工只需要使用 Shiliew 客户端即可,我们先看一下网络拓扑:

公司侧
首先在公司的接入服务器上部署 brook server,很简单只需一行命令(daemon 可以用 joker 或 z 或其他喜欢的工具):
brook server --listen :9999 --password hello
然后生成一个 brook link(假设公司服务器的外网 IP 是 1.2.3.4)
brook link -s 1.2.3.4:9999 -p hello --name '起个名字'
会输出一个 brook link, 类似 brook://...,可以将这个 brook link 给员工
员工侧
默认 Shiliew 开启了如下模块,如果想了解更多可以阅读 Brook Docs:

现在我们需要增加一个模块,这个模块来定义 brook link,url 留空即可

// 在运行时之前定义多个 Server,并在运行时通过 brooklinkkey 选择使用哪一个
modules = append(modules, {
brooklinks: func(m) {
return {
"company": "brook://...替换为公司提供的..."
}
}
})
假设要访问的公司的服务有:
- www.company.com:443
- 192.168.9.10:80
- 192.168.9.11:3306
- 192.168.9.12:6379
⚠️ 如果你是用的 Shiliew macOS 客户端,有两个模式:TUN 模式和 App 模式,默认是 TUN 模式,建议使用默认 TUN 模式。App 模式针对传输层协议有再加工,可以让你看到每个请求是哪个 App 发起的,也可以基于 App 编程控制网络,但是对于这种场景下某些协议有不兼容(已知 Mysql),当然如果你所访问的服务协议没有不兼容的情况下也可以选择 App 模式。
然后再添加一个模块,这个模块让访问以上服务时,通过公司提供的 brook link 走公司的 brook server 进入公司网络来访问,url 留空即可

modules = append(modules, {
address: func(m) {
if m.domainaddress {
if m.domainaddress == "www.company.com:443" {
return {brooklinkkey: "company"}
}
}
if m.ipaddress {
l := [
"192.168.9.10:80",
"192.168.9.11:3306",
"192.168.9.12:6379"
]
for v in l {
if m.ipaddress == v {
return {brooklinkkey: "company"}
}
}
}
}
})
因为模块是顺序匹配的,直到某个模块处理为止,所以需要调整一下新建的两个模块的顺序到上面一些:

然后断开重连即可。
解决方案之公司侧进阶版
简单情况下,根据以上方案,公司可以运行一个 brook server,然后把这个 brook server 的 brook link 给每一个员工即可。事情就解决了。
如果公司想控制不同员工对 brook server 的访问权限,比如想单独停掉某个员工的 brook server,以上共用一个 brook server 的方案就不可行了,一停就都停了,对吧。所以可以运行多个 brook server,如果都在一个服务器上则每个 brook server 监听不同的端口和使用不同的密码,然后给不同的员工不同的 brook server 就可以了。
如果公司想控制员工通过 brook server 可访问的服务,比如只允许访问某些服务,或不允许访问某些服务,则可以用 brook --script 来实现精细控制,参考文档:Brook Docs,参考示例:Brook Script Gallery。
一般以上就可以满足需求了,如果公司有编程能力想要更多控制,brook link --token 参数可以指定用户标识,brook server 需要搭配 brook --userAPI 使用。参考文档:user.md,参考实现:brook-store。