今天偶然看到了另外一个梯子trojan,大致看了下,感觉这东西还是蛮有意思的嘛,思路和其他工具不太一样:把流量放到Application Data里,然后伪装成正常的HTTPS通信,甚至还有一个完全真正的TLS握手。从结果上看起来,有点像Shadowsocks/ShadowsocksR的obfs之类的功能,只不过这个从网络层上看就像真正的HTTPS一样。
由于这是一个比较新的项目,所以相关的基础设施还不如shadowsocks那么完善,比如缺少或不完善的移动平台客户端等等~不过这都不是事,相信社区的力量レ(゚∀゚;)ヘ=3=3=3
配置也很容易,大概可以分为6步
- 准备服务器
- 准备http服务
- 弄个域名
- 搞个证书
- 写配置,调试,运行
- 客户端配置、测试
- 进阶配置
准备服务器
VPS
首先,咱需要准备一个VPS,KVM之类的完全虚拟化的最好,OpenVZ也行。
我就用前段时间免费薅的Oracle Cloud Korea为例了,延迟真是非常理想的,也基本没丢包。
其他的厂商,可以试试
- Vultr:注册送$50,一个月用完,最低$3.5/月,但是据说现在有时会开出来不能用的IP
- Linode:老牌厂商了,$5
- Conoha:日本的主机商,900日元/月,据说ToS有点严格,但是我跑梯子、rtorrent、ffmpeg都没被封过,吼吼
- DigitalOcean:和Vultr一样也是送$50一个月用完
- VirMach:被称作低价屠夫,特别便宜的年付VPS,比如有时促销会有年付$7的KVM机器,新用户貌似还能折扣,不过他家换IP就要交钱,这点就比较坑了
防火墙
装好系统,ssh连接上,记得把防火墙什么的都搞定了,需要注意,不仅要关注系统自身的防火墙,也要注意下厂商的“安全组”这类东西。
清除iptables的规则,可以参考如下命令:
sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -t nat -F sudo iptables -t mangle -F sudo iptables -F sudo iptables -X
如有必要,可以安装iptables-save等工具持久化
准备http服务
官方文档建议配置一个http服务器,所以咱就简单的弄下吧,Debian系为例,使用root权限执行如下命令:
apt install nginx
CentOS可以用yum安装
yum install nginx
此时访问http://ip 应该能看到默认的欢迎页面了。
弄个域名
域名的话,什么域名都无所谓的,可以自己注册个免费的cf什么的域名,也可以注册个正经的域名,假如不想花钱,那用DDNS也可以,比如dynu提供免费的二级域名。
域名搞到手之后,做个A记录的解析到服务器IP
搞个证书
有两种方式,一种是申请一个真正的证书,另外一种是用openssl生成一个自签名证书。官方建议使用真正的证书。
申请证书
直接使用Let’s Encrypt就可以了,可以参考如下命令
certbot certonly
然后一步一步按照说明做
详细信息可以参考如下两篇
https://dmesg.app/letsencrypt-nginx-subdomain.html
https://letsencrypt.org/zh-cn/getting-started/
自签名证书
openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 3650 -out certificate.pem
服务端配置,调试,运行
直接从GitHub Release下载二进制文件
wget https://github.com/trojan-gfw/trojan/releases/download/v1.13.0/trojan-1.13.0-linux-amd64.tar.xz tar xf trojan-1.13.0-linux-amd64.tar.xz cd trojan
examples目录中有一个server.json-example
,我们直接把他拷贝到上层目录
cp exmaples/server.json-example config.json
配置文件的内容很简单,基本上只需要修改password字段和ssl字段就可以了
运行
./trojan
基本上没报错,在运行了就可以~
客户端配置运行
这里以PC为例,Android/iOS可以找找相应的工具
同样从GitHub Release下载对应的文件,解压缩,把client.json-example
拷贝出来
我们只需要关注local_port、remote_addr、remote_port、password
和ssl
的几个字段
local_port
本地监听的端口,我这里设置为了11080,避免和本机的Shadowsocks冲突remote_addr
:申请的域名remote_port
:上面服务端配置的端口,一般来说就是443password
:密码,要与服务端配置的密码列表中的一个相符- ssl:如果你使用的是自签名证书,那么
verify
要写false,假如common name也是瞎写的,那么verify_hostname
也要写false;假如用的是真证书,那么就都true就可以了
然后./trojan
运行就可以了,此时trojan会监听指定的端口,socks5,本例为11080
然后打开你的proxyswitchy omega,这么配置下就可以了
更进一步,可以用proxy switchy omega的自动切换模式+GFWList
如果在Windows上运行提示缺少VCRUNTIME等,请安装相应的VC运行库,可以参考文末链接
测速
都在服务端开启了BBR的情况下进行的测试
使用Shadowsocks
trojan
速度还是很理想的,就是不知道稳不稳了。
进阶配置
使用BBR
偷懒,直接用秋水逸冰的吧
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh
开启TFO(TCP Fast Open)
sysctl -w net.ipv4.tcp_fastopen=3 sysctl -p /etc/sysctl.conf cat /proc/sys/net/ipv4/tcp_fastopen
结果为3就对了
然后服务端和客户端的tcp.fast_open
都改成true
配置systemd
创建文件,/etc/systemd/system/trojan.service
或者/lib/system/system/trojan.service
[Unit] Description=Trojan After=network.target network-online.target nss-lookup.target [Service] Restart=on-failure Type=simple ExecStart=/path/to/trojan config.json [Install] WantedBy=multi-user.target
自启
systemctl daemon-reload systemctl enable trojan systemctl start trojan systemctl status trojan
使用非root、non-login shell运行
新增用户
useradd –s /usr/sbin/nologin trojan # 改权限 chown -R trojan:trojan /path/to/trojan
授予监听标准端口权限
由于1024以下端口默认只能由root监听,所以要让非root用户监听,大概有以下几个方法:
- suid:
chmod u+x /opt/trojan/trojan
- iptables转发,确保开启转发
net.ipv4.ip_forward=1
,然后iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to:4433
- CAP_NET_BIND_SERVICE
setcap cap_net_bind_service=+eip /opt/trojan/trojan
system微调
[Unit] Description=Trojan After=network.target network-online.target nss-lookup.target [Service] User=trojan Group=trojan Restart=on-failure Type=simple ExecStart=/path/to/trojan [Install] WantedBy=multi-user.target
使用HTTP/2
服务端alpn中加入h2,如下图所示
当然客户端也要确保有这个h2哦~
TLS 1.3
已经支持啦,当然了,要你的openssl版本在1.1.1以上哦。对啦,cipher suite要改下,比如说
TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-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
使用数据库做验证
更高级的配置,比如流量控制等,可以通过MySQL实现
在服务端配置最后的mysql字段,确保用户名密码正确,本机装好了MySQL
然后进入mysqlcli,创建数据库、创建表、插入用户
# 创建数据库 create database trojan; use trojan; # 创建表 CREATE TABLE users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(64) NOT NULL, password CHAR(56) NOT NULL, quota BIGINT NOT NULL DEFAULT 0, download BIGINT UNSIGNED NOT NULL DEFAULT 0, upload BIGINT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (id), INDEX (password) ); # 创建用户 INSERT INTO users VALUES(NULL,'benny','Fire',1024,100,50);
trojan会先查询配置文件中的password字段,然后查询数据库中的字段。之后会去计算50+100<100(上传+下载是否小于限额),小于的话,允许链接。
上述SQL语句中,1024如果是负数,意味着不限额。
quota、download、upload单位都是字节
参考资料
项目主页https://github.com/trojan-gfw/trojan
teddysun一键bbr脚本 https://teddysun.com/489.html
dynuddns https://www.dynu.com
nginx与trojan https://github.com/trojan-gfw/trojan/issues/67
设计讨论 https://github.com/trojan-gfw/trojan/issues/14
VC运行库https://aka.ms/vs/16/release/VC_redist.x64.exe
https://github.com/RPCS3/rpcs3/issues/6646
配置文件详解https://trojan-gfw.github.io/trojan/config
android客户端 https://github.com/trojan-gfw/igniter
iOS:shadowrocket的test flight版
SSL证书配置:https://dmesg.app/letsencrypt-nginx-subdomain.html https://letsencrypt.org/zh-cn/getting-started/
--本评论由Telegram Bot回复~❤️
--本评论由Telegram Bot回复~❤️
ExecStart=/path/to/trojan
后面需要加上 config.json 配置文件?,不加 start 不起来? 参考 https://github.com/trojan-gfw/trojan/blob/master/examples/trojan.service-example--本评论由Telegram Bot回复~❤️
--本评论由Telegram Bot回复~❤️
--本评论由Telegram Bot回复~❤️
server { listen 127.0.0.1:80 default_server; server_name 网站绑定的域名; location / { proxy_pass https://www.baidu.com; } } server { listen 127.0.0.1:80; server_name 网站域名对应的IP(在域名解析设置中添加A记录,把网站绑定的域名指向服务器IP); return 301 https://网站绑定的域名$request_uri; } #server { # listen 0.0.0.0:80; # listen [::]:80; # server_name _; # return 301 https://$host$request_uri; #}