前言

放假在家,连接学校内网需要使用深信服家的 EasyConnect ,我偶尔需要连接学校的服务器或者访问内网网页,便打算下载使用。

但是!!!EasyConnect 这个软件比较流氓,也就是常说的毒瘤软件。我便开始寻找起了应对方法。

在 macOS下,EasyConnect 主要有以下行为:

  1. 后台常驻进程 EasyMonitor 和 ECAgentProxy,且都以 root 权限运行;
  2. 自动安装根证书,包括系统根证书与 FireFox 的根证书,且在删除后会重新安装。

ps:以 root 权限常驻进程,意味着这些进程可以读取和写入任何东西;安装根证书,意味着可以直接进行中间人攻击,随意篡改数据。

法1

该方法适合已安装 EasyConnect 的电脑,最少折腾。

  1. 使用 sudo su 获取管理员权限;

  2. 删除(rm)

    /Library/LaunchDaemons/com.sangfor.EasyMonitor.plist;

  3. 删除 /Library/LaunchAgents/com.sangfor.ECAgentProxy.plist;

  4. 重新启动 Mac;

  5. 打开钥匙串,删除系统钥匙串-系统-证书下面的证书(关键词 sangfor)。

注意一定要 先重启Mac再删除证书 ,因为在后台的 EasyMonitor 进程会在证书被删除后自动导入。

这样就消除了 EasyConnect 的问题。但是,目前为止会导致 EasyConnect 不能连接,因此我们需要用安全的方式启动 EasyConnect。可以编写两个脚本实现启动和退出。

startEasyConnect.sh

1
2
3
4
#! /bin/bash

/Applications/EasyConnect.app/Contents/Resources/bin/EasyMonitor > /dev/null 2>&1 &
/Applications/EasyConnect.app/Contents/MacOS/EasyConnect > /dev/null 2>&1 &

killEasyMonitor.sh

1
2
3
4
5
#! /bin/bash

pkill EasyMonitor
pkill ECAgent
pkill ECAgentProxy

将上述两个脚本放到 PATH 路径下,并给予可执行权限:

1
2
chmod +x startEasyConnect.sh
chmod +x killEasyMonitor.sh

在需要使用 EasyConnect 时,使用 普通用户 身份执行 startEasyConnect 命令(EasyMonitor 进程就没有权限导入根证书了)。退出 EasyConnect 后,执行 killEasyMonitor 杀掉后台的 EasyMonitor 进程即可。

法2(推荐)

适合还未安装 EasyConnect 的情况下,并且具有一些Docker知识,不怕麻烦的。(正在使用)

安装Docker

2022.12.05 更新:

推荐macOS用户使用Colima安装docker运行环境,点击查看

Windows

macOS

安装Clash

Windows

macOS也可以安装 ClashX 或者 ClashX Pro 版本

安装VNC Viewer(可选)

如果你用的 EasyConnect 需要 图形界面登录的话,就需要安装 VNC Viewer,否则可以跳过这一步。

如果不知道可以先不装,到后面用 Docker 运行 EasyConnect 的时候提示你不能在命令行界面完成再返回这一步安装。

VNC Viewer 的安装非常简单,到官网的 下载 页面,选择相应的版本下载,然后一路下一步就完成了。

安装文本编辑器

因为涉及到 yaml文件 的编辑修改,你可能需要安装一个 VSCode ,不使用记事本的原因是它不带高亮,没有单词拼写提示也不会自动调整格式,可能会导致你有一些缩进、拼写和标点等方面的错误比较难发现。

VSCode是免费的,这里再推荐一个软件:Sublime Text(付费)。

使用 Docker 运行 EasyConnect

首先确保你的 Docker 是运行状态(可以输入 docker ps -a 测试一下)。打开终端,根据是否需要图形化界面输入不同的命令。

2022.12.29更新:

本人是Intel机型的MacBook,根据评论区老哥的提醒,下面的教程并不适用于苹果自研M系列芯片,即arm架构机器。

由于我没有M芯片的机器,如果需要请自行尝试编译 non-amd64 分支文件,详见issue167。如果在编译过程中遇到新的问题,可以多看看其他人提的issue。

纯命令行版(推荐):

1
2
3
touch ~/.easyconn
docker pull hagb/docker-easyconnect:cli
docker run --device /dev/net/tun --cap-add NET_ADMIN -v $HOME/.easyconn:/root/.easyconn -it -p 127.0.0.1:1080:1080 -p 127.0.0.1:8888:8888 -e EC_VER=7.6.3 -e CLI_OPTS="-d vpn.xxx.edu.cn -u USERNAME -p PASSWORD" hagb/docker-easyconnect:cli

