综述
本文简介
本文总结了自己在VPS搭建Trojan-GFW代理过程中遇到的各种坑,以及最后的解决方案,以供大家参考。
本文的宗旨在于,将大量重复性的工作集中到配置过程中,以让使用过程尽量简单。所以本文的配置过程相较于网上的某些教程稍微复杂一点,但是如果严格按照本文配置过程配置的话,那么配置完成之后服务器端就可以几乎不用搭理他了,然后客户端几乎是拿到手就可以使用,特别适合有好几个人一起共享的情况。
本文将按操作顺序介绍部署用于trojan代理服务的VPS服务器的详细过程,按照步骤操作一切正常的话一小时之内即可配置成功。如果配置过程中有什么疑问,欢迎在留言区交流!
Trojan工作原理浅析
Trojan是一个比较新的翻墙软件,在设计时采用了更适应国情的思路。在穿透GFW时,人们认为强加密和随机混淆可能会欺骗GFW的过滤机制。然而,Trojan实现了这个思路的反面:它模仿了互联网上最常见的HTTPS协议,以诱骗GFW认为它就是HTTPS,从而不被识别。 如图所示,Trojan工作在443端口,并且处理来自外界的HTTPS请求,如果是合法的Trojan请求,那么为该请求提供服务,否则将该流量转交给web服务器Nginx,由Nginx为其提供服务。基于这个工作过程可以知道,Trojan的一切表现均与Nginx一致,不会引入额外特征,从而达到无法识别的效果。当然,为了防止恶意探测,我们需要将80端口的流量全部重定向到443端口,并且服务器只暴露80和443端口,这样可以使得服务器与常见的Web服务器表现一致。
前置条件
系统要求:Ubuntu >= 16.04 or Debian >= 9 or CentOS >= 7。
VPS服务器购买
注册vultr
我使用的服务器是vultr。主要因为其按小时计费,随时可以停用服务器。这一点很重要,现在gfw相当高,所以你买到的机器很可能是已经被墙了的。其次,vultr本身没有被墙,这一点很重要,不然就是先有鸡还是先有蛋的问题了。当然,可以支付宝或微信付款也是一个加分点。vultr充值10美元送10美元活动注册地址:https://www.vultr.com。点击链接跳转到vultr,网页右上角有个Create Account就是注册的地方了,接下来就是注册并激活账号了。
最新资讯:vultr充值10美元送50美元活动开始啦,必须是新用户,可支付宝或微信等支付方式,活动注册地址:https://www.vultr.com!
充值
在购买服务器之前需要先充值。登陆vultr之后如图Billing->Alipay,选好要充值的金额数,然后Pay with Alipay即可跳转到支付宝扫码支付页面。
购买服务器
点击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的时候,服务器就可以使用了。
服务器信息查看
服务器安装结束之后在Servers页面点击刚才购买的服务器名字即可跳转到服务器详情页。如图右上角有一个View console可以直接通过网页连接到服务器,但是由于它不支持复制粘贴,不方便,我们需要使用第三方工具连接到服务器。所以需要知道IP、用户名和密码,如图左下角。
域名申请与解析
trojan需要一个域名用来做伪装,所以需要先申请一个域名。如果你只是用来翻墙没有其他作用,那么建议注册一个免费域名即可。本教程使用freenom免费域名和cloudflareDNS为例。
如果自己已经有域名了那么可以不用申请,直接用一个子域名就可以了。如果你的域名不是在cloudflare购买,那么你有两个方案可用。1. 将你的域名转移到cloudflare解析,这个对于已经有域名的来说应该不难,就不多说了;2. 下文与cloudflare相关的部分自行参考这个文档做调整,也很简单,找到你自己的DNS服务商,按照指引操作即可。建议是先严格按照教程操作成功之后再改为自己的域名,否则难免出奇怪的问题。
freenom免费域名申请
我自己在使用Edge注册freenom的时候会失败,使用chrome才可以,你如果也失败了请换一个浏览器试试!
freenom在检测到ip对应的国家和你填写的个人信息不一致就会不允许你注册,所以要么不要挂VPN去申请域名,要么去网上生成虚拟美国人信息。
freenom注册地址在这里https://www.freenom.com,支持简体中文,可以自行切换。在寻找一个免费域名的输入框中输入自己理想的域名点击检查可用性,如图所示。检查到可用的中意的域名之后,点击现在获取即可锁定该域名。
现在可以点击完成按钮跳转到DNS配置和申请年限界面。点击Use DNS>>Use Frenom DNS Service。两个IP address框都直接输入0.0.0.0(这个没用,一会儿会改到cloudflareDNS)。Period选择12 Months @ FREE,然后点击Continue,输入并验证你的邮箱和信息即可。注意上面的提示,不要挂VPN,很多人会卡在验证账户的地方,一般都是挂了VPN导致的。
在freenom申请的免费域名是可以无限免费续期的,除非被人花钱抢注,所以自己每隔几个月回来续期一下就可以啦。反正这个域名只是拿来翻墙用,被人抢注了马上换一个成本也不大。如果介意这个的话,建议自己买付费域名,国外域名服务商推荐namecheap,不要买国内域名服务商的域名。
注册cloudflare
cloudflare注册地址在这里https://www.cloudflare.com,网页右上角有个Sign up就是注册的地方了,接下来就是注册并激活账号了。注册完成之后会让你添加你的网站,输入你刚才申请的网站之后点击Add site。
接下来是一个提示页面,直接下一步即可。然后计划选择FREE就好,够用了,然后点击confirm plan。
然后cloudflare会导入现有的DNS记录,你也可以自己再添加,也可以在这里修改,现在需要将DNS记录指向自己的服务器。假设你的服务器地址是10.10.10.10,那么如下图所示:将域名A记录指向你的服务器即可,www的A记录删除不用。如果IP地址是IPv6的,那么需要添加的是AAAA记录而不是A记录(客户端也得有IPv6地址才能连接上服务器)。vultr的服务器是IPv4和IPv6地址都有的,可以即添加A记录又添加AAAA记录,客户端会自动选择他将会使用的IP地址版本。添加好记录之后,点击continue。注意:不能使用CDN(On Cloudflare),即DNS记录后面的云需要是灰色的而不是橙色的,否则会导致握手失败无法连接上服务器,参考trojan issue 70
接下来就是最关键的一步,将你的DNS服务器转移到cloudflare。在这里你可以看到cloudflare让你将ns01.freenom.com和ns02.freenom.com分别改为anna.ns.cloudflare.com和sid.ns.cloudflare.com(每个人的可能不会一样,请按照cloudflare的提示)。
现在登陆freenom,点击域名后面对应的Manage Domain。
然后定位到Management Tools>>Nameservers。将DNS服务器改为Use custom nameservers (enter below),然后在Nameserver 1和Nameserver 2输入cloudflare给的两个dns,如图所示,点击change Nameservers即可。然后回到cloudflare点击Continue。
此时cloudflare会检测你的dns服务器是否已经切换到了cloudflare,如果没有检测到已经切换的话,稍作等待即可。最终,DNS配置结果如下图所示,即
VPS服务器部署
跳过了上面系统选择与购买部分的要注意啦,本教程目前测试通过操作系统版本是Ubuntu 16.04 or Debian 9 or CentOS 7及以上,更低版本系统无法成功搭建,其他系统尚未测试!
跳过了上面系统选择与购买部分的要注意啦,本教程目前测试通过操作系统版本是Ubuntu 16.04 or Debian 9 or CentOS 7及以上,更低版本系统无法成功搭建,其他系统尚未测试!
跳过了上面系统选择与购买部分的要注意啦,本教程目前测试通过操作系统版本是Ubuntu 16.04 or Debian 9 or CentOS 7及以上,更低版本系统无法成功搭建,其他系统尚未测试!
远程工具安装
本文使用的第三方远程管理工具叫做Xshell。Xshell学生和家庭版是免费的,可以放心试用(觉得好用的话,不差钱的各位也可以注册一下支持软件开发者噢)。安装好Xshell之后即可开始连接服务器进行部署了。不过Xshell没有Mac端,所以Mac可以使用其他ssh客户端,甚至直接用终端都可以,用法大同小异。
连接服务器
启动Xshell,从菜单栏的文件->新建打开新建会话窗口如下图。会话名称随便取一个都可以,主机填写刚才记下来的服务器IP地址或者直接填域名也是可以的。点击确定立即尝试连接服务器,如果能连接上服务器会提示输入用户名和密码。用户名为root,密码可以从vultr服务器详情页拷贝过来。可以记住用户名和密码,这样下次连接就不用再输入那个复杂的密码了(当然密码是可以修改的,但是没必要。系统自动生成的密码强度相当高,可以避免暴力破解。自己设的密码就不好说了,而且还容易忘记)。
连接成功之后会出现命令提示符:root@username:~#。
连接上服务器后就可以开始安装Trojan了。对于Xshell连不上服务器的情况,如果是使用域名连接的话,先ping一下域名看看是否DNS解析尚未生效,如果尚未生效,那么需要等一下,在等待的过程中可以先用IP将服务器配置好。如果ping不通IP的话,那么多半是被墙了,那就只能换掉服务器了。(血的教训:先购买新服务器,再去vultr服务器页面Destroy。反过来的话间隔太小,估计又买到原来的ip了。或者直接开个四五台服务器,然后保留ping结果最好的,删除其余的就好了。)
创建用户账户(可选)
为了系统安全,一般不建议直接使用root用户对系统做设置,而vultr默认只有root用户,故可以自己新建一个非root但是有sudo权限的用户继续后面的操作,代码如下所示,注意密码强度不能太低。第一条命令创建用户,第二条命令设置密码,第三条命令将该用户加入sudo组,第四条命令切换到该用户。
1
2
3
4
sudo useradd -m -s /bin/bash trojanuser
sudo passwd trojanuser
sudo usermod -G sudo trojanuser
su -l trojanuser
复制
创建服务账户
很多看教程的小伙伴问“为什么非要弄这么多用户,直接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并允许组内用户访问即可。
1
2
3
sudo groupadd certusers
sudo useradd -r -M -G certusers trojan
sudo useradd -r -m -G certusers acme
复制
安装依赖
由于Debian系列系统和CentOS系列系统使用不同的包管理软件,所以安装软件的命令不一样,下面两个小节自己对照自己系统选择命令。
Ubuntu or Debian
更新源
1
sudo apt update
复制
1
sudo apt upgrade -y
复制
安装acme.sh需要的依赖。
1
sudo apt install -y socat cron curl
复制
启动crontab
1
2
sudo systemctl start cron
sudo systemctl enable cron
复制
安装Trojan需要的依赖。
1
sudo apt install -y libcap2-bin xz-utils nano
复制
安装Nginx。
1
sudo apt install -y nginx
复制
CentOS
安装acme.sh需要的依赖。
1
sudo yum install -y socat cronie curl
复制
启动crontab
1
2
sudo systemctl start crond
sudo systemctl enable crond
复制
安装Trojan需要的依赖。
1
sudo yum install -y xz nano
复制
安装Nginx。
1
sudo yum install -y nginx
复制
创建证书文件夹
第一条命令新建一个文件夹/usr/local/etc/certfiles用于存放证书。第二条命令将证书文件夹所有者改为acme,使得用户acme有权限写入证书。
1
2
sudo mkdir /usr/local/etc/certfiles
sudo chown -R acme:acme /usr/local/etc/certfiles
复制
配置证书
安装acme.sh自动管理CA证书脚本
分别执行如下命令,注意看是否报错。第一条命令切换到用户acme。第二条命令安装acme.sh。第三条命令退出当前用户。第四条命令再次切换到用户acme。注意到这里两次切换用户的操作不能省略,因为安装完acme.sh之后要重新登录当前用户,否则无法识别出acme.sh命令。
1
sudo su -l -s /bin/bash acme
复制
1
2
curl https://get.acme.sh | sh
exit
复制
1
sudo su -l -s /bin/bash acme
复制
添加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里面执行如下两条命令,注意执行成功没有提示,所以自己不要输错了。其中引号内的内容改为你自己的。注意,本文中代码需要手动修改的地方都使用<>包裹。
1
2
export CF_Key="<Your Global API Key>"
export CF_Email="<Your cloudflare account Email>"
复制
申请证书
不是使用cloudflare DNS的请查看域名申请与解析部分自己做调整!
执行如下命令(注意域名<tdom.ml>改为你自己的域名),等待一会儿。
1
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参数重新申请一次。
安装证书
执行如下命令(注意域名<tdom.ml>改为你自己的域名),第一条命令使用acme.sh将证书安装到certfiles目录,这样acme.sh更新证书的时候会自动将新的证书安装到这里。第二条命令是配置acme.sh自动更新和自动更新证书,这样配置完Trojan之后一般不用管服务器。
1
acme.sh --install-cert -d <tdom.ml> --key-file /usr/local/etc/certfiles/private.key --fullchain-file /usr/local/etc/certfiles/certificate.crt
复制
1
acme.sh --upgrade --auto-upgrade
复制
修改权限
最后还要允许组内用户访问证书。可通过如下命令实现。第一条命令将证书文件夹所在用户组改为certusers。第二条命令是赋予证书文件夹组内用户读取权限。运行这两条命令之后用户trojan就有权限读取证书了。第三条命令退出用户acme,因为证书已经安装完成。
1
2
3
chown -R acme:certusers /usr/local/etc/certfiles
chmod -R 750 /usr/local/etc/certfiles
exit
复制
配置Trojan
安装Trojan
分别执行如下四个命令,注意看是否报错。第一个命令是安装Trojan,安装完成一般会提示版本号注意看是否是最新版本。第二个命令是将Trojan配置文件的所有者修改为用户trojan,由于使用sudo安装的Trojan,该配置文件默认是属于root用户的,而我们需要使用用户trojan运行Trojan,不修改所有者会导致启动Trojan遇到权限问题。第三个命令备份Trojan配置文件,以防万一。第四个命令是使用nano修改配置文件。
1
sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)"
复制
1
2
3
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+O和Ctrl+X)保存并退出nano。修改之后的config文件如图所示。另外,如果有IPv6地址,将local_addr的0.0.0.0改为::才可以使用。
启动Trojan
修改Trojan启动用户
执行如下命令,打开trojan.service文件,并将用户修改为trojan。
1
sudo nano /etc/systemd/system/trojan.service
复制
添加用户效果如图所示,注意等号旁边没有空格。
然后重新加载配置文件。
1
sudo systemctl daemon-reload
复制
赋予Trojan监听443端口能力
执行如下命令,赋予Trojan监听1024以下端口的能力,使得Trojan可以监听到443端口。这是由于我们使用非root用户启动Trojan,但是Linux默认不允许非root用户启动的进程监听1024以下的端口,除非为每一个二进制文件显式声明。
1
sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/trojan
复制
使用systemd启动Trojan
Trojan启动、查看状态命令分别如下,第一条是启动Trojan,第二条是查看Trojan运行状态。启动之后再查看一下状态,Trojan显示active (running)即表示正常启动了。如果出现fatal: config.json(n): invalid code sequence错误,那么是你的配置文件第n行有错误,请检查。
1
2
sudo systemctl restart trojan
sudo systemctl status trojan
复制
更新证书
当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文件
1
sudo -u trojan crontab -e
复制
在文件末尾添加一行如下,该行表示每个月1号的时候运行命令killall -s SIGUSR1 trojan,由于是使用用户trojan运行的,故不需要在前面加sudo -u trojan。
1
0 0 1 * * killall -s SIGUSR1 trojan
复制
最后查看crontab是否生效。
1
sudo -u trojan crontab -l
复制
更新Trojan
如果Trojan版本有更新(可以去这里查看是否有更新),那么使用本教程搭建的服务器端更新Trojan版本只需要三条命令即可,不过要注意的是,第一条命令会提示是否覆盖配置文件,如果没有必要请回答n,否则配置文件将会被覆盖(如果不小心覆盖了就得自己重新编辑了)。第二条命令重新赋予Trojan监听443端口的能力。第三条命令重启Trojan。
1
sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)"
复制
1
2
sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/trojan
sudo systemctl restart trojan
复制
配置Nginx
写入虚拟主机到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/中添加两个文件夹。
1
2
sudo mkdir /etc/nginx/sites-available
sudo mkdir /etc/nginx/sites-enabled
复制
执行如下命令使用nano打开Nginx配置文件,删除其中server块,并添加对/etc/nginx/sites-enabled/文件夹的索引。
1
sudo nano /etc/nginx/nginx.conf
复制
配置文件修改结果如下图所示。
CentOS反向代理需要配置SELinux允许httpd模块可以联网,否则服务器会返回502错误。
1
sudo setsebool -P httpd_can_network_connect true
复制
Ubuntu or Debian
使用如下命令关闭Nginx默认虚拟主机。
1
sudo rm /etc/nginx/sites-enabled/default
复制
写入配置
1.执行如下命令,使用nano添加虚拟主机。(注意域名<tdom.ml>改为你自己的域名,这是虚拟主机的文件名,只是用来自己识别的。如果你已经有配置虚拟主机在这个文件中,可以自己使用cp命令备份一下或者换个名字也行,等介绍完基本配置再讲如何与现有服务集成。)
1
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>改为自己的域名,注意别填错了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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>改为你自己的域名
1
sudo ln -s /etc/nginx/sites-available/<tdom.ml> /etc/nginx/sites-enabled/
复制
启动Nginx
Nginx启动命令和Trojan一样,就不过多解释了。
1
2
sudo systemctl restart nginx
sudo systemctl status nginx
复制
与现有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点。
配置Trojan和Nginx开机自启
虽然开机自启一般用不着,除非vultr机房停电,但是反正也没什么代价,弄一下吧。
1
2
sudo systemctl enable trojan
sudo systemctl enable nginx
复制
检查服务器是否配置成功
到这里服务器就配置完成了。此时你可以在浏览器里面访问你的网站看是否能够访问,如果你的网站可以访问了,那么就一切正常啦。
另外,基于以上考虑到的可能的恶意探测,可以验证一下以下情况是否正常。
浏览器中使用ip访问:重定向到https://tdom.ml;
浏览器中使用https://ip访问:重定向到https://tdom.ml(跳转的时候浏览器可能提示不安全是正常的);
浏览器中使用tdom.ml访问:重定向到https://tdom.ml。
启动bbr(可选,建议)
启动bbr需要Linux内核版本在4.10及以上,如果低于该版本需要自己升级(这不在本教程范围之后)内核版本,保证内核版本不低于4.10。查看系统内核版本命令如下。
1
uname -a
复制
bbr是谷歌开发的网络控制算法,可以加快访问速度。执行下面命令查看当前系统是否启用bbr。
1
sudo sysctl net.ipv4.tcp_congestion_control
复制
执行完成之后如果提示net.ipv4.tcp_congestion_control = bbr即表示启动了bbr,可以跳过下面启动bbr的步骤。
直接将下面三条命令拷贝粘贴到Xshell里面执行即可启动bbr,检查启动状态同上。
1
2
3
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
复制
配置防火墙(可选)
只打开22、80和443端口可以有效的阻止外部恶意流量,降低服务器暴露的风险。此步骤非必须,而且自己有其他服务记得其他服务的端口也要处理。
本文以ufw为例配置防火墙,ufw是一个很好用的防火墙配置命令,可以简化操作,减少错误的发生。
Debian or Ubuntu执行如下命令安装ufw
1
sudo apt install -y ufw
复制
CentOS执行如下两个命令安装ufw
1
2
sudo yum install -y epel-release
sudo yum install -y ufw
复制
如果服务器无IPv6地址那么需要执行如下命令,将IPV6=yes修改为IPV6=no。
1
sudo nano /etc/default/ufw
复制
执行如下命令即可成功配置防火墙。注意,如果ssh端口不是22那么第一行需要调整(将ssh改为端口号)。
1
2
3
4
5
sudo ufw disable
sudo ufw allow ssh
sudo ufw allow https
sudo ufw allow http
sudo ufw enable
复制
1
2
sudo ufw status
sudo ufw status verbose
复制
另外,如果对Trojan不放心,那么可以参考trojan wiki,优化防火墙配置,使得Trojan只能给127.0.0.1:80发送数据和响应外部请求。
Windows或Mac客户端部署
几点说明,目前客户端Trojan不能使用全局代理,所以需要配合其他软件使用,比如proxifier等。推荐使用Trojan+Chrome插件SwitchyOmega实现只能Chrome翻墙的目的。这样Trojan只用监听一个端口,由Chrome插件决定当前流量是否走代理。如果你有别的用途可以单独在某个软件内部使用SOCKS5协议指定代理,地址为Trojan的地址:127.0.0.1:1080。
配置Windows客户端
Windows客户端下载地址Trojan for Windows,打开之后下载最新版本的win.zip压缩包。
下载成功之后解压,修改目录中的config.json配置文件中的local_port、remote_addr和password即可。其中,remote_addr填写自己的域名,local_port开启本地端口,用来接收本地数据,建议修改为不常用端口,否则容易冲突,本文仅使用默认端口1080演示。Trojan不需要安装就可以直接运行,拷贝Trojan文件夹到电脑里面,双击即可运行。如果启动报错,那么说明你的系统里面没有C++运行环境,需要安装VC++运行环境(1.12.3及以前版本安装x86环境,1.13.0及以后版本安装x64环境,或者两个版本都安装也行),然后重新启动Trojan,确认Trojan没有报错即可。如果启动Trojan会一闪而过,那么应该是你配置文件有错误,请仔细检查。可以使用控制台运行Trojan,能看到具体是哪一行有错,具体方法:使用命令提示符在Trojan目录运行trojan命令可以看到具体哪一行错误,如果出现fatal: config.json(n): invalid code sequence错误,那么是你的配置文件第n行有错误,请检查。
如何配置图形界面:Trojan的Windows客户端目前还没有图形界面,如果对黑框有强迫症,可以使用CommandTrayHost将黑框托盘化。这是本人目前采用的方案,相关文件可以在这里下载,下载完成之后解压并将你的配置文件拷贝到Trojan目录即可使用。
配置Mac客户端
Mac客户端下载地址Trojan for Mac,打开之后下载最新版的macos.zip,编辑配置文件同Windows客户端,编辑好配置文件后双击运行start.command即可。如果出现bind: Permission denied错误,需要在终端使用killall trojan命令杀掉现有的Trojan相关的进程。如果出现fatal: config.json(n): invalid code sequence错误,那么是你的配置文件第n行有错误,请检查。
安装Chrome
如果没有安装Chrome需要先安装一下Chrome。
确认服务器可达
在Chrome浏览器中访问你自己的网站,确保服务器可达。这一步在每一台Windows的客户端都必须做,否则有可能会连接服务器失败(Trojan日志显示握手失败),这是Windows系统的问题(或者说是bug吧)。
以SOCKS5方式启动Chrome
只需要这一次以SOCKS5启动Chrome,配置完成之后正常使用即可。
Windows
在命令提示符(搜索框输入cmd)输入下面的命令启动Chrome,注意端口号如果你有修改也要对应的修改。
1
start C:\"Program Files (x86)"\Google\Chrome\Application\chrome.exe --proxy-server="socks5://127.0.0.1:1080" --host-resolver-rules="MAP * ~NOTFOUND, EXCLUDE 127.0.0.1"
复制
如果上述命令无法启动Chrome,是因为新版本的Chrome更改了安装路径导致的,你需要更新你的Chrome版本啦。
Mac
在终端输入下面的命令启动Chrome,注意端口号如果你有修改也要对应的修改。
1
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --proxy-server="socks5://127.0.0.1:1080" --host-resolver-rules="MAP * ~NOTFOUND, EXCLUDE 127.0.0.1"
复制
安装SwitchyOmega插件
访问Chrome网上应用店,搜索SwitchyOmega即可找到SwitchyOmega插件并安装之。安装完成之后重启Chrome。
配置SwitchyOmega插件(以下每一步配置完之后记得应用选项)
在Chrome右上角打开SwitchyOmega配置界面,如图所示:
情景模式中的auto switch配置如图所示:注意规则列表规则选择proxy,规则列表格式为AutoProxy,其网址为:
1
https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt
复制
填写完成之后需要先更新情景模式使其生效,如图所示:
情景模式中的proxy配置如下图所示,其中代理协议选择SOCKS5,这是Trojan支持的协议,注意不要选错了,127.0.0.1:1080为Trojan代理地址,只有流向这个地址的流量Trojan才会处理,如果Trojan配置文件有修改本地端口号这里也得对应的修改。
设定中的初始情景模式选择auto switch,如图所示。这样当检测到目标地址在GFW列表中的时候Chrome会让其走Trojan代理。否则直连。
然后重启Chrome,保证SwitchyOmega运行在auto switch模式,否则可能无法正常使用,常见现象有无法访问国外网站、导致访问国内网站速度变慢或无法访问内网等。如图所示:
至此客户端Trojan已经配置完成,尽情享受吧!!!
其他客户端部署指南
Linux客户端:Linux客户端安装方式与服务端一样,配置文件参考客户端修改即可;
IOS客户端:美区ID+[Pharos Pro | Shadowrocket];
Android客户端:igniter,已经支持分流。
FQA
浏览器报错ERR_SSL_PROTOCOL_ERROR:可能是系统问题,解决方案是删除配置文件中的alpn中的h2那一行,或者重装系统。
如何寻求帮助
仔细核对操作是否与本文一致,特别是我加粗的地方很容易出错。
去Trojan-GFW项目查找是否有类似issue,如果有类似issue可自行参考解决。如果没有类似issue也可以在那里提交新的issue,基本上都会得到回复。
去Trojan-GFW官方电报群请教群里的开发者和大佬们:trojan-gfw。群里的人都是比较专业的,你的问题基本都能被解决,请注意群规和礼貌。
在博客留言区留言,我有空便会回复(但是肯定没有 1 和 2 方便和及时),记得带上服务端和客户端日志还有浏览器提示一起!
进阶
Trojan-GFW项目提供了用户管理界面,可以很方便的添加、删除用户和为每个用户设置流量限制,配置教程:Trojan-Panel配置。
https://trojan-tutor.github.io/2019/04/10/p41.html