优米格
分享有营养的

科学上网新姿势-Trojan小白搭建完全图文教程

1.本文简介

本文总结了自己在VPS搭建 Trojan-GFW 代理过程中遇到的各种坑,以及最后的解决方案,以供大家参考。

本文的宗旨在于,将大量重复性的工作集中到配置过程中,以让使用过程尽量简单。所以本文的配置过程相较于网上的某些教程稍微复杂一点,但是如果严格按照本文配置过程配置的话,那么配置完成之后服务器端就可以几乎不用搭理他了,然后客户端几乎是拿到手就可以使用,特别适合有好几个人一起共享的情况。

本文将按操作顺序介绍部署用于trojan代理服务的VPS服务器的详细过程,按照步骤操作一切正常的话一小时之内即可配置成功。如果配置过程中有什么疑问,欢迎在留言区交流!

2.Trojan工作原理浅析

Trojan是一个比较新的翻墙软件,在设计时采用了更适应国情的思路。在穿透GFW时,人们认为强加密和随机混淆可能会欺骗GFW的过滤机制。然而,Trojan实现了这个思路的反面:它模仿了互联网上最常见的HTTPS协议,以诱骗GFW认为它就是HTTPS,从而不被识别。

trojan-gfw-tutorial-0-1-1.jpg

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服务器购买

推荐一下搬瓦工的CN2 GIA,注册教程-> 史上最详细搬瓦工VPS注册/购买图文教程(内附优惠券)

4.1 注册vultr

我使用的服务器是vultr。主要因为其按小时计费,随时可以停用服务器。这一点很重要,现在gfw相当高,所以你买到的机器很可能是已经被墙了的。其次,vultr本身没有被墙,这一点很重要,不然就是先有鸡还是先有蛋的问题了。当然,可以支付宝或微信付款也是一个加分点。现在注册立马获得$100优惠券,直接抵用消费。注册地址: https://www.vultr.com/,网页右上角有个“Create Account”就是注册的地方了,接下来就是注册并激活账号了。

4.2 充值

在购买服务器之前需要先充值。登陆vultr之后如图Billing->Alipay,选好要充值的金额数,然后Pay with Alipay即可跳转到支付宝扫码支付页面。

trojan-gfw-tutorial-0-1-2.jpg

4.3 购买服务器

点击vultr网页右上角的蓝色+图标即可为账户添加服务器。

trojan-gfw-tutorial-0-1-3.jpg

注意: 向下滚动有很多选项,不要直接点击Deploy Now,这样会使用默认参数,但不是我们想要的!

第一个选项为选择服务器类型(Choose Server),这里选择Cloud Compute。

trojan-gfw-tutorial-0-1-4.jpg

第二个选项为选择服务器地址(Server Location),建议选择硅谷(Silicon Valley,离google最近),而不要选择日本(用的人多,大部分IP已经被墙);

trojan-gfw-tutorial-0-1-5.jpg

第三个选项为选择服务器类型(Server Type),即选择服务器操作系统。作为示例,这里我们选择选择Ubuntu 18.10 x64(强烈推荐),不过系统要求部分所列出的操作系统均已测试通过,同一个发行版本的系统在我要求以下的版本测试不通过。注意如果你使用其他vps服务商的vps,可能有minimal选项,不能选择那一个,很多依赖乃没有安装,会导致自己配置失败(当然也可以,缺少哪个依赖自己再用apt安装就好了,例如:apt install -y sudo,sudo apt install -y vim等)。最后,如果你确实是有其他系统或者比较旧的系统版本需要安装trojan的话,建议使用docker,正文中部分配置只需要做细微修改即可,为了文章的整体性我就不放在正文了,请参考 评论区

trojan-gfw-tutorial-0-1-6.jpg