下面对命令进行解释:

  • 第一行,我们在当前用户的 $HOME 目录下创建了一个配置文件,用来保存登录信息。

  • 第二行,拉取我们需要的docker镜像到本地。

  • 第三行,我们启动了一个 Easy­Con­nect 命令行版 Docker 容器:

    • --device /dev/net/tun --cap-add NET_ADMIN 创建了虚拟网络设备;

    • -it 返回一个交互式终端,用来显示信息;

    • -v 指定挂载卷,我们将当前用户 $HOME$ 目录下的配置文件映射到容器内,实现登录信息的持久化;

    • -p 指定容器的端口映射,可以根据实际情况更改端口号。其中 1080 是 Socks5 代理端口,8888 是 HTTP 代理端口;

    • -e EC_VER 设置容器内环境变量 EC_VER 的值,指定 Sangfor 的版本,最好和服务端一致;

    • -e CLI_OPTS 设置容器内环境变量 CLI_OPTS 的值,指定运行 Sangfor 时的参数。这里的 -d 指定 VPN 地址,-u 指定用户名,-p 指定用户的密码。这些信息请 自行修改正确

    • -e IPTABLES_LEGACY=1 使用旧式的 iptables 命令,主要目的是和 WSL 保持兼容。在部分发行版的 WSL 版本上,缺少了这个环境变量会使得 VPN 不能正常运行。(非必要不选)

      2022.12.09 更新:

      建议增加容器自动重启选项,方便开机自启:

      • 已安装:

        在原容器的基础上使用update命令更新参数即可。

        1
        2
        3
        
        docker ps -a
        docker update --restart=always 容器ID
        docker restart 容器ID
        
      • 未安装:

        直接在上面命令的基础上加上--restart参数即可。

        1
        
        docker run --restart=always --device /dev/net/tun --cap-add NET_ADMIN -v $HOME/.easyconn:/root/.easyconn -it -p 127.0.0.1:1080:1080 -p 127.0.0.1:8888:8888 -e EC_VER=7.6.3 -e CLI_OPTS="-d vpn.xxx.edu.cn -u USERNAME -p PASSWORD" hagb/docker-easyconnect:cli
        

      2022.12.07 更新:

      如果在运行完上述命令后 docker容器保持在运行状态 ,我们需要Ctrl + C手动停止运行后,

      1
      2
      3
      4
      
      # 找到容器ID
      docker ps -a
      # 重新运行容器
      docker start 这里填写easyconnect容器ID
      

      2022.09.05 更新:

      这个参数建议先删除,如果不能正常运行,再加上。

      macOS Catalina系统下我测试添加此参数后账号将不能自动登录,建议删除。删除后一切正常。

具体的参数设置请参考:usage.md

图形界面版:

1
2
docker pull hagb/docker-easyconnect:7.6.3
docker run --device /dev/net/tun --cap-add NET_ADMIN -ti -e PASSWORD=xxxx -v $HOME/.ecdata:/root -p 127.0.0.1:5901:5901 -p 127.0.0.1:1080:1080 hagb/docker-easyconnect:7.6.3

其中 hagb/docker-easyconnect:7.6.3 表示使用 7.6.3 版本的 EasyConnect,请根据实际情况修改版本号。

ps:当你的 5901 或者 1080 端口被其他服务占用时,可以通过如下命令更改我们上面用 docker 运行的 EasyConnect 的端口(以纯命令行版举例,图形界面版也是一样的);

127.0.0.1:15901:5901 和 127.0.0.1:10180:1080中的 15901 和 10180 各位可以随意修改成自己没有被占用的端口。

1
docker run --device /dev/net/tun --cap-add NET_ADMIN -ti -e PASSWORD=xxxx -v $HOME/.ecdata:/root -p 127.0.0.1:15901:5901 -p 127.0.0.1:10180:1080 hagb/docker-easyconnect:7.6.3

图形化 VNC Viewer 连接

输入完之后打开 VNC Viewer,点击左上角的 File -> New connection,或者在空白处 右键 -> New connection,或者使用快捷键 Ctrl + N,新建一个链接,在弹出的对话框中的 VNC Server 中填入 127.0.0.1:5901 ,Name 可以不填。

VNC Viewer

点击 OK 后,双击我们刚刚创建好的链接,输入密码 XXXX,就可以进行连接了,进去之后是熟悉的界面,输入地址,用户名和密码之后就可以关掉了。

