Trojan 在 Debian 上的基础安装与配置
此篇教程将会介绍如何在 Debian 环境下进行基础 Trojan 安装与配置。

此篇教程将会介绍如何在原生纯净 Debian 10 环境下进行最简单最基础的 Trojan 安装与配置。同时,本篇教程将会使用 letsencrypt 作为 CA。

安装 Trojan

Trojan 在 Debian 上可以通过 apt 直接从 Debian 源安装。您如果想要自定义安装的话,也可以选择手动编译。本教程仅会覆盖从源安装的方法。

1
sudo apt install trojan

配置 SSL/TLS 证书

获取 SSL/TLS 证书

有许多种可以在 Debian 上获取 SSL/TLS 证书的方法,其中效率最高、性价比最高的方法个人认为是 letsencrypt. 本篇将介绍利用 letsencrypt 获取证书的方法。

首先我们需要安装 certbot 包。certbot 将会协助我们在系统上验证域名所有权,获取证书并部署证书。

1
sudo apt install certbot

安装完 certbot 之后我们就可以开始获取证书了。在获取证书之前,certbot 首先会验证您域名的所有权,也就是通过各种方式来验证您是否是对希望申请证书的域名拥有合法的完全控制。certbot 提供多种验证方式,此篇教程中仅会介绍最基础的默认验证方式。

certbot 具体语法是:

1
sudo certbot certonly --agree-tos --standalone --no-eff-email -m 【您的邮箱】 -d 【域名】

比如,如果我们想要注册 node.flexio.org 的域名,那么我们就需要执行以下命令:

1
sudo certbot certonly --agree-tos --standalone --no-eff-email -m example@k4yt3x.com -d node.flexio.org

注册成功后显示的消息大致如下:

1
2
3
4
5
6
7
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for node.flexio.org
Cleaning up challenges
Problem binding to port 80: Could not bind to IPv4 or IPv6.

如果您希望同时也给网页服务器配置证书的话,也可以选装 python3-certbot-apache 或者 python3-certbot-nginx 等包,并把文中 certbot 命令中的 certonly 去掉。

更改证书权限

如果不更改 letsencrypt 的权限并且 Torjan 以 nobody 权限运行,那么 Trojan 进程将会无法读取证书,也就无法启动。这个问题有多种解决方案,这篇教程将会介绍两种解决方案。

1. 创建独立服务用户

我们可以给 Trojan 创建一个独立账户,并给这个账户访问证书的权限。

在 Linux 系统上,实现这个效果的逻辑为:

  1. 创建一个没有 home 目录并且不能登录的服务用户
  2. 创建一个用户组 certusers
  3. 将 trojan 添加进 certusers 组
  4. 将 /etc/letsencrypt 拥有组设置为 certusers
  5. 在服务账号需要访问文件的上级目录上设置 passthrough 权限
  6. 让 certusers 用户组拥有读取证书文件的权限

这种解决方案相对专业、精确并且安全。推荐使用这种合理设计的方案,而不是采用让所有人都能读取证书这种不安全的方案。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 创建用户和用户组
useradd -M trojan  # 为 Trojan 创建没有 home 的服务用户
usermod -L trojan  # 禁止该账户登录使用交互终端
groupadd certusers  # 添加一个用户组
usermod -aG certusers trojan  # 将 trojan 用户添加进 certusers 组

# 调整权限
# 将 letsencrypt 目录所有权交给 certusers 用户组
chown -R root:certusers /etc/letsencrypt

# 让组用户能够 passthrough 访问 archive 和 live 目录
chmod g+x /etc/letsencrypt/archive
chmod g+x /etc/letsencrypt/live

# 私钥默认权限是 -rw-------
# 这条命令给用户组读取该文件内容的权限
chmod g+r /etc/letsencrypt/archive/【您的网站】/privkey1.pem

随后编辑 /lib/systemd/system/trojan.service 文件并将 User=nobody 更改为 User=trojan,再运行 systemctl daemon-reload 来重新加载 service 文件。最后运行 systemctl restart trojan 来启动/重启服务。

2. 开放 letsencrypt 证书目录权限

这种解决方案较简单,但是非常不安全。如果您有多个服务或运行在同一个服务器上,或者有除您以外的用户可以访问服务器,那么请不要使用这种解决方案。

1
sudo chmod -R 755 /etc/letsencrypt

这条命令将会允许服务器上的任何人读取您的私钥,所以非常不推荐在将会长时间稳定运行的服务器上使用这种鲁棒式的配制方法。

配置 Trojan

配置 Trojan 证书

我们需要编辑 Trojan 的配置文件,用您喜欢的编辑器打开 /etc/trojan/config.json 文件。您也可以考虑在修改文件之前先对文件进行备份:

1
2
cp /etc/trojan/config.json /etc/trojan/config.json.backup  # 备份
cp /etc/trojan/config.json.backup /etc/trojan/config.json  # 恢复

letsencrypt 获取的证书路径将会遵循 /etc/letsencrypt/live/【域名】/ 的规律。例如,我们上文中为 node.flexio.org 获取的证书就将保存在 /etc/letsencrypt/live/node.flexio.org/,公钥为 /etc/letsencrypt/live/node.flexio.org/fullchain.pem,私钥为 /etc/letsencrypt/live/node.flexio.org/privkey.pem

接下来我们需要做的就是将 Trojan 配置文件中的秘钥路径替换为我们自己证书的路径,将 cert 的值替换为 /etc/letsencrypt/live/【域名】/fullchain.pem,将 key 的值替换为 /etc/letsencrypt/live/【域名】/privkey.pem

1
2
3
4
5
6
7
8
{
...
    "ssl": {
        "cert": "/etc/letsencrypt/live/node.flexio.org/fullchain.pem",
        "key": "/etc/letsencrypt/live/node.flexio.org/privkey.pem",
    }
...
}

在配置完证书以后,Trojan 就已经可以运行了,如果不希望更改端口和密码的话 (不推荐),可以直接转到 “启动 Trojan 服务”。

配置 Trojan 端口与密码

在 Trojan 配置中,local_port 键定义了 Trojan 服务的监听端口,而 password 键的列表则包含了所有的密码。要更改 Trojan 的端口和密码很简单,只需要在配置文件中替换相关的值即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
...
    "run_type": "server",
    "local_addr": "0.0.0.0",
    "local_port": Trojan 端口,
    "remote_addr": "127.0.0.1",
    "remote_port": 80,
    "password": [
        "密码1",
        "密码2"
    ],
...
}

启动 Trojan 服务

在配置完成后,我们就可以启动 Trojan 服务了。Debian 使用 systemd 管理服务,而用户则使用 systemctl 来管理 systemd。

启动 Trojan 服务:

1
sudo systemctl start trojan

停止 Trojan 服务:

1
sudo systemctl stop trojan

重载 Trojan 配置文件:

1
sudo systemctl reload trojan

Trojan 问题排除

您可以在启动 Trojan 服务之后通过 sudo systemctl status trojan 来查看 Trojan 服务状态,如果输出显示红色错误文本的话,那您的配置可能出现了问题。

常见问题以及解决方案

问题 潜在解决方法
无法读取证书 更改 letsencrypt 证书权限

最后修改于 2019-04-08