第四个选项为选择服务器大小(Server Size),即选择服务器硬件性能。因为我们使用VPS服务器翻墙,所以性能瓶颈不在配置,而在网络带宽之类的。由于vultr的服务器带宽都是100M的,所以服务器当然是往便宜了选。当然,$2.5/mo的一般都是缺货的。选择$5/mo的就好,一个月三十几块钱,要是有好几个人一起分担的话就相当实惠了。

trojan-gfw-tutorial-0-1-7.jpg

第五、六、七三个选项可以不用管它。

第八条要求为即将部署的服务器命名并给一个标签,随意就好。

此时可以点击右下角的现在部署(Deploy Now),vultr即开始分配资源,安装系统。此时Servers页面可以看到服务器信息,状态显示installing。当状态切换为Running的时候,服务器就可以使用了。

trojan-gfw-tutorial-0-1-8.jpg

4.4 服务器信息查看

服务器安装结束之后在Servers页面点击刚才购买的服务器名字即可跳转到服务器详情页。如图右上角有一个View console可以直接通过网页连接到服务器,但是由于它不支持复制粘贴,不方便,我们需要使用第三方工具连接到服务器。所以需要知道IP、用户名和密码,如图左下角。

trojan-gfw-tutorial-0-1-9.jpg

3.域名申请与解析

trojan需要一个域名用来做伪装,所以需要先申请一个域名。如果你只是用来翻墙没有其他作用,那么建议注册一个免费域名即可。本教程使用freenom免费域名和cloudflareDNS为例。

如果自己已经有域名了那么可以不用申请,直接用一个子域名就可以了。如果你的域名不是在cloudflare购买,那么你有两个方案可用。1. 将你的域名转移到cloudflare解析,这个对于已经有域名的来说应该不难,就不多说了;2. 下文与cloudflare相关的部分自行参考这个文档做调整,也很简单,找到你自己的DNS服务商,按照指引操作即可。建议是先严格按照教程操作成功之后再改为自己的域名,否则难免出奇怪的问题。

3.1 freenom免费域名申请

我自己在使用Edge注册freenom的时候会失败,使用chrome(试试它的隐身模式)才可以,你如果也失败了请换一个浏览器试试!

freenom在检测到ip对应的国家和你填写的个人信息不一致就会不允许你注册,所以要么不要挂VPN去申请域名,要么去网上生成虚拟美国人信息。

freenom注册地址在这里 ,支持简体中文,可以自行切换。在寻找一个免费域名的输入框中输入自己理想的域名点击检查可用性,如图所示。检查到可用的中意的域名之后,点击现在获取即可锁定该域名。

trojan-gfw-tutorial-0-1-10.jpg

现在可以点击完成按钮跳转到DNS配置和申请年限界面。点击Use DNS>>Use Frenom DNS Service。两个IP address框都直接输入0.0.0.0(这个没用,一会儿会改到cloudflareDNS)。Period选择12 Months @ FREE,然后点击“Continue”,输入并验证你的邮箱和信息即可。注意上面的提示,不要挂VPN,很多人会卡在验证账户的地方,一般都是挂了VPN导致的

在freenom申请的免费域名是可以无限免费续期的,除非被人花钱抢注,所以自己每隔几个月回来续期一下就可以啦。反正这个域名只是拿来翻墙用,被人抢注了马上换一个成本也不大。如果介意这个的话,建议自己买付费域名,国外域名服务商推荐namecheap,不要买国内域名服务商的域名
使用期限设置

3.2 注册Cloudflare

cloudflare注册地址在这里 ,网页右上角有个Sign up就是注册的地方了,接下来就是注册并激活账号了。注册完成之后会让你添加你的网站,输入你刚才申请的网站之后点击”Add site”。

trojan-gfw-tutorial-0-1-11.jpg

接下来是一个提示页面,直接下一步即可。然后计划选择FREE就好,够用了,然后点击confirm plan。

trojan-gfw-tutorial-0-1-12.jpg

