Trojan 是近期出现在的一款翻墙神器,由大神使用 C++ 语言开发,服务端模拟 Web 服务器接收 HTTPS 请求,并将代理结果包装成 HTTPS 响应返回给客户端。由于代理数据同 HTTPS 数据一致,从而有效避开国内防火墙的侦测,达到科学上网的目的。

本文将详细讲解如何在 CentOS  系统免域名配置 Trojan 代理服务器,主要内容包括:

  • CA 证书以及域名证书的制作
  • 安装 Trojan 服务器软件
  • 添加 Trojan 为服务

PS:由于 CentOS 8 使用了全新的包管理工具,本文在命令行存在差异时会特别注明。

1] CA 证书及域名证书的制作

Trojan 服务端模拟 Web 服务器,同客户端建立 TLS 连接,此过程与域名及证书密切相关。Trojan 可以使用专门的证书颁发机构(CA 服务器)提供的域名证书来启动服务,这样做的好处是证书真实有效,数据更加不容易被拦截;不过缺点也十分明显,就是证书颁发机构不会为 IP  地址颁发证书,这就需要在使用 Trojan 时具有域名,并且这些域名证书有效期都较短,需要定期更新证书。

所谓的免域名就是不需要域名而直接通过 VPS 主机的 IP 地址来生成 Trojan 所需的域名证书,而做法就是让 VPS 主机来充当 CA 服务器并对自身来颁发 IP 地址域名证书。

首先安装证书工具:

# yum install gnutls-utils -y      //CentOS 6、7
OR
# dnf install gnutls-utils -y      //CentOS 8

安装完成后,可以使用如下命令查看证书工具是否安装成功:

# certtool --version

图.1 查看证书工具版本

出现如图.1 所示的信息,则表示证书工具已经成功安装,则可以往下进行。

创建两个文本文件”ca.txt”和”trojan.txt”,作为证书模板来使用,文件内容分别如下:

/* ca.txt */
cn = "192.168.1.1"
organization = "GlobalSign RULTR"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key

/* trojan.txt */
cn = "192.168.1.1"
organization = "GlobalSign RULTR"
expiration_days = 3650
signing_key
encryption_key
tls_www_server

注意要将模板文件中 cn = “192.168.1.1” 部分修改为 Trojan 服务器的实际 IP 地址,否则生成的域名证书不可用。

然后使用如下命令生成 CA 证书和 IP 地址域名证书:

# certtool --generate-privkey --outfile ca-key.pem
# certtool --generate-self-signed --load-privkey ca-key.pem --template ca.txt --outfile ca-cert.pem
# certtool --generate-privkey --outfile trojan-key.pem
# certtool --generate-certificate --load-privkey trojan-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template trojan.txt --outfile trojan-cert.pem

此时,就生成了 CA 服务器证书文件以及 Trojan 服务器使用的 IP 地址域名证书。其中:

  • ca-key.pem:为 CA 服务器私钥,用于生成域名证书
  • ca-cert.pem:为 CA 服务器公钥,Trojan 客户端需要使用
  • trojan-key.pem:为 Trojan 服务器使用的私钥
  • trojan-cert.pem:为 Trojan 服务器使用的公钥。

2] 安装 Trojan 服务器软件

Trojan 事实上是一个可执行文件,根据其配置文件内容来确定工作方式是服务器或是客户端。使用如下命令下载 Trojan 发行版可执行文件,并将文件分别拷贝到对应位置,就完成了软件的安装(Trojan 发行版可以从GitHub下载,方便起见,示例使用本站下载。本站将保持发行版同 GitHub 保持一致,方便下载使用):

# wget https://www.rultr.com/rultr-content/trojan-1.14.0-linux-amd64.tar.xz
# tar -xvf trojan-1.14.0-linux-amd64.tar.xz -C /etc/
# mv /etc/trojan/trojan /usr/bin/
# trojan -v

图.2 CentOS 系统安装 Trojan

从图.2 可以看出,Trojan 发行版压缩包中包含几个文件,最重要的是”trojan”和”config.json”。”trojan”是 Trojan 的可执行文件,而”config.json”是 Trojan 的配置文件。

虽然 Trojan 程序可以执行了,但是需要修改配置文件来让它使用之前的域名证书工作于代理服务器模式。

首先将 IP 地址域名证书拷贝到正确位置:

# cp trojan-key.pem /etc/trojan
# cp trojan-cert.pem /etc/trojan

然后修改配置文件为如下内容:

{
    "run_type": "server",
    "local_addr": "0.0.0.0",
    "local_port": 443,
    "remote_addr": "127.0.0.1",
    "remote_port": 80,
    "password": [
        "Your_Password_Here",
        "Password_Here_Too"
    ],
    "log_level": 1,
    "ssl": {
        "cert": "/etc/trojan/trojan-cert.pem",
        "key": "/etc/trojan/trojan-key.pem",
        "key_password": "",
        "cipher": "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHA
CHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256",        "prefer_server_cipher": true,
        "alpn": [
            "http/1.1"
        ],
        "reuse_session": true,
        "session_ticket": false,
        "session_timeout": 600,
        "plain_http_response": "",
        "curves": "",
        "dhparam": ""
    },
    "tcp": {
        "prefer_ipv4": false,
        "no_delay": true,
        "keep_alive": true,
        "fast_open": false,
        "fast_open_qlen": 20
    },
    "mysql": {
        "enabled": false,
        "server_addr": "127.0.0.1",
        "server_port": 3306,
        "database": "trojan",
        "username": "trojan",
        "password": ""
    }
}

