搭建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 | curl -O https://raw.githubusercontent.com/V2RaySSR/Trojan/master/Trojan.sh && chmod +x trojan.sh && ./trojan.sh |
小意思,对linux命令稍微熟悉一点就知道这里怎么改。
2.二级域名解析
首先我有一个正在使用的域名绑定到github pages上,为了不影响原来功能的正常使用,我选择了用二级域名作为trojan的地址。
因为又忘了域名解析相关的内容,这里折腾了好久才搞好。
我域名是在腾讯云买的,域名解析交给了CloudFlare,需要在腾讯云修改DNS解析服务器,当时找了好久没搞懂在哪里改,后来参考官方文档搞好了https://cloud.tencent.com/document/product/242/62106
如果也是改了DNS服务器,要搞清楚用的是哪个,不要在另一个上面折腾,以为设置错了/还没生效, 其实改错了地方。
设置二级域名解析
第一次解析二级域名,不太懂,一直不确定自己是不是搞对了。
首先每条解析记录有类型、名称、内容和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的防火墙都需要关闭(设置)。
- 关闭iptables(iptables不是一个服务,无法直接关闭,只能通过允许所有规则来实现“关闭”)
1 | iptables -P INPUT ACCEPT |
- 关闭ufw
1 | sudo ufw disable |
- 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 | ~/.acme.sh/acme.sh --register-account -m test@$your_domain --server zerossl |
后续操作都是以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 | vim /usr/src/trojan/server.conf #修改服务端配置 |
8.重新安装提示Nginx错误
使用脚本卸载trojan(会连Nginx一起卸载)之后,再次安装提示“nginx安装有问题,请使用卸载trojan后重新安装”。这就是卸载重装引入的新的问题,关键卸载重装对我解决之前的问题并没有帮助……
我尝试卸载-安装几次之后还是这样。后来想是不是Nginx卸载不干净,应该彻底卸载。搜了下,找到这篇文章https://www.cnblogs.com/xuyaowen/p/reinstall-nginx.html,手动执行这两个命令重装后解决问题。
1 | sudo apt-get purge nginx nginx-common # 卸载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 | green "开始下载最新版trojan amd64" |
后面比较简单,看脚本里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 | sudo systemctl start trojan.service |
通过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 | ubuntu@instance-20220728-0042:~$ sudo netstat -tunlp |
看状态终于成功运行了!!!!顺便设置开机自启动
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 | iptables -P INPUT ACCEPT |
V2ray测速基本能稳定在2M/s以上,加速前每秒大概1M+偶尔2M,效果还是可以的。
参考
自建梯子教程 –Trojan版本
https://trojan-tutor.github.io/2019/04/10/p41.html