然后cloudflare会导入现有的DNS记录,你也可以自己再添加,也可以在这里修改,现在需要将DNS记录指向自己的服务器。假设你的服务器地址是10.10.10.10,那么如下图所示:将域名A记录指向你的服务器即可。如果IP地址是IPv6的,那么需要添加的是AAAA记录而不是A记录(客户端也得有IPv6地址才能连接上服务器)。vultr的服务器是IPv4和IPv6地址都有的,可以即添加A记录又添加AAAA记录,客户端会自动选择他将会使用的IP地址版本。添加好记录之后,点击”continue”。 注意:如果使用CDN(On Cloudflare),即DNS记录后面的云是橙色的,使用方法参考:启用cloudflare cdn之后v2ray报403错误

trojan-gfw-tutorial-0-1-13.jpg

接下来就是最关键的一步,将你的DNS服务器转移到cloudflare。在这里你可以看到cloudflare让你将ns01.freenom.comns02.freenom.com分别改为leah.ns.cloudflare.comvern.ns.cloudflare.com(每个人的可能不会一样,请按照cloudflare的提示)。

现在登陆freenom,点击域名后面对应的Manage Domain

trojan-gfw-tutorial-0-1-14.jpg

然后定位到Management Tools>>Nameservers。将DNS服务器改为Use custom nameservers (enter below),然后在Nameserver 1Nameserver 2输入cloudflare给的两个dns,如图所示,点击change Nameservers即可。然后回到cloudflare点击“Continue”。

trojan-gfw-tutorial-0-1-15.jpg

此时cloudflare会检测你的dns服务器是否已经切换到了cloudflare,如果没有检测到已经切换的话,稍作等待即可。最终,DNS配置结果如下图所示,即

trojan-gfw-tutorial-0-1-13.jpg

4.VPS服务器部署

跳过了上面系统选择与购买部分的要注意啦,本教程目前测试通过操作系统版本是Ubuntu 16.04 or Debian 9 or CentOS 7及以上,更低版本系统无法成功搭建,其他系统尚未测试!

4.1 远程工具安装

本文使用的第三方远程管理工具叫做Xshell。Xshell学生和家庭版是免费的,可以放心试用(觉得好用的话,不差钱的各位也可以注册一下支持软件开发者噢)。安装好Xshell之后即可开始连接服务器进行部署了。不过Xshell没有Mac端,所以Mac可以使用其他ssh客户端,甚至直接用终端都可以,用法大同小异。

安装使用过程参考: 史上最详细搬瓦工VPS注册/购买图文教程(内附优惠券)

连接上服务器后就可以开始安装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用于存放证书。第二条命令将证书文件夹所有者改为acme,使得用户acme有权限写入证书。

复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
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>

看到下图的提示表示证书申请成功。

trojan-gfw-tutorial-0-1-16.jpg

申请失败怎么办?证书申请失败的可能性一般有: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

分别执行如下四个命令,注意看是否报错。

第一个命令是安装Trojan,安装完成一般会提示版本号注意看是否是最新版本。第二个命令是将Trojan配置文件的所有者修改为用户trojan,由于使用sudo安装的Trojan,该配置文件默认是属于root用户的,而我们需要使用用户trojan运行Trojan,不修改所有者会导致启动Trojan遇到权限问题。第三个命令备份Trojan配置文件,以防万一。第四个命令是使用nano修改配置文件。

复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
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

第四个命令执行完之后屏幕会显示Trojan的配置文件,定位到password、cert和key并修改。密码按自己喜好,cert和key分别改为/usr/local/etc/certfiles/certificate.crt/usr/local/etc/certfiles/private.key。编辑完成配置文件之后按屏幕下方快捷键提示(^O和^X即:Ctrl+OCtrl+X)保存并退出nano。修改之后的config文件如图所示。另外,如果有IPv6地址,将local_addr的0.0.0.0改为::才可以使用。