配置文件中需要修改的内容不多,主要为:

  • “password”:Trojan 服务器同客户端的认证密码,可设置多个,以逗号隔开
  • “cert”:Trojan 服务器的公钥文件
  • “key”:Trojan 服务器的私钥文件
  • “key_password”:证书密码,如果在生成域名证书时设置了密码,则在此处填入,示例在生成证书时没有设置,则保留为空即可

其余内容保持默认即可。如果有其他功能需求,可自行修改配置文件进行设置。

至此,Trojan 服务器就已经搭建完成,运行 Trojan 命令就可以提供代理服务了。

3] 添加 Trojan 为服务

使用方便起见,常常将可执行文件添加到 systemd 服务,Trojan 当然也可以。

新建一个 Trojan 服务文件”/usr/lib/systemd/system/trojan.service”,内容如下:

[Unit]
Description=trojan
Documentation=man:trojan(1) https://trojan-gfw.github.io/trojan/config https://trojan-gfw.github.io/trojan/
After=network.target mysql.service mariadb.service mysqld.service

[Service]
Type=simple
StandardError=journal
User=trojan
AmbientCapabilities=CAP_NET_BIND_SERVICE
ExecStart=/usr/bin/trojan /etc/trojan/config.json
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

配置文件中使用非 root 用户 trojan 来启动 Trojan  服务器,可以提高系统的安全性。于是使用如下命令创建用户并授权:

# groupadd -g 12345 trojan
# useradd -g 12345 -s /usr/sbin/nologin trojan
# chown -R trojan:trojan /etc/trojan

最后,启动 Trojan 服务并查看状态,如果见到下图所示内容,则表示服务安装成功,Trojan 服务器可以正常工作了。

图.3 查看 Trojan 服务状态

以上就是关于 CentOS 系统安装 Trojan 服务器的全部内容,如果其他问题,可留言交流。

20 thoughts on “CentOS 系统免域名配置 Trojan 代理”

    1. iOS 客户端我没用过,不知道有没有开发出来,如果有的话,应该用法和 Android 客户端类似,本站有 Android 客户端的用法,可以参考。

    1. 这个日志看起来好像是 Trojan 客户端配置有点问题,现在提示连接的服务器是 google的服务器,不是自己的 Trojan 服务器样,Trojan 客户端的remote 服务器显然应该是自己搭建的 Trojan 服务器,要仔细检查一下客户端的配置。

    1. Trojan 服务端事实上只是一个 Linux 应用程序,如果启动不成功,大致原因有:
      1、配置文件有错误,例如不符合 JSON 格式要求造成配置文件有问题
      2、证书问题,包括找不到证书文件或者证书文件本身存在问题
      3、权限问题,包括配置文件、证书目录用户是否有权限操作等
      4、其它软件影响,最主要看是否启用了 SELinux,如果应用了,最好设置为disable
      5、端口占用,要看 Trojan侦听的端口是否和其他软件冲突

    1. Trojan是不区分服务器和客户端的,PC平台直接下载程序运行即可,Android 平台有测试版本的客户端Igniter,本站下载页面可以找到最新版的 Trojan 应用。

  1. 用域名的时候是 域名+443;现在没有域名了直接用IP+443吗

    1. 这样做是没有问题的,但是要根据自己的IP生成对应的证书,否则 Trojan 工作不正常。

    1. 采用教程这种方式是不需要用到 Nginx这种Web服务器的,因为 trojan 自己会充当Web服务器来接收请求。

  2. 行文严谨, 描述详细
    照抄直接就配好了
    非常感谢, 少见的良心文章

  3. 还有个问题请教博主, 我在mac 客户端的config配置文件里: 把 ssl 选项里 verity 设置为 false, 本地证书都不用就能正常上网了
    这个选项是什么意思呢? 直接走 http 吗?

    1. 这个选项是验证 SSL 证书是否是有效证书,自签名的证书肯定不能通过证书有效性验证,所以一般把证书验证设置不验证。

  4. 运行 :certtool –generate-self-signed –load-privkey ca-key.pem –template ca.txt –outfile ca-cert.pem
    报错:
    configFileLoad: No such file or directory
    Error loading template: ca.txt

    是什么原因呢

    1. 这个报错是提示没有找到 ca.txt 文件,执行这条命令前,需要创建模板文件 ca.txt,然后要在 ca.txt 和 ca-key.pem 的目录执行,否则需要通过全路径指定文件位置,不然就会像您遇到的一样,提示找不到文件。祝您成功。

  5. [root@iZt4nb1uqwrdazs40hd223Z ~]# certtool –generate-self-signed –load-privkey ca-key.pem –template ca.txt –outfile ca-cert.pem
    configFileLoad: No such file or directory
    Error loading template: ca.txt

    明明用touch ca.txt 然后vim ca.txt创建并保存了题主的文件内容,但是为什么显示无法加载呐?

    1. 这种可能需要查看目录内容以及模板文件内容进行排查了,看报错应该是文件问题。

回复 zombie 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注