搭建Trojan爬坑记

最近白嫖了Oracle的服务器,准备折腾玩一玩,第一件事就是先搭梯子。

刚开始用了https://github.com/V2RaySSR/Trojan这里的一键安装脚本,因为以前用这个在谷歌云服务器上成功搭建过,而且整个过程非常丝滑,没有遇到太大的问题。(现在推荐这个仓库https://github.com/atrandys/trojan的脚本,执行命令bash -c "$(curl -fsSL https://raw.githubusercontent.com/atrandys/trojan/master/trojan_mult.sh)"即可,后面我会讲原因)

没想到的是,这次的搭建成了我近2、3天噩梦的开始,遇到过无数问题。本来文章想起名叫搭建Trojan坑记,但是看到这么多问题,感觉还是用“”比较合适😅

1.下载脚本命令

首先这个仓库上的命令如果直接执行是会报错的,因为第一行chmod x 少了个+,正确的命令如下:

1
2
3
curl -O https://raw.githubusercontent.com/V2RaySSR/Trojan/master/Trojan.sh && chmod  +x trojan.sh && ./trojan.sh

wget --no-check-certificate https://raw.githubusercontent.com/V2RaySSR/Trojan/master/Trojan.sh && chmod +x Trojan.sh && ./Trojan.sh

小意思,对linux命令稍微熟悉一点就知道这里怎么改。

2.二级域名解析

首先我有一个正在使用的域名绑定到github pages上,为了不影响原来功能的正常使用,我选择了用二级域名作为trojan的地址。

因为又忘了域名解析相关的内容,这里折腾了好久才搞好。

  1. 我域名是在腾讯云买的,域名解析交给了CloudFlare,需要在腾讯云修改DNS解析服务器,当时找了好久没搞懂在哪里改,后来参考官方文档搞好了https://cloud.tencent.com/document/product/242/62106

  2. 如果也是改了DNS服务器,要搞清楚用的是哪个,不要在另一个上面折腾,以为设置错了/还没生效, 其实改错了地方

  3. 设置二级域名解析

    第一次解析二级域名,不太懂,一直不确定自己是不是搞对了。

    首先每条解析记录有类型名称内容TTL字段。

    主要的解析类型有:A、AAAA、CNAME,常用的就是A和CNAME,这两个分别代表解析域名到ip地址、另一个域名(即解析记录的内容部分),而A和AAAA的区别是,一个解析到IPV4,一个解析到IPV6。

    名称字段是主域名的前缀。比如要解析www.baidu.com,这里要填写www;解析baidu.com,这里填写@代表没有前缀;如果要匹配所有的二级域名,这里填写符号*。最后TTL是指超时时间,超过这段时间没有应答则为超时。

    所以类型选择A(即解析到服务器ip地址,如果地址是IPv6,则选AAAA);名称填你想要的二级域名,比如如果想绑定trojan的地址是vps.you-domain.com,这里填写vps即可;内容填写服务器ip地址。注意如果是trojan使用,CloudFlare解析不要勾选代理,否则会解析到他们的服务器为你的服务器做反向代理,会导致后续安装trojan失败

3.下载(?)失败

这里记不太清楚了,反正使用第一个脚本时报错,最后关闭防火墙,打开端口就可以了。

如果你用的是Oracle的Ubuntu服务器,要记得服务器内部的iptables、ufw还有Oracle Cloud的防火墙都需要关闭(设置)

  1. 关闭iptables(iptables不是一个服务,无法直接关闭,只能通过允许所有规则来实现“关闭”)
1
2
3
4
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
  1. 关闭ufw
1
sudo ufw disable
  1. Oracle Cloud

​ 进入子网中的安全列表,添加入站规则,允许所有ip和端口。

4.不能使用sudo执行该脚本

在脚本执行到acme部分的时候,提示不能使用sudo来执行。

有2个选择,一是su切换到root用户执行该脚本;二是作为普通用户执行脚本,但是每次需要权限的时候都要输入一次密码,大概10次左右,而且有时候还会出现无权限的问题Permission Denied……