在 Docker 中运行的 EasyConnect 都不用输验证码,更加方便。

同时由于这个项目本身是会记住你输入的服务器地址的,所以以后使用的时候只需要点一下登录按钮就可以了。

进行到这一步,就会有一个 socks5 代理跑在你电脑的 1080 端口 了,接下来就是配置 Clash,在我们需要的时候进行转发。

配置 Clash

2022.12.07 更新:

可以直接创建一个新的配置文件,以免配置更新导致失效。ClashX同理,文件内容可以参考下面:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
port: 7890
socks-port: 7891
allow-lan: true
mode: Rule
log-level: info
external-controller: :9090
proxies:
  - {name: vpn, type: socks5, server: 127.0.0.1, port: 1080}
proxy-groups:
  - name: 校园网
    type: select
    proxies:
      - vpn
rules:
  - IP-CIDR,172.20.2.0/24,vpn

这一小节讲述如何让你在需要的时候使用 EasyConnect 的 VPN 服务。

首先运行 Clash,点击左侧导航栏的 Profiles ,你会看到一个默认的 config.yaml ,如果你有其他配置文件也可以编辑其他配置文件。点击你想编辑的配置文件右边的形如 < > 的按钮,意思就是在文本编辑器中编辑配置文件,在最后增加:

1
2
3
4
5
6
7
# 增加一个名字是 vpn 的 sock5 代理
proxies:
	- {"name": "vpn", "type": "socks5", "server": "127.0.0.1", "port": "1080"}

# 添加 ip-cidr 的规则
rules:
	- IP-CIDR,222.192.6.0/24,vpn

注意事项:

这里填写的 222.192.6.0/24 是指只有访问 222.192.6.xxx 的流量才会走上面配置的那个代理,需要根据你的实际情况进行更改。

当然,你如果是编辑你自己的机场配置文件,是需要在原来的 proxiesrules 下新增上面内容,而不能再新增这两个属性

到这一步,在 Clash 的 General 页面,将 System Proxy 打开,你就已经可以访问学校内网了,但是不可以使用远程桌面等功能,如果需要使用这些功能,还需要进一步配置。

配置 ClashX

与上面类似:

1
2
3
4
5
proxies:
	- { name: 'vpn', type: socks5, server: 127.0.0.1, port: 1080 }

rules:
	- 'IP-CIDR,172.20.2.0/24,vpn'

配置 TUN 模式

对于 TUN 模式,官方文档是这么描述的:

对于不遵循系统代理的软件,TUN 模式可以接管其流量并交由 CFW 处理,在 Windows 中,TUN 模式性能比 TAP 模式好。

浏览器之类的应用都是使用系统代理的,一些非系统代理应用,可以通过设置被 CFW 接管。总之,配置 TUN 模式之后,我们的需求就可以实现了,启动 TUN 模式需要进行如下操作(MacOS 用户跳过前两步):

  1. 打开 Clash 的 General 页面,找到 Home Directory,点击右边的 Open Folder 打开 Home Directory 文件夹;
  2. 进入网站 Wintun ,点击界面中 Download Wintun xxx 下载压缩包。根据系统版本将 wintun-x.xx/wintun/bin 对应目录中 wintun.dll 复制至 Home Directory 目录中。基于 x64 的处理器的 64 位操作系统请使用 amd64 版本,M1 版本的 Mac 选择 arm64 版本;
  3. 点击 General 中 Service Mode 右边 Manage,在打开窗口中安装服务模式,安装完成应用会自动重启,Service Mode 右边地球图标变为绿色即安装成功;
  4. 点击 settings -> Profile Mixin -> YAML,点击 YAML 右侧的 Edit,输入下面的内容,点击右下角的按钮保存。
 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
35
36
37
38
39
40
41
42
mixin: 
  hosts:
    'mtalk.google.com': 108.177.125.188
    'services.googleapis.cn': 74.125.203.94
    'raw.githubusercontent.com': 151.101.76.133
  dns:
    enable: true
    default-nameserver:
      - 223.5.5.5
      - 1.0.0.1
    ipv6: false
    enhanced-mode: redir-host #fake-ip
    nameserver:
      - https://dns.rubyfish.cn/dns-query
      - https://223.5.5.5/dns-query
      - https://dns.pub/dns-query
    fallback:
      - https://1.0.0.1/dns-query
      - https://public.dns.iij.jp/dns-query
      - https://dns.twnic.tw/dns-query
    fallback-filter:
      geoip: true
      ipcidr:
      - 240.0.0.0/4
      - 0.0.0.0/32
      - 127.0.0.1/32
    domain:
      - +.google.com
      - +.facebook.com
      - +.twitter.com
      - +.youtube.com
      - +.xn--ngstr-lra8j.com
      - +.google.cn
      - +.googleapis.cn
      - +.gvt1.com
  tun: 
    enable: true
    stack: gvisor
    dns-hijack:
      - 198.18.0.2:53
    macOS-auto-route: true
    macOS-auto-detect-interface: true # 自动检测出口网卡
  1. 返回 general 页面开启 Mixin 即可,之后点击 connections 会发现所有连接都是 TUN 模式,这时候我们就完成了所有配置。

