最近由于一些一言难尽的原因在一个牛马公司实(mo)习(yu),来公司连接内网之后发现这公司的内网环境及其恶心,下面就来记录一下我是怎么让自己在公司内网的上网体验尽可能流畅的吧。

首先是一些网络之外的东西,在公司里进行网络认证需要用一个叫做 “XX安全助手” 的软件,我开始觉得应该就只是什么用来上网认证的小软件吧,还可以忍一忍。但仔细一看,这个叫 “XX安全助手” 的软件安装包竟然足足有500M,这不仅让我好奇这个 “小而美” 的软件里面到底塞了些什么东西。

然而刚安装完我就后悔了,这东西不仅是一个上网认证软件,更是公司的监控助手,甚至在电脑上注册了两个驱动来读取数据,还会分析电脑系统里安装的软件来定向屏蔽。认证完之后我就开始立即想办法把这个东西删掉,不过删掉这玩意还算简单,删掉文件清一下注册表什么的就可以了。

由于我的日常开发环境都在 Linux 下,于是打算在 Linux 下跑一个 win10 的虚拟机来运行这个软件。本着决不能浪费一点性能的原则,干脆找了一个非常极限的精简版 Win10: https://archive.org/details/tiny-10-NTDEV 。Tiny10 1809 Beta 的ISO镜像只有 900+ MB,小小的就很可爱。最后勉强在 VirtualBox 上跑起来了,由于这个系统实在太过精简了,连中文字体都没有,所以把软件装上去界面除了英文就是乱码。不过摸索了一下也勉强成功在虚拟机上登上认证助手了。

奇怪的鉴权:怎么只堵 HTTP?

众所周知,一般带有认证的 WiFi 不登录都是没法访问任何网站的,打开任何网站都会被强制重定向到认证页面。上文中我在虚拟机里认证完毕后就把虚拟机关了,觉得应该起码会有一定的有效期吧。然而,不到两个小时就上不了网了,也就是说那个XX安全助手的上网认证是带心跳包的。这可怎么办?

正当我再次开启虚拟机尝试重新登一下时,我却突然发现:等会,我浏览器怎么还能上谷歌???于是我再次确定一下上网认证是不是掉了:打开内外的门户系统确实自动跳转到了上网认证页面(页面上会强制用安全助手来认证),但是谷歌同时也能正常打开。打开 Clash 看一眼,发现代理节点还能正常测出来延迟。真是奇了怪了,难不成不登录这个上网认证只会强制跳转 Http 页面?

为了排除电脑原因,我尝试用手机连接公司 WiFi 然后不认证,直接连接我自建的代理节点,竟然真的能连上,也能正常使用。得出结论:这上网认证系统完全是个草台班子。

既然这样那不就好玩了,我在电脑上直接把 Clash 改成全局代理模式,岂不就能直接上网?

理论存在,尝试实践,完全通过!

禁娱乐网站,怎么愉快摸鱼?

公司内网为了防止员工滥用网络来娱乐摸鱼,屏蔽了很多娱乐网站,比如bilibili、网易云、抖音什么的,甚至连淘宝京东都屏蔽。而且经过我的尝试好像不仅仅按域名来匹配网站,还会按照 IP 来进行 TCP 连接重置,跟 GFW 简直如出一辙了。既然这样那就不能简单使用 SNI 伪装来绕过屏蔽了,还是得想办法依靠代理。

因为毕竟是国内网站,走 Clash 的出国节点来代理显然又慢又不优雅。正好我在家里的软路由上搭建了 Tailscale,那就正好可以把流量代理回家里宽带了。

使用 Tailscale 提供的 Exit Node 功能,可以让本机的全部流量转发到虚拟内网中的另一设备上。正好我本来就是在软路由上搭建的,所以不需要额外配置就可以将其设置为 Exit Node,然后就可以愉快上网啦。

然而想法很好,但当我尝试在本机上启动 Tailscale 时,却发现怎么都没法连上 Tailscale 的登录服务器。尝试在公司内网直接打开 Tailscale 后台,发现连接被重置。

不是,这也屏蔽?太不讲武德了吧。

不过还好用代理是可以打开 Tailscale 后台的,既然这样那就想办法让 tailscaled 在启动时走代理来登录就行了。

怎么让它走代理呢?先打开 Clash 的 TUN 模式试了一下,虽然浏览器能打开,但 Tailscale 的日志里仍然报错无法连接。那它有没有能配置代理的地方呢?很遗憾,在翻了半天文档之后也并没有找到。尝试在命令行中 export HTTP_PROXY 再手动启动 tailscaled,仍然不行。研究到这里已经头皮发麻了。

好在功夫不负有心人,在谷歌上翻了半天之后找到了这个帖子,说代理的环境变量要写在 /etc/default/tailscaled 里面才能生效。经过尝试,果然可以了,虽然感觉这样很不优雅。

这里还要提到一点,Tailscale 的 UDP 打洞策略是消极型的。当你尝试访问虚拟网络中的其他设备才会尝试打洞。而且在打洞成功之前,会先使用官方的中转节点。使用 watch tailscale status 可以观察到这一过程。每次我尝试访问家里软路由的时候,重要等个十几秒才能打洞成功,这时命令行里的节点连接状态会由 relay 变为 direct

终于在成功将 Tailscale 的 Exit Node 设置为家里的软路由之后,可以流畅地访问任何摸鱼网站了,就像回家了一样XD