2023.7.16补充:
当时以为sudo和root用户执行是一样的(不能使用sudo=不能使用root用户执行),所以一直是用普通用户+输入密码的方式执行脚本。本文完成后有次重新用这个脚本,发现直接使用root用户执行该脚本就没什么问题。

5.申请证书提示更新邮箱

报错Please update your account with an email address first.

参考https://chowdera.com/2021/12/202112260630384080.html,安装acme需要使用如下命令

1
curl  https://get.acme.sh | sh -s [email protected]

查看第一个脚本的代码后,发现是第157行代码安装acme的问题,于是我注释掉,改成了第158行。

6.申请证书超时失败

这里比较坑,一直报CA在处理订单中:Processing, The CA is processing your order, please just wait.

当时没有截图,是和https://github.com/acmesh-official/acme.sh/issues/3809一样的问题。大概定位在第一个脚本下面几行语句

搜了网上很多回答,命令后添加--set-default-ca --server letsencrypt 、过一会重试等都可能有用,但对我的状况都无效。

看到这里可能知道了,这个脚本错误频出,我已经没有耐心再继续了解acme然后去解决这个问题了。所以换成了上面提到的第二个仓库https://github.com/atrandys/trojan的脚本。看一个issue里面的回答,应该使用trojan_mult.sh而不是trojan_install.sh,前者已经不更新了。

执行命令bash -c "$(curl -fsSL https://raw.githubusercontent.com/atrandys/trojan/master/trojan_mult.sh)"可以直接运行,我没有再遇到证书的问题。

如果想要继续以第一个脚本进行安装,可以参考第二个脚本trojan_mult.sh申请证书部分的代码改一下,如下,对应第433-438行。(我没改,不知道是否可行)

1
2
3
4
5
6
~/.acme.sh/acme.sh  --register-account  -m test@$your_domain --server zerossl
~/.acme.sh/acme.sh --issue -d $your_domain --standalone
~/.acme.sh/acme.sh --installcert -d $your_domain \
--key-file /usr/src/trojan-cert/$your_domain/private.key \
--fullchain-file /usr/src/trojan-cert/$your_domain/fullchain.cer \
--reloadcmd "systemctl restart trojan"

后续操作都是以https://github.com/atrandys/trojan的trojan_mult.sh脚本来进行的。

后续操作都是以https://github.com/atrandys/trojan的trojan_mult.sh脚本来进行的。

后续操作都是以https://github.com/atrandys/trojan的trojan_mult.sh脚本来进行的。

7.trojan修改密码

之后安装还算成功,但是设置trojan密码的时候输错了,并且按下了回车键,导致配置文件中密码部分有特殊字符^H