更详细的配置可以参考官方文档的 TUN 模式 页面。

过滤应用

相关规则可以参考:

 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
proxies:
  - name: "officeVpnProxy"
type: "socks5"
server: "127.0.0.1"
port: "10180"
proxy-groups:
# programs
  - name: "programs"
type: select
proxies:
  - "DIRECT"
  - "PROXY"
rules:
# programs
  - PROCESS-NAME,vpnkit.exe,programs
  - PROCESS-NAME,vpnkit-bridge.exe,programs
  - PROCESS-NAME,com.docker.dev-envs.exe,programs
  - PROCESS-NAME,com.docker.backend.exe,programs
  - PROCESS-NAME,com.docker.extensions.exe,programs
  - PROCESS-NAME,com.docker.proxy.exe,programs
  - PROCESS-NAME,com.docker.service,programs
  - PROCESS-NAME,com.docker.wsl-distro-proxy.exe,programs
  - PROCESS-NAME,Docker Desktop.exe,programs
  - PROCESS-NAME,docker.exe,programs
  - PROCESS-NAME,wsl.exe,programs
  - PROCESS-NAME,wslhost.exe,programs

注意:其中的 port 要对应你前面配置 docker 配置的端口,需要对应起来。

再次启动

当你关掉终端窗口,或者重启电脑,想再次启动 Docker 时,我们只需要启动相应的容器,并且在 VNC Viewer 中点击登录就可以(如果你不使用图形界面的话只需要启动容器)。

启动容器的操作就不用再去打上面创建容器时的那一串命令了,因为那一串命令的意思是创建容器、下载镜像、启动并进入容器,我们已经创建好了容器,以后只需要启动就行了。所以,我们先要知道我们有哪些容器,然后启动相应的容器就可以。

首先,查看我们已有的容器:

1
docker ps -a

你应该会得到类似的输出,如果你是第一次使用 Docker,应该只有一个容器

docker container

当电脑重启之后又想开启它的时候,只需要输入:

1
docker start 81f

就可以了,其中 81f 是我要启动的容器的 ID 也就是第一列的值,这个值很长,通常你只需要输入前几位就可以,或者也可以通过 docker rename 命令修改。

1
docker rename OLDNAME NEWNAME

卸载 EasyConnect

前面说道,EasyConnect 的流氓之处之一就是非常难卸载,但是我还是根据网上的资料和我自己操作的经验总结出一套方法,这一套方法可能略显复杂,可能有多余的操作,不过按照这样操作是可以将 EasyConnect 完全卸载干净的。

首先,找到 EasyConnect 的安装目录,双击运行他的卸载程序,等他运行完之后你会发现,这个目录并没有被完全删掉,还是有很多文件,这时候我们执行下列步骤:

  1. 全选 Shift + Delete,如果遇到不给删的就跳过,这时候还是会剩下很多文件。
  2. 断网重启电脑,来到安装目录下,把所有文件夹都改名,随便改成什么,再次重启
  3. 全选刚刚改过名的文件夹 Shift + Delete,如果这时候还删不了就把文件夹剪切到别的地方再删除
  4. 重启电脑,管理员权限打开命令行(如果你没有常用的命令行工具可以 Win + X 选择 Windows PowerShell(管理员)
  5. 输入命令 netsh winsock reset 回车

最后两步重置 winsock 非常重要,如果不执行很可能会出现各种客户端无法连接网络的情况。

如果卸载之后发现还有 sanfor 这个服务可以参考 这篇文章 尝试解决。

效果

查看已经创建的docker容器,可以发现 docker-easyconnect:cli 字样。

docker container

我是配合ClashX Pro使用,效果很不错,需要的时候直接切换到对应配置即可。

配置样式

感谢

docker-easyconnect

Soulike

Jortana

Nativus