本文最后更新于 2025-02-19T06:36:00+00:00
如何解决EasyConnect封锁端口的问题
本文提出一种方法,通过将EasyConnect和clash无缝集成,解决EasyConnect封锁端口的问题,搭建一个能方便地访问校内资源和国外资源的网络环境。
何为封锁端口?中大的EasyConnect会禁止对校园网内绝大多数端口的访问,目前据我所知,只放行22, 80, 443, 3389, 8080这几个端口的流量,也就是说,其他端口的服务(比如说6006端口的tensorboard、20端口的FTP)是无法访问的。
对此,可以在校内运行一个shadowsocks服务,这个服务运行在一个没有被封禁的端口上(比如说3389,如果你没有rdp服务的话),由shadowsocks来转发我们对其他端口的请求。运行shadowsocks服务的机器只需要拥有一个全校可路由的ip地址(如果你有公网ip的话应该就不会用EasyConnect这种流氓软件了)
完成本文的配置之后,本地的流量首先会发往clash(你需要开启TUN模式),clash过滤出其中属于校园网的部分,用shadowsocks协议封装好交给EasyConnect,发往校内的shadowsocks服务器。而不属于校园网的部分,就按照clash原有的规则,选择出国还是直连。
搭建shadowsocks
如果您不想自己搭建shadowsocks,可以跳过这一部分,使用公开的shadowsocks服务
这里使用linux运行shadowsocks服务
1 2
| sudo apt install shadowsocks-libev
|
随后修改配置文件,通常位于/etc/shadowsocks-libev/config.json
,示例配置如下
1 2 3 4 5 6 7 8 9
| { "server":["0.0.0.0"], "mode":"tcp_and_udp", "server_port":3389, "local_port":1080, "password":"xxxxxxxxxxxxx", "timeout":86400, "method":"chacha20-ietf-poly1305" }
|
启动服务
1 2 3
| sudo systemctl start shadowsocks-libev sudo systemctl enable shadowsocks-libev sudo systemctl status shadowsocks-libev
|
访问shadowsocks服务
使用clash测试刚搭好的shadowsocks服务
你只需编写如下的配置文件,导入到clash中
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
| port: 7890 socks-port: 7891 allow-lan: true mode: Global log-level: info external-controller: :9090 proxies: - name: 返校跳板机1 server: <your-shadowsocks-ip-address> port: 3389 type: ss cipher: chacha20-ietf-poly1305 password: <your-shadowsocks-password> udp: true proxy-groups: - name: "返校跳板机集群" type: select proxies: - 返校跳板机1 rules: - IP-CIDR,172.16.0.0/16,返校跳板机集群,no-resolve - IP-CIDR,<其他需要访问的校园网ip>,返校跳板机集群,no-resolve - DOMAIN-SUFFIX,<校内主机的域名>,返校跳板机集群 - DOMAIN-SUFFIX,example.com,返校跳板机集群 - MATCH,DIRECT
|
上面的代码只是一个示例,需要根据你的shadowsocks服务补充必要信息
如果你的clash还有别的配置,可以通过配置rule路由规则,与返校跳板无缝融合:打开其他clash配置文件,找到其中proxies
, proxy-groups
, rules
配置,把新的配置加在开头(clash的匹配是从上到下进行的,开头的配置优先级最高)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| proxies: - name: 返校跳板机1 server: <your-shadowsocks-ip-address> port: 3389 type: ss cipher: chacha20-ietf-poly1305 password: <your-shadowsocks-password> udp: true proxy-groups: - name: "返校跳板机集群" type: select proxies: - 返校跳板机1 rules: - IP-CIDR,172.16.0.0/16,返校跳板机集群,no-resolve - IP-CIDR,<其他需要访问的校园网ip>,返校跳板机集群,no-resolve - DOMAIN-SUFFIX,<校内主机的域名>,返校跳板机集群 - DOMAIN-SUFFIX,example.com,返校跳板机集群 - MATCH,DIRECT
|
使用公开的shadowsocks服务
如果你不想自建shadowsocks服务的话,可以使用我们提供的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| proxies: - name: 返校跳板机 server: 172.18.198.246 port: 3389 type: ss cipher: chacha20-ietf-poly1305 password: g3bxhtTnQ5te udp: true proxy-groups: - name: "返校跳板" type: select proxies: - 返校跳板机 rules: - IP-CIDR,172.16.0.0/12,返校跳板,no-resolve
|
配置本地路由规则
完成上面的配置之后,你可能会发现校内端口封锁的问题并没有解决。原因是流量没有经过clash,直接发往了EasyConnect,你还需要配置本地路由规则
下面的配置方法针对windows系统
使用下面的指令查看路由规则
你可以看到一大坨路由规则,下面拿几行分析一下
1 2 3 4 5 6 7 8
| IPv4 路由表 =========================================================================== 活动路由: 网络目标 网络掩码 网关 接口 跃点数 128.0.0.0 128.0.0.0 198.18.0.2 198.18.0.1 0 172.16.0.0 255.252.0.0 172.22.193.234 172.22.193.230 257 172.20.0.0 255.254.0.0 172.22.193.234 172.22.193.230 257 172.22.0.0 255.255.128.0 172.22.193.234 172.22.193.230 257
|
Clash和EasyConnect都使用了TUN代理,它会创建虚拟网络设备,通过这个虚拟设备来捕获网络流量。clash的网关比较固定,一般是198.18.0.2
,EasyConnect的网关不固定,在这里是172.22.193.234
,一般都以172.22
为开头
可以观察到,clash使用更短的掩码长度和更少的路由规则,覆盖几乎所有ip地址,而EasyConnect使用更长的掩码长度和更多的路由规则,更精细地覆盖校园网网段。我们知道,路由规则采用的是最长前缀匹配,所以EasyConnect的路由规则具有更高的优先级。
如何解决呢?我们可以把clash路由规则的掩码长度增加到32位,它就具有最高的优先级。
如果我们已经在校内运行了shadowsocks服务器(位于172.18.x.1),想要访问主机172.18.x.2,只需要下面的配置,就能让流量按照我们设想的路径发送:
1 2 3 4
| route add 172.18.x.1 mask 255.255.255.255 172.22.193.234
route add 172.18.x.2 mask 255.255.255.255 198.18.0.2
|
给每一台主机配置路由是低效的,你还可以删除掉EasyConnect多余的路由规则,这里只需要编写一个脚本,在管理员模式的cmd运行
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
| import os import re routes = ['172.18.x.1',] txt = os.popen('route print 172.22.*') txt = txt.read() result = re.search(r' 172.22.* (172.22.*) (172.22.*) ',txt) if result: gate = result.group(1).strip() inter = result.group(2).strip() print(f'网关:{gate} 接口:{inter}') txt = os.popen('route print') txt = txt.readlines() for line in txt: result = re.split('[ ]+', line.strip()) if len(result)==5 and result[2].strip()==gate and result[3].strip()==inter: para1 = result[0].strip() print(f'route delete {para1} {gate}') os.system(f'route delete {para1} {gate}') for route in routes: print(f'route add {route} mask 255.255.255.255 {gate}') os.system(f'route add {route} mask 255.255.255.255 {gate}') else: print('找不到EasyConnect的路由规则')
|
写个bat脚本一键运行
1 2 3 4 5
| @echo off %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0" python back_sysu_route.py pause
|
题外话
很多人觉得EasyConnect是一个流氓软件,如果你比较介意这一点,可以尝试在docker中运行easyconnect: https://github.com/docker-easyconnect/docker-easyconnect
另外,还有EasyConnect客户端的开源实现: https://github.com/lyc8503/EasierConnect