进内网系统,还要反复开关代理?

因为访问在公司访问内网系统肯定是得直连的,但开了 Exit Node 就没法直连公司的一些内网 IP 了。之后我又翻了一下 Tailscale 的文档想找找 Exit Node 能不能配置白名单什么的,但是也很遗憾并没有找到这个功能。

这样每次访问公司内网系统的时候就只能暂时把 Tailscale 关掉了,然后想访问外网又得把 Clash 打开。这样来来去去一会要动 Clash,一会又要动 Tailscale,烦死了。最后我终于下定决心搞一个统一的解决方案,让我在公司的网络环境下能同时访问内网系统、娱乐网站和谷歌。

怎么做呢?琢磨了老半天决定先从 Clash Verge 下手。它的 Fake IP 特性和远程 DNS 是导致我开了 Clash 就没法访问内网系统的一个关键原因。既然这样那就先把他们解决掉吧。

这一步实际上改了三个东西:

  1. 使用 Clash 的配置文件覆写功能,可以让公司的域名不进行 fake-ip 映射。

    参考 Mihomo 的文档:https://wiki.metacubex.one/config/dns/#fake-ip-filter ,覆写 fake-ip-filter 字段为公司的域名后缀即可。然而改完之后发现解析不了了,经过研究发现内网系统的 IP 只能走内网 DNS 解析。

  2. 那就继续覆写 DNS 配置。参考 https://wiki.metacubex.one/config/dns/#nameserver-policy ,让公司的域名都走指定的内网 DNS 来解析。

  3. 能解析了,但是发现内网 IP 明明是 10.x 开头的却走了代理策略组,那就在加一条 IP-CIDR 规则让它们走直连吧。

需要修改的DNS配置和规则大概这些:

1
2
3
4
5
6
7
8
9
10
dns:
use-system-hosts: true
fake-ip-filter:
- '*.company.com'
nameserver-policy:
# 内网 DNS
'+.company.com': 10.123.123.123

rules:
- DOMAIN-SUFFIX,company.com,DIRECT

改完以上内容之后就可以在 Clash 的 TUN 模式下同时访问内网系统和谷歌了,那娱乐网站怎么办呢?

别急,这不是还有 Tailscale 没用上嘛。我之前已经在家里的软路由上跑了 OpenClash 的当透明代理,通过 Tailscale 可以完美访问 OpenClash 的代理端口。那这样干脆给 Clash Verge 加一个 socks5 节点,然后再写规则来让娱乐网站走这个节点吧。

使用扩展脚本功能来新增 socks5 节点:

1
2
3
4
5
6
7
config.proxies.unshift({
"name": "HomeOpenClash",
"type": "socks5",
"server": "10.0.0.1", // 软路由IP
"interface-name": "tailscale0", // 节点对应接口
"port": 7891 // OpenClash 代理端口
});

这里需要特别注意 interface-name 配置要写 Tailscale 的接口设备名,否则 Clash 在连接这个节点时是不会使用 Tailscale 网络的。

然后来写策略组:

1
2
3
4
5
6
7
8
config["proxy-groups"].unshift({
"name": "HomeGroup",
"type": "select",
"proxies": [
"HomeOpenClash",
"DIRECT"
]
});

预留一个 DIRECT 出口备用,又不是每次都会在公司里用 Clash。

然后来添加娱乐网站的代理规则,这里使用了 ACL4SSR 提供的现成规则,添加了网易云和 Bilibili 的规则组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 添加娱乐网站的 RuleSet
config["rule-providers"] = {
ncm: {
"type": "http",
"url": "https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/NetEaseMusic.list",
"interval": 600,
"proxy": "Master",
"behavior": "classical",
"format": "text"
},
netease: {
"type": "http",
"url": "https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/NetEase.list",
"interval": 600,
"proxy": "Master",
"behavior": "classical",
"format": "text"
},
bilibili: {
"type": "http",
"url": "https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/Bilibili.list",
"interval": 600,
"proxy": "Master",
"behavior": "classical",
"format": "text"
}
};

// 指定其对应的策略组
config.rules.unshift(
"RULE-SET,ncm,HomeGroup",
"RULE-SET,netease,HomeGroup",
"RULE-SET,bilibili,HomeGroup"

之后保存一下,没问题的话代理页面就会出现 HomeGroup 的策略组了。选择 HomeOpenClash 之后,所设定的娱乐网站的流量就会代理到家里宽带,之后就可以愉快地使用摸鱼网站了。

开摸!

在进行了上面的配置之后,如果发现牛马公司还屏蔽了其他想访问的网站,还是需要往 Clash 增加新的规则集,这样还是多少有点麻烦了。

但是,如果你足够聪明的话,就可以想到:直接打开 Clash 的全局模式,让全部流量都走 HomeOpenClash 不就行了?没错!的确可以!


但无论怎么样总还是感觉不太优雅?算了,能用就行,先摆为敬!


一些题外话

其实自从顺利毕业上岸之后好像就感觉没什么搞技术的动力了,博客也是一拖就四个月没更新了。最近出来实习(白打工)以及在学校遇到了一些事情,又让我有一些陷入了迷茫,对于自己的未来路线也仍然还在犹豫,究竟哪一天才能找到自己真正喜欢的事情并且实现经济独立呢。