1.本文简介
本文总结了自己在VPS搭建 Trojan-GFW 代理过程中遇到的各种坑,以及最后的解决方案,以供大家参考。
本文的宗旨在于,将大量重复性的工作集中到配置过程中,以让使用过程尽量简单。所以本文的配置过程相较于网上的某些教程稍微复杂一点,但是如果严格按照本文配置过程配置的话,那么配置完成之后服务器端就可以几乎不用搭理他了,然后客户端几乎是拿到手就可以使用,特别适合有好几个人一起共享的情况。
本文将按操作顺序介绍部署用于trojan代理服务的VPS服务器的详细过程,按照步骤操作一切正常的话一小时之内即可配置成功。如果配置过程中有什么疑问,欢迎在留言区交流!
2.Trojan工作原理浅析
Trojan是一个比较新的翻墙软件,在设计时采用了更适应国情的思路。在穿透GFW时,人们认为强加密和随机混淆可能会欺骗GFW的过滤机制。然而,Trojan实现了这个思路的反面:它模仿了互联网上最常见的HTTPS协议,以诱骗GFW认为它就是HTTPS,从而不被识别。
3.Trojan工作原理
如图所示,Trojan工作在443端口,并且处理来自外界的HTTPS请求,如果是合法的Trojan请求,那么为该请求提供服务,否则将该流量转交给web服务器Nginx,由Nginx为其提供服务。基于这个工作过程可以知道,Trojan的一切表现均与Nginx一致,不会引入额外特征,从而达到无法识别的效果。当然,为了防止恶意探测,我们需要将80端口的流量全部重定向到443端口,并且服务器只暴露80和443端口,这样可以使得服务器与常见的Web服务器表现一致。
前置条件
系统要求
- Ubuntu >= 16.04;
- Debian >= 9;
- CentOS >= 7;
4.VPS服务器购买
4.1 注册vultr
我使用的服务器是vultr。主要因为其按小时计费,随时可以停用服务器。这一点很重要,现在gfw相当高,所以你买到的机器很可能是已经被墙了的。其次,vultr本身没有被墙,这一点很重要,不然就是先有鸡还是先有蛋的问题了。当然,可以支付宝或微信付款也是一个加分点。现在注册立马获得$100优惠券,直接抵用消费。注册地址: https://www.vultr.com/,网页右上角有个“Create Account”就是注册的地方了,接下来就是注册并激活账号了。
4.2 充值
Billing->AlipayPay with Alipay
4.3 购买服务器
点击vultr网页右上角的蓝色+图标即可为账户添加服务器。
注意: 向下滚动有很多选项,不要直接点击Deploy Now,这样会使用默认参数,但不是我们想要的!
第一个选项为选择服务器类型(Choose Server),这里选择Cloud Compute。
第二个选项为选择服务器地址(Server Location),建议选择硅谷(Silicon Valley,离google最近),而不要选择日本(用的人多,大部分IP已经被墙);
第三个选项为选择服务器类型(Server Type),即选择服务器操作系统。作为示例,这里我们选择选择Ubuntu 18.10 x64(强烈推荐),不过系统要求部分所列出的操作系统均已测试通过,同一个发行版本的系统在我要求以下的版本测试不通过。注意如果你使用其他vps服务商的vps,可能有minimal选项,不能选择那一个,很多依赖乃没有安装,会导致自己配置失败(当然也可以,缺少哪个依赖自己再用apt安装就好了,例如:apt install -y sudo,sudo apt install -y vim等)。最后,如果你确实是有其他系统或者比较旧的系统版本需要安装trojan的话,建议使用docker,正文中部分配置只需要做细微修改即可,为了文章的整体性我就不放在正文了,请参考 评论区 。
第四个选项为选择服务器大小(Server Size),即选择服务器硬件性能。因为我们使用VPS服务器翻墙,所以性能瓶颈不在配置,而在网络带宽之类的。由于vultr的服务器带宽都是100M的,所以服务器当然是往便宜了选。当然,$2.5/mo的一般都是缺货的。选择$5/mo的就好,一个月三十几块钱,要是有好几个人一起分担的话就相当实惠了。
第五、六、七三个选项可以不用管它。
第八条要求为即将部署的服务器命名并给一个标签,随意就好。
此时可以点击右下角的现在部署(Deploy Now),vultr即开始分配资源,安装系统。此时Servers页面可以看到服务器信息,状态显示installing。当状态切换为Running的时候,服务器就可以使用了。
4.4 服务器信息查看
服务器安装结束之后在Servers页面点击刚才购买的服务器名字即可跳转到服务器详情页。如图右上角有一个View console可以直接通过网页连接到服务器,但是由于它不支持复制粘贴,不方便,我们需要使用第三方工具连接到服务器。所以需要知道IP、用户名和密码,如图左下角。
3.域名申请与解析
trojan需要一个域名用来做伪装,所以需要先申请一个域名。如果你只是用来翻墙没有其他作用,那么建议注册一个免费域名即可。本教程使用freenom免费域名和cloudflareDNS为例。
如果自己已经有域名了那么可以不用申请,直接用一个子域名就可以了。如果你的域名不是在cloudflare购买,那么你有两个方案可用。1. 将你的域名转移到cloudflare解析,这个对于已经有域名的来说应该不难,就不多说了;2. 下文与cloudflare相关的部分自行参考这个文档做调整,也很简单,找到你自己的DNS服务商,按照指引操作即可。建议是先严格按照教程操作成功之后再改为自己的域名,否则难免出奇怪的问题。
3.1 freenom免费域名申请
我自己在使用Edge注册freenom的时候会失败,使用chrome(试试它的隐身模式)才可以,你如果也失败了请换一个浏览器试试!
freenom在检测到ip对应的国家和你填写的个人信息不一致就会不允许你注册,所以要么不要挂VPN去申请域名,要么去网上生成虚拟美国人信息。
freenom注册地址在这里 ,支持简体中文,可以自行切换。在寻找一个免费域名的输入框中输入自己理想的域名点击检查可用性,如图所示。检查到可用的中意的域名之后,点击现在获取即可锁定该域名。
Use DNS>>Use Frenom DNS Service0.0.0.012 Months @ FREE
在freenom申请的免费域名是可以无限免费续期的,除非被人花钱抢注,所以自己每隔几个月回来续期一下就可以啦。反正这个域名只是拿来翻墙用,被人抢注了马上换一个成本也不大。如果介意这个的话,建议自己买付费域名,国外域名服务商推荐namecheap,不要买国内域名服务商的域名。
使用期限设置
3.2 注册Cloudflare
Sign up
接下来是一个提示页面,直接下一步即可。然后计划选择FREE就好,够用了,然后点击confirm plan。
10.10.10.10
ns01.freenom.comns02.freenom.comleah.ns.cloudflare.comvern.ns.cloudflare.com
Manage Domain
Management Tools>>NameserversUse custom nameservers (enter below)Nameserver 1Nameserver 2change Nameservers
此时cloudflare会检测你的dns服务器是否已经切换到了cloudflare,如果没有检测到已经切换的话,稍作等待即可。最终,DNS配置结果如下图所示,即
4.VPS服务器部署
跳过了上面系统选择与购买部分的要注意啦,本教程目前测试通过操作系统版本是Ubuntu 16.04 or Debian 9 or CentOS 7及以上,更低版本系统无法成功搭建,其他系统尚未测试!
4.1 远程工具安装
本文使用的第三方远程管理工具叫做Xshell。Xshell学生和家庭版是免费的,可以放心试用(觉得好用的话,不差钱的各位也可以注册一下支持软件开发者噢)。安装好Xshell之后即可开始连接服务器进行部署了。不过Xshell没有Mac端,所以Mac可以使用其他ssh客户端,甚至直接用终端都可以,用法大同小异。
连接上服务器后就可以开始安装Trojan了。对于Xshell连不上服务器的情况,如果是使用域名连接的话,先ping一下域名看看是否DNS解析尚未生效,如果尚未生效,那么需要等一下,在等待的过程中可以先用IP将服务器配置好。如果ping不通IP的话,那么多半是被墙了,那就只能换掉服务器了。(血的教训:先购买新服务器,再去vultr服务器页面Destroy。反过来的话间隔太小,估计又买到原来的ip了。或者直接开个四五台服务器,然后保留ping结果最好的,删除其余的就好了。)
4.2 创建用户账户(可选)
为了系统安全,一般不建议直接使用root用户对系统做设置,而vultr默认只有root用户,故可以自己新建一个非root但是有sudo权限的用户继续后面的操作,代码如下所示,注意密码强度不能太低。第一条命令创建用户,第二条命令设置密码,第三条命令将该用户加入sudo组,第四条命令切换到该用户。
sudo useradd -m -s /bin/bash trojanuser
sudo passwd trojanuser
sudo usermod -G sudo trojanuser
su -l trojanuser
4.3 创建服务账户
很多看教程的小伙伴问“为什么非要弄这么多用户,直接root不可以吗?”,这里简单回答一下。既然Trojan是占用443端口,使用https协议,所以必然是要安装证书的。本教程使用acme.sh为Trojan生成证书,并配置了acme.sh的自动更新,包括代码和证书的更新。一方面,既然有配置自动更新就有可能出各种问题,毕竟你对更新之后的代码和证书是否可用一无所知。另一方面,acme.sh和Trojan均为开源软件,不一定值得信赖。基于此,为了降低acme.sh和Trojan对系统的影响和其相互影响,故需要单独为acme.sh和Trojan建立没有sudo权限的用户。如果执意使用具有sudo权限的用户,或者头铁直接使用root,出了问题是要自己承担责任的。
这里我们创建两个用户,分别为trojan和acme。其中用户trojan只需要运行trojan服务,无需登录,也无需家目录,故设置为系统用户即可。这里将用户acme也设置为系统用户,但是区别在于acme需要配置acme.sh,故需要家目录。注意到,我并未给用户acme设置密码,所以该用户也不能登录,只能通过其他已经登录的用户切换过去,这样尽可能的保证了系统的安全与任务的独立。因为trojan和acme都需要读写证书文件,所以将acme和trojan添加到同一个用户组certusers,待申请到证书后将证书所有权交给用户组certusers并允许组内用户访问即可。
sudo groupadd certusers
sudo useradd -r -M -G certusers trojan
sudo useradd -r -m -G certusers acme
4.4 安装依赖
由于Debian系列系统和CentOS系列系统使用不同的包管理软件,所以安装软件的命令不一样,下面两个小节自己对照自己系统选择命令。
Ubuntu or Debian
1)更新源
sudo apt update
sudo apt upgrade -y
2)安装acme.sh需要的依赖。
sudo apt install -y socat cron curl
3)启动crontab
sudo systemctl start cron
sudo systemctl enable cron
4)安装Trojan需要的依赖。
sudo apt install -y libcap2-bin xz-utils nano
5)安装Nginx。
sudo apt install -y nginx
CentOS
1)安装acme.sh需要的依赖。
sudo yum install -y socat cronie curl
2)启动crontab
sudo systemctl start crond
sudo systemctl enable crond
3)安装Trojan需要的依赖。
sudo yum install -y xz nano
4)安装Nginx。
sudo yum install -y nginx
4.5 创建证书文件夹
/usr/local/etc/certfiles
sudo mkdir /usr/local/etc/certfiles
sudo chown -R acme:acme /usr/local/etc/certfiles
4.6配置证书
4.6.1 安装acme.sh自动管理CA证书脚本
分别执行如下命令,注意看是否报错。第一条命令切换到用户acme。第二条命令安装acme.sh。第三条命令退出当前用户。第四条命令再次切换到用户acme。注意到这里两次切换用户的操作不能省略,因为安装完acme.sh之后要重新登录当前用户,否则无法识别出acme.sh命令。
sudo su -l -s /bin/bash acme
curl https://get.acme.sh | sh
exit
sudo su -l -s /bin/bash acme
4.6.2 添加cloudflare Global CA Key
不是使用cloudflare DNS的请查看域名申请与解析部分自己做调整!
需要让acme.sh自动管理你的证书,所以需要添加cloudflare的API。登录cloudflare之后定位到:头像>>My Profile>>API Tokens。可以看到这里有两个API Keys。我们需要的是Global API Key。Origin CA Key是不可以使用的。点击View即可查看,注意查看之后自己保存下来,每天可查看次数是有限制的。
然后在Xshell里面执行如下两条命令,注意执行成功没有提示,所以自己不要输错了。其中引号内的内容改为你自己的。注意,本文中代码需要手动修改的地方都使用<>包裹。
export CF_Key="<Your Global API Key>"
export CF_Email="<Your cloudflare account Email>"
4.6.3 申请证书
不是使用cloudflare DNS的请查看域名申请与解析部分自己做调整!
执行如下命令(注意域名<tdom.ml>改为你自己的域名),等待一会儿。
acme.sh --issue --dns dns_cf -d <tdom.ml>
看到下图的提示表示证书申请成功。
申请失败怎么办?证书申请失败的可能性一般有:1. CF_Key或CF_Email填写错误;证书申请次数超限等。此时切忌反复尝试,原因是证书每一个周申请次数是有限制的(20次),如果超限了就需要等一个周或者更换域名了(这个限制是争对每一个子域单独做的限制,所以万一超限了还可以用子域名继续部署)。解决方案是:在上述命令后加–staging参数继续测试。测试通过之后,删除上图所示四个证书文件并取消–staging参数再执行一次。–staging参数申请的证书只作为测试用,客户端是无法认证通过的(提示SSL handshake failed: tlsv1 alert unknown ca),所以使用–staging参数申请到了证书之后要去掉–staging参数重新申请一次。
4.6.4 安装证书
执行如下命令(注意域名<tdom.ml>改为你自己的域名),第一条命令使用acme.sh将证书安装到certfiles目录,这样acme.sh更新证书的时候会自动将新的证书安装到这里。第二条命令是配置acme.sh自动更新和自动更新证书,这样配置完Trojan之后一般不用管服务器。
acme.sh --install-cert -d <tdom.ml> --key-file /usr/local/etc/certfiles/private.key --fullchain-file /usr/local/etc/certfiles/certificate.crt
acme.sh --upgrade --auto-upgrade
4.6.5 修改权限
最后还要允许组内用户访问证书。可通过如下命令实现。第一条命令将证书文件夹所在用户组改为certusers。第二条命令是赋予证书文件夹组内用户读取权限。运行这两条命令之后用户trojan就有权限读取证书了。第三条命令退出用户acme,因为证书已经安装完成。
chown -R acme:certusers /usr/local/etc/certfiles
chmod -R 750 /usr/local/etc/certfiles
exit
4.7 配置Trojan
4.7.1 安装Trojan
分别执行如下四个命令,注意看是否报错。
sudo
sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)"
sudo chown -R trojan:trojan /usr/local/etc/trojan
sudo cp /usr/local/etc/trojan/config.json /usr/local/etc/trojan/config.json.bak
sudo nano /usr/local/etc/trojan/config.json
/usr/local/etc/certfiles/certificate.crt/usr/local/etc/certfiles/private.keyCtrl+OCtrl+X0.0.0.0::
4.7.2 启动Trojan
1)修改Trojan启动用户
执行如下命令,打开trojan.service文件,并将用户修改为trojan。
sudo nano /etc/systemd/system/trojan.service
添加用户效果如图所示,注意等号旁边没有空格。
然后重新加载配置文件。
sudo systemctl daemon-reload
2)配置Trojan监听443端口
执行如下命令,赋予Trojan监听1024以下端口的能力,使得Trojan可以监听到443端口。这是由于我们使用非root用户启动Trojan,但是Linux默认不允许非root用户启动的进程监听1024以下的端口,除非为每一个二进制文件显式声明。
sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/trojan
3)使用systemd启动Trojan
Trojan启动、查看状态命令分别如下,第一条是启动Trojan,第二条是查看Trojan运行状态。启动之后再查看一下状态,Trojan显示active (running)即表示正常启动了。
sudo systemctl restart trojan
sudo systemctl status trojan
4)更新证书
sudo -u trojan killall -s SIGUSR1 trojan
首先,编辑用户trojan的crontab文件
sudo -u trojan crontab -e
在文件末尾添加一行如下,该行表示每个月1号的时候运行命令killall -s SIGUSR1 trojan,由于是使用用户trojan运行的,故不需要在前面加sudo -u trojan。
0 0 1 * * killall -s SIGUSR1 trojan
最后查看crontab是否生效。
sudo -u trojan crontab -l
5)更新Trojan
n
sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)"
sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/trojan
sudo systemctl restart trojan
4.8 配置Nginx
4.8.1 写入虚拟主机到Nginx配置文件
由于Nginx配置在Debian系列系统和CentOS系列系统组织方式不同,所以配置文件位置和使用方式有细微区别,为了统一,我将CentOS系列系统的组织结构做细微调整。
/etc/nginx/sites-available//etc/nginx/sites-enabled/
/etc/nginx/conf.d/
CentOS
按上述分析,我们使用下面两条命令在/etc/nginx/中添加两个文件夹。
sudo mkdir /etc/nginx/sites-available
sudo mkdir /etc/nginx/sites-enabled
/etc/nginx/sites-enabled/
sudo nano /etc/nginx/nginx.conf
配置文件修改结果如下图所示。
CentOS反向代理需要配置SELinux允许httpd模块可以联网,否则服务器会返回502错误。
sudo setsebool -P httpd_can_network_connect true
Ubuntu or Debian
使用如下命令关闭Nginx默认虚拟主机。
sudo rm /etc/nginx/sites-enabled/default
写入配置
sudo nano /etc/nginx/sites-available/<tdom.ml>
基于综述部分讲解的Trojan工作原理,现给定Nginx虚拟主机如下所示。这些虚拟主机可以直接拷贝到上面虚拟主机配置文件中再修改为你自己的,其中要修改的地方包括:
server {
listen 127.0.0.1:80 default_server;
server_name <tdom.ml>;
location / {
proxy_pass https://www.ietf.org;
}
}
server {
listen 127.0.0.1:80;
server_name <10.10.10.10>;
return 301 https://<tdom.ml>$request_uri;
}
server {
listen 0.0.0.0:80;
listen [::]:80;
server_name _;
return 301 https://$host$request_uri;
}
解释一下这些虚拟主机的一些细节:第一个server接收来自Trojan的流量,与上面Trojan配置文件对应;第二个server也是接收来自Trojan的流量,但是这个流量尝试使用IP而不是域名访问服务器,所以将其认为是异常流量,并重定向到域名;第三个server接收除127.0.0.1:80外的所有80端口的流量并重定向到443端口,这样便开启了全站https,可有效的防止恶意探测。注意到,第一个和第二个server对应综述部分原理图中的蓝色数据流,第三个server对应综述部分原理图中的红色数据流,综述部分原理图中的绿色数据流不会流到Nginx。
sudo ln -s /etc/nginx/sites-available/<tdom.ml> /etc/nginx/sites-enabled/
4.8.2 启动Nginx
Nginx启动命令和Trojan一样,就不过多解释了。
sudo systemctl restart nginx
sudo systemctl status nginx
4.8.3 与现有Nginx服务集成
如果你本机已经有Nginx服务,那么Nginx配置文件需要做适当修改以和现有服务兼容。
在原服务与Trojan使用同一个域名且原来是监听443端口的情况下,那么需要将你的ssl配置删除并将监听地址改为第一个server监听的地址127.0.0.1:80,然后直接用修改好的server代替上述配置文件中第一个server即可。这样https加密部分将会由Trojan处理之后转发给Nginx而不是由Nginx处理,原来的服务对于客户端来说就没有变化。
如果原来的服务与Trojan使用不同的域名,建议是修改Trojan与原来的服务使用同一个域名,如果非要使用不同的域名,请参考第3点。
如果原来的服务就监听了多个域名,那么请自己琢磨Nginx的sni,参考连接:ngx_stream_ssl_preread_module。
如果原来的服务是监听80端口,想要继续监听80端口那么直接去除第三个server即可,如果要改为监听443端口参考第1点。
4.9 配置Trojan和Nginx开机自启
虽然开机自启一般用不着,除非vultr机房停电,但是反正也没什么代价,弄一下吧。
sudo systemctl enable trojan
sudo systemctl enable nginx
4.10 检查服务器是否配置成功
到这里服务器就配置完成了。此时你可以在浏览器里面访问你的网站看是否能够访问,如果你的网站可以访问了,那么就一切正常啦。
另外,基于以上考虑到的可能的恶意探测,可以验证一下以下情况是否正常。
- 浏览器中使用ip访问:重定向到https://tdom.ml;
- 浏览器中使用https://ip访问:重定向到https://tdom.ml(跳转的时候浏览器可能提示不安全是正常的);
- 浏览器中使用tdom.ml访问:重定向到https://tdom.ml。
4.11 启动bbr(可选,建议)
启动bbr需要Linux内核版本在4.10及以上,如果低于该版本需要自己升级(这不在本教程范围之后)内核版本,保证内核版本不低于4.10。查看系统内核版本命令如下。
uname -a
bbr是谷歌开发的网络控制算法,可以加快访问速度。执行下面命令查看当前系统是否启用bbr。
sudo sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr
直接将下面三条命令拷贝粘贴到Xshell里面执行即可启动bbr,检查启动状态同上。
sudo bash -c 'echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf'
sudo bash -c 'echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf'
sudo sysctl -p
4.12 配置防火墙(可选)
只打开22、80和443端口可以有效的阻止外部恶意流量,降低服务器暴露的风险。此步骤非必须,而且自己有其他服务记得其他服务的端口也要处理。
本文以ufw为例配置防火墙,ufw是一个很好用的防火墙配置命令,可以简化操作,减少错误的发生。
Debian or Ubuntu
执行如下命令安装ufw:
sudo apt install -y ufw
CentOS
执行如下两个命令安装ufw:
sudo yum install -y epel-release
sudo yum install -y ufw
IPV6=yesIPV6=no
sudo nano /etc/default/ufw
执行如下命令即可成功配置防火墙。注意,如果ssh端口不是22那么第一行需要调整(将ssh改为端口号)。
sudo ufw disable
sudo ufw allow ssh
sudo ufw allow https
sudo ufw allow http
sudo ufw enable
sudo ufw status
sudo ufw status verbose
另外,如果对Trojan不放心,那么可以参考trojan wiki,优化防火墙配置,使得Trojan只能给127.0.0.1:80发送数据和响应外部请求。
5. 配置trojan客户端
Trojan-Qt5是一个专为trojan开发的跨平台的GUI客户端,目前支持Windows、Linux、Mac。软件下载地址:Trojan-Qt5 。此处以Windows为例,由于是跨平台软件,故除了安装方式不同以外(安装软件应该都会吧,哈哈),配置方面Linux和Mac的配置与Windows大同小异,不再赘述。
连接》添加》手动
在弹出的窗口中按照如下的内容填写(其他选项若不懂请保持默认):
设置》常规设置
现在可以使用工具栏快捷方式管理节点了,包括连接、断开连接、测速等。点击连接,如果节点信息没有输入错误且软件未报错的情况下,此时已经可以使用任意浏览器访问google了。
6. 配置SwitchyOmega插件
在Google Chrome或Firefox浏览器安装这个插件可以更方便的实用代理,比如你访问的某个网站不再GFWlist里,可以通过配置此插件轻松访问。
7. 其他客户端部署指南
Linux系统CLI客户端:Linux系统CLI客户端安装方式与服务端一样,配置文件参考客户端修改即可;
IOS客户端:美区ID + [ Pharos Pro | Shadowrocket ];
Android客户端: igniter 。
8. FQA
SSL handshake failed