trojan-gfw-tutorial-0-1-17.jpg

4.7.2 启动Trojan

1)修改Trojan启动用户

执行如下命令,打开trojan.service文件,并将用户修改为trojan。

复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
sudo nano /etc/systemd/system/trojan.service

添加用户效果如图所示,注意等号旁边没有空格。

trojan-gfw-tutorial-0-1-18.jpg

然后重新加载配置文件。

复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
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)更新证书

当acme.sh重新安装证书之后,需要通知Trojan重新加载证书。最简单的方案是每三个月登录服务器重启Trojan,但是不够完美,毕竟重启的时候会导致服务中断。其实Trojan有实现reload certificate and private key 功能,只需要在证书更新后给Trojan发送SIGUSR1消息即可。Trojan收到SIGUSR1消息后便会自动加载新的证书和密钥文件,这样就不用重启Trojan了。手动给Trojan发送SIGUSR1消息的命令是sudo -u trojan killall -s SIGUSR1 trojan,但是这样也不够完美,也得每三个月登录服务器运行一次该命令。其实我们可以给用户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

如果Trojan版本有更新(可以去 这里 查看是否有更新),那么使用本教程搭建的服务器端更新Trojan版本只需要三条命令即可,不过要注意的是,第一条命令会提示是否覆盖配置文件,如果没有必要请回答n,否则配置文件将会被覆盖(如果不小心覆盖了就得自己重新编辑了)。第二条命令重新赋予Trojan监听443端口的能力。第三条命令重启Trojan。

复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
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系列系统的组织结构做细微调整。

在Debian系列系统中,Nginx的虚拟主机配置文件在/etc/nginx/sites-available/文件夹中,如果要开启某一个虚拟主机,则建立一个软连接到/etc/nginx/sites-enabled/文件夹并重启Nginx即可。默认虚拟主机在/etc/nginx/sites-enabled/文件夹,需要关闭掉,否则会冲突。

在CentOS系列系统中,Nginx的虚拟主机配置文件在/etc/nginx/conf.d/文件夹中以.conf后缀保存,写入之后就可以使用。默认虚拟主机集成在Nginx配置文件/etc/nginx/nginx.conf中,需要打开将其中的server块删除,否则会冲突。Debian系列系统中的/etc/nginx/sites-enabled/和/etc/nginx/sites-available/文件夹结构在CentOS系列系统中是没有的,不过这个策略很不错,可以很方便的开启和关闭虚拟主机,我这里手动调整一下。

CentOS

按上述分析,我们使用下面两条命令在/etc/nginx/中添加两个文件夹。

复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
sudo mkdir /etc/nginx/sites-available
sudo mkdir /etc/nginx/sites-enabled

执行如下命令使用nano打开Nginx配置文件,删除其中server块,并添加对/etc/nginx/sites-enabled/文件夹的索引。

复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
sudo nano /etc/nginx/nginx.conf

配置文件修改结果如下图所示。

trojan-gfw-tutorial-0-1-19.jpg

CentOS反向代理需要配置SELinux允许httpd模块可以联网,否则服务器会返回502错误。

复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
sudo setsebool -P httpd_can_network_connect true

Ubuntu or Debian

使用如下命令关闭Nginx默认虚拟主机。

复制复制复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
sudo rm /etc/nginx/sites-enabled/default

写入配置

1)执行如下命令,使用nano添加虚拟主机。(注意域名<tdom.ml>改为你自己的域名,这是虚拟主机的文件名,只是用来自己识别的。如果你已经有配置虚拟主机在这个文件中,可以自己使用cp命令备份一下或者换个名字也行,等介绍完基本配置再讲如何与现有服务集成。)

复制复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
sudo nano /etc/nginx/sites-available/<tdom.ml>

