今天偶然看到了另外一个梯子 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; #}