我当时也发现了另一个错误:trojan安装后无法启动服务status=203/EXEC,我选择了用脚本卸载trojan,然后重装。(实际上这两个问题不需要重装,重装解决不了问题,还有可能带入新的问题,后面细讲这些

查看代码,可以发现脚本获取密码保存在trojan_passwd变量中,并且写入了两个配置文件:一个是客户端配置/usr/src/trojan-cli/config.json,另一个是服务端配置,存放在/usr/src/trojan/server.conf。

因此,正确的做法是修改这两个配置文件,并且一定要保持客户端配置文件与服务端配置密码相同,否则会密码错误连不上。

1
2
vim /usr/src/trojan/server.conf #修改服务端配置
vim /usr/src/trojan-cli/config.json #修改客户端配置

8.重新安装提示Nginx错误

使用脚本卸载trojan(会连Nginx一起卸载)之后,再次安装提示“nginx安装有问题,请使用卸载trojan后重新安装”。这就是卸载重装引入的新的问题,关键卸载重装对我解决之前的问题并没有帮助……

我尝试卸载-安装几次之后还是这样。后来想是不是Nginx卸载不干净,应该彻底卸载。搜了下,找到这篇文章https://www.cnblogs.com/xuyaowen/p/reinstall-nginx.html,手动执行这两个命令重装后解决问题。

1
2
sudo apt-get purge nginx nginx-common # 卸载nginx,包括删除配置文件。
apt install nginx

9.trojan无法启动,status=203/EXEC

为了判断trojan是否启动,使用systemctl命令查看trojan的运行状态

1
sudo systemctl status trojan.service

重装之前就遇到status=203/EXEC这个问题,现在还是没有解决。

谷歌了一下,找到类似的问题https://stackoverflow.com/questions/60388009/system-unit-file-always-failed,官方给出的解释是203 EXIT_EXEC代表程序不是一个可执行文件,因此这个进程无法被启动。

203 EXIT_EXEC The actual process execution failed (specifically, the execve(2) system call). Most likely this is caused by a missing or non-accessible executable file.

没办法,还是看脚本代码。

第270行运行文件trojan.service启动服务之前先写入了它,结合网上搜到的评论说要检查ExecStart一项,那么ExecStart大概就是执行的命令,/usr/src/trojan/trojan目录下的trojan是程序,-c "/usr/src/trojan/server.conf" 是参数,并且server.conf也和之前提到的服务器端配置是同一个,所以/usr/src/trojan/trojan应该就是trojan主程序。

切换到/usr/src/trojan目录尝试运行trojan程序,提示./trojan: cannot execute binary file: Exec format error

结合203的解释:程序很可能不是一个可执行文件。于是尝试执行Nginx的主程序,看看其他文件执行起来应该是什么样子。

程序并没有再报同样的错,只是由于我不是root用户,所以提示Permission denied

现在可以确定是trojan文件的问题,不兼容。运行了下uname -m查看架构,结果是aarch64,猜测可能是Oracle服务器VM.Standard.A1.Flex不太一样吧。

2023.7.16补充:
当时不太了解,其实这里完全就是2种架构aarch64和x86_64不兼容。这个脚本没有判断本机的系统架构,直接下载了x86_64架构的trojan程序,当然运行不起来。需要手动下载aarch64架构的程序/下载代码在本地编译为aarch64架构的程序。
aarch架构的软件兼容性不太好就包括这种场景,很多程序运行首要考虑的就是x86_64架构而不是aarch,甚至有的没有aarch架构的程序。

后来了解了一下,AArch64也叫ARM64,采用的是ARM架构,精简指令集(Reduced Instruction Set Computer-RISC),主要特点是功耗低(所以性能也不会太强),另外软件兼容性不太好

x86_64,x64,AMD64基本是一个东西,都是x86架构(Intel与 AMD都用这个架构),复杂指令集(Complex Instruction Set Computer-CISC),主要特点是性能好(相应的,功耗也高)。

代码里面直接下载了AMD64的trojan程序,所以导致了错误。

1
2
3
green "开始下载最新版trojan amd64"
wget https://github.com/trojan-gfw/trojan/releases/download/v${latest_version}/trojan-${latest_version}-linux-amd64.tar.xz
tar xf trojan-${latest_version}-linux-amd64.tar.xz >/dev/null 2>&1

后面比较简单,看脚本里trojan程序从哪里下的,然后从同样的来源下载代码,本地编译一下替换原来的trojan程序即可。

来源是官方版本的trojan,github仓库https://github.com/trojan-gfw/trojan,官网[trojan-gfw.github.io/trojan/](https://trojan-gfw.github.io/trojan/),点击官网下面的build,会给出安装的教程。

编译很简单,之后同样放在/usr/src/trojan/目录下,尝试用之前的命令/usr/src/trojan$ sudo ./trojan -c "/usr/src/trojan/server.conf"运行程序,成功,但是程序主界面被阻塞了,我按ctrl+z退出了(这里又是一个坑)。

10.trojan无法启动,status=1/FAILURE

上一步发现trojan可以启动了,然后启动trojan.service服务,结果发现又没有成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo systemctl start trojan.service
sudo systemctl status trojan.service
ubuntu@instance-20220728-0042:~$ sudo systemctl status trojan.service
● trojan.service - trojan
Loaded: loaded (/etc/systemd/system/trojan.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sat 2022-07-30 07:02:49 UTC; 20min ago
Process: 8816 ExecStart=/usr/src/trojan/trojan -c /usr/src/trojan/server.conf (code=exited, status=1/FAILURE)
Main PID: 8816 (code=exited, status=1/FAILURE)

Jul 30 07:02:49 instance-20220728-0042 systemd[1]: trojan.service: Scheduled restart job, restart counter is at 5.
Jul 30 07:02:49 instance-20220728-0042 systemd[1]: Stopped trojan.
Jul 30 07:02:49 instance-20220728-0042 systemd[1]: trojan.service: Start request repeated too quickly.
Jul 30 07:02:49 instance-20220728-0042 systemd[1]: trojan.service: Failed with result 'exit-code'.
Jul 30 07:02:49 instance-20220728-0042 systemd[1]: Failed to start trojan.

通过journalctl -e -u trojan.service命令查看日志,发现报错和这个https://github.com/trojan-gfw/trojan/issues/283一样,都是[FATAL] fatal: bind: Address already in use

毫无疑问是端口被占用了,sudo netstat -tunlp发现已经有一个trojan程序在侦听443端口了(其实就是上一个问题最后我手动运行的那个……),果断kill掉,再次运行就OK了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ubuntu@instance-20220728-0042:~$ sudo netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 7941/./trojan
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/init
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 970/sshd: /usr/sbin
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 8039/sshd: ubuntu@p
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 2949/sshd: ubuntu@p
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 801/systemd-resolve
tcp 0 0 127.0.0.1:587 0.0.0.0:* LISTEN 2132/sendmail: MTA:
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1796/python
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2132/sendmail: MTA:
tcp6 0 0 ::1:6010 :::* LISTEN 2949/sshd: ubuntu@p
tcp6 0 0 ::1:6011 :::* LISTEN 8039/sshd: ubuntu@p
tcp6 0 0 :::111 :::* LISTEN 1/init
tcp6 0 0 :::22 :::* LISTEN 970/sshd: /usr/sbin
tcp6 0 0 :::3306 :::* LISTEN 1773/mysqld
udp 0 0 127.0.0.53:53 0.0.0.0:* 801/systemd-resolve
udp 0 0 10.0.0.176:68 0.0.0.0:* 799/systemd-network
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/init
udp6 0 0 :::111 :::* 1/init

看状态终于成功运行了!!!!顺便设置开机自启动

1
sudo systemctl enable trojan.service

刚启动可能还连不上,稍微等一会即可。

11.BBR加速

网上好多搭建梯子的文章提到了BBR加速,我也准备试一下

根据这两篇文章:哪个BBR/BBR PLUS/BBR2加速脚本最快最好 最新脚本及设置详细评测BBR vs BBRplus vs BBR2 一般网络速度对比,BBR+Cake方案是效果比较好的。

我用了这里的脚本https://github.com/ylx2016/Linux-NetSpeed/blob/master/tcpx.sh

本来就安装了BBR,只要设置Cake加速即可。

我手贱顺便点了优化系统配置,结果后面trojan客户端就连不上了,但是明明trojan服务、服务器ping外网还是正常的,自己的电脑ping服务器也正常。最后想到可能是iptables防火墙屏蔽了443端口,telnet测试了443端口,连接失败,果然。允许所有规则后恢复正常了。

1
2
3
4
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F

V2ray测速基本能稳定在2M/s以上,加速前每秒大概1M+偶尔2M,效果还是可以的。

参考

自建trojan服务器教程
https://github.com/Alvin9999/new-pac/blob/master/%E8%87%AA%E5%BB%BAtrojan%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%99%E7%A8%8B.md

自建梯子教程 –Trojan版本
https://trojan-tutor.github.io/2019/04/10/p41.html