基于综述部分讲解的Trojan工作原理,现给定Nginx虚拟主机如下所示。这些虚拟主机可以直接拷贝到上面虚拟主机配置文件中再修改为你自己的,其中要修改的地方包括:

  • 第4行的server_name的值<tdom.ml>改为你自己的域名;
  • 第7行的proxy_pass随便指向一个没有敏感信息的网站都可以,这就是你要反向代理的网站,这里我是用了RFC文档的地址;
  • 第15行的server_name的值<10.10.10.10>改为你自己的IP;
  • 第17行<tdom.ml>改为自己的域名,注意别填错了。
复制复制复制复制复制复制复制复制复制复制复制复制复制
复制
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。

2)使能配置文件注意域名<tdom.ml>改为你自己的域名

复制复制复制复制复制复制复制复制复制复制复制复制
复制
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即表示启动了bbr,可以跳过下面启动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地址那么需要执行如下命令,将IPV6=yes修改为IPV6=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大同小异,不再赘述。

拷贝Trojan-Qt5-Windows文件夹到电脑里面,并启动Trojan-Qt5.exe。点击菜单栏的:连接》添加》手动

trojan-gfw-tutorial-0-1-20.jpg

trojan-gfw-tutorial-0-1-21.jpg

在弹出的窗口中按照如下的内容填写(其他选项若不懂请保持默认):

  • 配置名称 : 服务器节点的名称,随便填写;
  • 服务器地址: 填写服务器域名:<tdom.ml>
  • 密钥: 填入你配置trojan时设置的密码,若安装了Trojan-Panel,则填写用户名和密码,使用英文冒号分隔;
  • 自动化: 勾选后会在程序启动时自动连接该节点,即将当前节点作为默认节点,可按需修改。

修改完参数之后,点击OK完成服务器节点的添加。另外托盘区有两个地方需要求改,如下图所示。另外还可以在设置》常规设置里面配置开机自启。

trojan-gfw-tutorial-0-1-22.jpg

trojan-gfw-tutorial-0-1-24.jpg

trojan-gfw-tutorial-0-1-23.jpg

现在可以使用工具栏快捷方式管理节点了,包括连接、断开连接、测速等。点击连接,如果节点信息没有输入错误且软件未报错的情况下,此时已经可以使用任意浏览器访问google了。

trojan-gfw-tutorial-0-1-25.jpg

6. 配置SwitchyOmega插件

在Google Chrome或Firefox浏览器安装这个插件可以更方便的实用代理,比如你访问的某个网站不再GFWlist里,可以通过配置此插件轻松访问。

7. 其他客户端部署指南

Linux系统CLI客户端:Linux系统CLI客户端安装方式与服务端一样,配置文件参考客户端修改即可;

IOS客户端:美区ID + [ Pharos Pro | Shadowrocket ];

Android客户端: igniter

8. FQA

客户端和服务器报错SSL handshake failed:1. 检查客户端密码是否与服务器密码一致,2. 检查是否开启了Clouldflare的CDN(可ping域名看IP是否与服务器IP一致)。

赞(26)
未经允许禁止转载:优米格 » 科学上网新姿势-Trojan小白搭建完全图文教程

