EasyConnect-port

如何解决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
route print

你可以看到一大坨路由规则,下面拿几行分析一下

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
# clash发出的流量送往easyconnect
route add 172.18.x.1 mask 255.255.255.255 172.22.193.234
# 特定主机的流量送往clash
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
# 代码出自https://blog.csdn.net/hizcard/article/details/107095362
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


EasyConnect-port
https://blog.algorithmpark.xyz/2025/02/19/easyconnect-port/
作者
CJL
发布于
2025年2月19日
更新于
2025年2月19日
许可协议