# GoAgent (简体中文)

GoAgent 是使用 Python 和 Google App Engine SDK 编写的免费代理软件，利用 Google App Engine 充当代理服务器。

GoAgent 的运行原理于其他代理工具基本相同，其借由 Google App Engine 的服务器作为中传，将数据数据包后传送至 Google 服务器，再由 Google 服务器转发至目的服务器，接收数据时方法也类似。相对其他代理工具而言 GoAgent 要稳定许多。

## 安装

官方软件源已收录 goagent，直接用 pacman 安装即可.

## 配置

### 服务器端

申请 Google Appengine 并创建 appid 。具体教程可参考此。

注意: appid请勿包含android/ios等关键词，否则有可能被某些网站识别为移动设备用户。

上传(使用root用户，否则会出现权限不够的问题）：

    # python2 /usr/share/goagent/server/uploader.py

注意: 原来的uploader.zip在新版本已经不存在了，代替它的是uploader.py。如出现不能上传的情况可以去github上git下来用里面的那个uploader.py试试
注意: 无效的 hosts 可能会导致上传失败，可尝试清空 `/etc/resolv.conf` 再上传。 将来的版本更新可能会要求重新上传。请参看官方的更新历史，带有[是]标记的则需要重新上传。此外是否需要重新上传是相对于前一版的，若您之前版本与当前版本之间某一版或多版带有[是]仍然需要重新上传
提示: 首次上传后，可以再任意修改 Appid，无需再重新上传，不过最好重启以生效

执行时会要求您再输入 appid ，请保持与 `proxy.ini` 中已有的一致；接着还要输入 Google 邮箱及密码。

注意: 若您的 Google 账户有开通两步验证功能，则密码应为16位的应用程序专用密码。

至此，代理服务器 127.0.0.1:8087 已搭建完毕。现在以 Chrome/Chromium 为例，示范使用代理服务器的方法。

注意: 若浏览器类软件要通过 GoAgent 代理访问 Internet，可能均需要导入证书

### 客户端

提示: goagent 3.1.2-2 引入了用户配置文件(goagent.user.ini), 配置方法有所变动. 如果您是从旧版本升级, 可以在按照如下方法配置后放心删除以前的 /etc/goagent.pacsave. 此次变动之后, 您将不再需要在每次升级后合并该配置文件.

打开 `/etc/goagent` (默认情况下该文件为空), 增加类似下面的段落:

    [gae]
    appid = your_appid
    password = yourpassword

修改 `your_appid` 为您所申请的 appid。如果您申请了多个 appid 用于负载均衡, 用竖线 | 分隔多个id (不含空格). 如果您使用的服务端没有配置密码, 可以省略掉 `password =` 开头的一整行.

goagent 3.1.5-1 新增 dnsproxy 功能, 基本配置依然是修改 `/etc/goagent` 文件, 加入类似以下内容:

    [dns]
    enable = 1
    listen = 127.0.0.1:5353

如果希望 DNS 服务跑在 53 端口, 需要使用 root 用户运行服务. 新增 `/etc/systemd/system/goagent.service.d/use_root.conf` 文件, 加入以下内容即可:

    [Service]
    User=root

#### Chrome/Chromium

请安装 SwitchySharp 插件，接着导入该设置。可参考该扩展提供的图解流程。

打开设置－管理证书－授权中心－Authorities，导入 `/usr/share/goagent/local/CA.crt`，弹出窗口的三条选项均勾选。

注意: 如果第一次安装 GoAgent 尝试到此步骤时发现该文件不存在，请先启动一次 GoAgent 后再重新尝试。

#### 亚全局

在 Unix 和 GNU/Linux 中，大多 HTTP 应用程序均支持调用环境变量 `http_proxy` 和 `https_proxy` 进行代理，就像 lynx、 wget 和 curl，甚至也包括了 Chromium (简体中文) 和 git (简体中文)。此外该环境变量的大小写其实并没有统一标准，有个别程序就只支持全大写的环境变量。所以为方便起见，直接在 `~/.bash_profile` 或 `~/.zshenv` 添加以下即可：

    export http_proxy=http://127.0.0.1:8087/
    export https_proxy=$http_proxy
    export HTTP_PROXY=$http_proxy
    export HTTPS_PROXY=$HTTP_PROXY

注意: 虽然 Chrome 浏览器也可以通过其环境变量进行全局代理从而不再需要 Proxy Extension，但不建议这么做，因为会导致访问国内网站的速度下降，甚至个别网站就拒绝境外代理访问，例如收录了大量版权视频的网站。

再执行以下命令，以导入证书进 Arch Linux。至此，就可以实现 Arch Linux 亚全局代理：

    # ln -s /usr/share/goagent/local/CA.crt /etc/ca-certificates/trust-source/anchors/GoAgent.crt
    # trust extract-compat

2014-12-11 官方发布新闻证书导入采用新方法。若在此之前导入过证书，请进行清理：

    # rm -fr /usr/share/ca-certificates/goagent
    # rm -fr /etc/ca-certificates/conf.d

## 运行

### 以 daemon 形式运行 (推荐)

    # systemctl start goagent

若想开机自启动，执行：

    # systemctl enable goagent

提示: 可通过`# journalctl -u goagent`来查询日志

#### 屏蔽日志输出

如果不想让 GoAgent 的输出信息进入日志，可以通过屏蔽 goagent.service 里的对应行解决，方法如下：

1. 创建目录 `/etc/systemd/system/goagent.service.d`

2. 创建文件 `/etc/systemd/system/goagent.service.d/nostdout.conf`, 写入如下内容:

    [Service]
    StandardOutput=null

#### 日志输出至TTY

如果不想让 GoAgent 的输出信息进入日志，但是又想得到 GoAgent 的运行情况，可以通过修改 goagent.service 里的对应行解决，方法如下：

1. 创建目录 `/etc/systemd/system/goagent.service.d`

2. 创建文件 `/etc/systemd/system/goagent.service.d/totty.conf`, 写入如下内容:

    [Service]
    StandardOutput=tty
    StandardError=tty
    TTYPath=/dev/ttyX #X为数字，ttyX不能正在被使用，推荐为1-12之间的整数，用Ctrl+Alt+FX切换至
    #TTYVTDisallocate=yes #若需要在启动前清理所在TTY的虚拟终端，取消本行前的注释

3.运行：

    # systemctl daemon-reload && systemctl restart goagent

### 手动运行(不推荐+不支持)

由于不明原因，总有个别用户无法成功以 daemon 形式运行GoAgent，可改试手动运行：

    $ sudo -u nobody python2 /usr/share/goagent/local/goagent

若是在更新后发生问题，可尝试清空`/usr/share/goagent/local/certs`目录，甚至卸载并手动删除`/etc/`和`/usr/share/`下的有关文件，然后重新安装和配置。

## 疑难解答

### Firefox 31.0 及以上版本提示安全连接失败：证书包含未知的关键扩展。

从 Firefox 31.0 开始默认使用新的 mozilla::pkix 为证书验证库。GoAgent 证书已被证实和此证书验证机制不兼容。新证书认证会导致提示“安全连接失败：证书包含未知的关键扩展。 （错误码： sec_error_unknown_critical_extension）”。解决的方法有两种，推荐使用解决方法 1 。

#### 解决方法 1 （推荐）

##### 重新生成新的 GoAgent 证书

取得 Root 权限并执行以下命令：

     # rm /usr/share/goagent/local/CA.crt
     # rm -rf /usr/share/goagent/local/certs
     # systemctl restart goagent

##### 在 Firefox 中导入新证书

在 Firefox 中点击右上角的菜单按钮（三道杠），在弹出的菜单中点击“首选项”（齿轮图标），打开首选项页面，点击"高级"-"证书"-"查看证书“，弹出一个新窗口，点击”证书机构“，在列表中找到"GoAgent CA"项并选中该项，点击"删除或不信任"，即完成删除原来的证书。点击"导入"，弹出文件选择窗口，进入目录 /usr/share/goagent/local/ ，选择文件 CA.crt 并点击打开，即完成导入新证书。点击确定关闭弹出窗口，重新启动 Firefox 即可。

#### 解决方法 2

在 Firefox 的地址栏上输入 about:config ，在输入框中输入 security.use_mozillapkix_verification ，在下面的列表中找到该项并双击修改为 false 。

## 参阅

- GoAgent 在 Google Code 的主页
- GoAgent 在 GitHub 的主页
- 两位开发者的 Twitter 帐号：@hewigovens,@phuslu
- 讨论亚全局代理的 Email List

Categories:

- 简体中文
- Networking (简体中文)