评论 27

  1. #1

    为什么有很多地方没有图?

    燃喉5年前 (2020-05-07)回复
    • 马上补充

      michael5年前 (2020-05-08)回复
      • 首先谢谢老哥,但还是少图

        燃喉5年前 (2020-05-09)回复
  2. #2

    已经注册好域名,在Cloudflare解析DNS的时候遇到问题了。解析不到IP。IP是能PING通的。Cloudflare解析DNS是不是需要很长时间才能收录进去。

    啊光5年前 (2020-05-14)回复
    • 不是,一般要先将你域名提供商后台管理,将DNS改为cf的,然后再去cf解析域名。

      michael5年前 (2020-05-14)回复
  3. #3

    用国内的域名和DNS解析是否可以,是否安全

    啊光5年前 (2020-05-14)回复
    • 最好不能用国内供应商的域名,.cn的更不能用

      michael5年前 (2020-05-14)回复
  4. #4

    全程照做, 卡在 4.6.3 申请证书 ,使用命令 acme.sh –issue –dns dns_cf -d
    提示如下错误:
    [Fri May 15 15:59:04 UTC 2020] Adding record
    [Fri May 15 15:59:04 UTC 2020] Add txt record error.
    [Fri May 15 15:59:04 UTC 2020] Error add txt for domain:_acme-challenge.
    [Fri May 15 15:59:04 UTC 2020] Please check log file for more details: /home/acme/.acme.sh/acme.sh.log

    nightcat5年前 (2020-05-16)回复
    • 请问解决了吗,我也卡在这儿

      xlstone5年前 (2020-06-04)回复
  5. #5

    安装acme.sh时候失败了。麻烦大佬帮忙看看。
    curl https://get.acme.sh | sh
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    0 0 0 0 0 0 0 0 –:–:– –:–:– –:–:–100 775 0 775 0 0 6215 0 –:–:– –:–:– –:–:– 6250
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    0 0 0 0 0 0 0 0 –:–:– –:–:– –:–:–100 192k 100 192k 0 0 1083k 0 –:–:– –:–:– –:–:– 1088k
    [Thu May 21 17:02:36 UTC 2020] Installing from online archive.
    [Thu May 21 17:02:36 UTC 2020] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
    sh: 6320: cannot create master.tar.gz: Permission denied
    [Thu May 21 17:02:36 UTC 2020] Download error.

    tofogo5年前 (2020-05-22)回复
  6. #6

    安装acme.sh时候失败了。麻烦大佬帮忙看看。curl https://get.acme.sh | sh

    sh: 6320: cannot create master.tar.gz: Permission denied
    [Thu May 21 17:02:36 UTC 2020] Download error.

    tofogo5年前 (2020-05-22)回复
  7. #7

    所有步骤均正常 不过没有连上访问网页会下载一个 generate_204的文件

    hhh5年前 (2020-05-26)回复
  8. #8

    666 搞了两天 连上了

    hhh5年前 (2020-05-30)回复
    • 我也是这样,你是怎么解决的?带带弟弟

      溶酶菌3年前 (2021-11-12)回复
  9. #9

    博主你好,我最近也兴致冲冲用这个Trojan搭了个梯子,可是我的VPS还有web服务,结果好了,端口被占用网站打不开了。所以很好奇如果把Trojan的443端口改别的,会不会容易被墙?是否有这方面的经验呢?因为我那个是web环境,不敢因为梯子连这个IP都被端了

    疯狂的懒人5年前 (2020-06-02)回复
    • 不会的,https流量跟web环境是一样的,至少不会因为这个原因被端。

      michael5年前 (2020-06-03)回复
  10. #10

    博主你好,我按照步骤一步步做了,一直卡在安装证书那个步骤
    Add txt record error.
    [Wed Jun 3 16:12:26 UTC 2020] Error add txt for domain:_acme-challenge.xxxxx.com
    [Wed Jun 3 16:12:26 UTC 2020] _on_issue_err
    [Wed Jun 3 16:12:26 UTC 2020] Please check log file for more details: /home/acme/.acme.sh/acme.sh.log

    xlstone5年前 (2020-06-04)回复
    • 我也是遇到了同样的问题,请问解决了吗?

      尚善若水4年前 (2021-03-04)回复
  11. #11

    没有可用软件包 nginx 怎么解决·博主 谢谢你 求解 百度一大堆 都试了 没用·

    小蝌蚪19904年前 (2020-12-02)回复
  12. #12

    在 4.6.3 申请证书 ,使用命令 acme.sh –issue –dns dns_cf -d
    提示如下错误:
    [Fri May 15 15:59:04 UTC 2020] Adding record
    [Fri May 15 15:59:04 UTC 2020] Add txt record error.
    [Fri May 15 15:59:04 UTC 2020] Error add txt for domain:_acme-challenge.
    [Fri May 15 15:59:04 UTC 2020] Please check log file for more details: /home/acme/.acme.sh/acme.sh.log
    ———————————————–
    这个是免费域名的问题,换个付费域名就ok了,zerossl已经不支持免费域名申请证书了

    evanlo4年前 (2021-08-02)回复
  13. #13

    膜拜大佬 真香啊 youtube 5万Kbps 虽然不看但trojan速度是真的快 再也不用担心梯子不安全了

    折腾怪3年前 (2022-04-09)回复
  14. #14

    命令 sudo systemctl restart nginx
    出现:Job for nginx.service failed because the control process exited with error code.
    See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details
    什么原因?端口也看了,找不出来问题

    3年前 (2022-09-25)回复
    • `systemctl status nginx.service` 执行这个命令截个图 或者 `tail -f /var/log/nginx/error.log` 看下错误信息。

      巴巴主机3年前 (2022-09-25)回复
      • 可能之前配置错了,我重新装了一边,一切顺利,但是我客户端用Trojan-Qt5.1.4.0,已经连接,但是不能访问外网

        3年前 (2022-09-26)回复
      • 对,我想起来了sudo nano /etc/nginx/nginx.conf 这个文件我默认了,没有进行修改,就没问题了,但是一切做完后,不能访问国际网

        3年前 (2022-09-26)回复
      • [ERROR] 117.154.89.143:1129 SSL handshake failed: sslv3 alert certificate unknown
        17.154.89.143:1129 disconnected, 0 bytes received, 0 bytes sent, lasted for 0 seconds
        [ERROR] 117.154.89.143:1128 SSL handshake failed: sslv3 alert certificate unknown
        [INFO] 117.154.89.143:1128 disconnected, 0 bytes received, 0 bytes sent, lasted for 0 seconds
        [WARN] 117.154.89.143:1386 not trojan request, connecting to 127.0.0.1:80
        [WARN] 117.154.89.143:1388 not trojan request, connecting to 127.0.0.1:80
        [INFO] 117.154.89.143:1388 disconnected, 606 bytes received, 600 bytes sent, lasted for 65 seconds
        [INFO] 117.154.89.143:1386 disconnected, 13330 bytes received, 1869 bytes sent, lasted for 66 secon>
        [ERROR] 45.79.53.162:8662 SSL handshake failed: stream truncated
        [INFO] 45.79.53.162:8662 disconnected, 0 bytes received, 0 bytes sent, lasted for 0 seconds

        3年前 (2022-09-27)回复
  15. #15

    ERROR] 117.154.89.143:1129 SSL handshake failed: sslv3 alert certificate unknown
    17.154.89.143:1129 disconnected, 0 bytes received, 0 bytes sent, lasted for 0 seconds
    [ERROR] 117.154.89.143:1128 SSL handshake failed: sslv3 alert certificate unknown
    [INFO] 117.154.89.143:1128 disconnected, 0 bytes received, 0 bytes sent, lasted for 0 seconds
    [WARN] 117.154.89.143:1386 not trojan request, connecting to 127.0.0.1:80
    [WARN] 117.154.89.143:1388 not trojan request, connecting to 127.0.0.1:80
    [INFO] 117.154.89.143:1388 disconnected, 606 bytes received, 600 bytes sent, lasted for 65 seconds
    [INFO] 117.154.89.143:1386 disconnected, 13330 bytes received, 1869 bytes sent, lasted for 66 secon>
    [ERROR] 45.79.53.162:8662 SSL handshake failed: stream truncated
    [INFO] 45.79.53.162:8662 disconnected, 0 bytes received, 0 bytes sent, lasted for 0

    3年前 (2022-09-28)回复

合作&反馈&投稿

商务合作、问题反馈、投稿,欢迎联系

广告合作侵权联系