本文最后更新于 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服务
| 12
 
 | sudo apt install shadowsocks-libev
 
 | 
随后修改配置文件,通常位于/etc/shadowsocks-libev/config.json ,示例配置如下
| 12
 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"
 }
 
 | 
启动服务
| 12
 3
 
 | sudo systemctl start shadowsocks-libevsudo systemctl enable shadowsocks-libev
 sudo systemctl status shadowsocks-libev
 
 | 
访问shadowsocks服务
使用clash测试刚搭好的shadowsocks服务
你只需编写如下的配置文件,导入到clash中
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | port: 7890socks-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的匹配是从上到下进行的,开头的配置优先级最高)
| 12
 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服务的话,可以使用我们提供的:
| 12
 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系统
使用下面的指令查看路由规则
你可以看到一大坨路由规则,下面拿几行分析一下
| 12
 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,只需要下面的配置,就能让流量按照我们设想的路径发送:
| 12
 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运行
| 12
 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脚本一键运行
| 12
 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