如何使用Trojan Go隐藏你的代理节点

这个页面将会简单讲述Trojan协议的基本工作原理。以及为了防止你的代理节点被检测和封禁,你应该做的一些事情。

为什么Shadowsocks容易遭到封锁

防火墙在早期仅仅只是对出境流量进行截获和审查,也即被动检测。Shadowsocks的加密协议设计使得传输的数据包本身几乎没有任何特征,看起来类似于完全随机的比特流,这在早一些年的确能有效绕过GFW。

于是GFW开始采用主动探测的方式。具体的方式是,当GFW发现一个可疑的无法识别的连接时(大流量,随机字节流,高位端口等特征),将会主动连接这个服务器端口,重放之前捕获到的流量(或者经过一些精心修改)。Shadowsocks检测到不正常的连接,将连接断开。这种不正常的流量和断开连接的行为被视作Shadowsocks服务器的特征,于是该服务器被加入GFW的可疑名单中。这个名单不一定立即生效,而是在某些特殊的敏感时期,可疑名单中的服务器会遭到暂时或者永久的封锁。该可疑名单是否封锁,可能由人为因素决定。

Trojan如何绕过GFW

与Shadowsocks相反,Trojan不使用自定义的加密协议来隐藏自身,相反,使用特征明显的TLS加密协议,使得流量看起来与正常的HTTPS网站相同。TLS是一个成熟的加密体系,使用正确配置的加密TLS隧道,可以保证传输的

  • 保密性(GFW无法得知传输的内容)
  • 完整性(一旦GFW试图篡改传输的密文,通讯双方都会发现)
  • 不可抵赖(GFW无法伪造身份冒充服务端或者客户端)
  • 前向安全(即使密钥泄露,GFW也无法解密先前的加密流量)

对于被动检测,Trojan协议与HTTPS协议流量的行为完全一致,而HTTPS流量占据了目前互联网流量的一半以上,且HTTPS握手成功后流量是加密的,几乎不存在可行方法从其中分辨出Trojan协议流量。

对于主动检测,当防火墙连接Trojan服务器进行主动检测时,Trojan可以发现非Trojan协议的流量。与Shadowsocks等代理不同,此时Trojan不会断开连接,而是将这个连接代理到一个正常的Web服务器。在GFW看来,该服务器的行为和一个普通的HTTPS网站行为完全相同,无法判断是否是一个Trojan代理节点。这也是Trojan推荐使用合法的域名,并使用CA签名的HTTPS证书的原因: 这让你的服务器完全无法被主动检测判定是一个Trojan服务器。

如何正确配置Trojan-Go以完全隐藏你的节点特征

在开始之前,你需要

  • 一个服务器,且未被GFW封锁。
  • 一个域名,可以使用免费的域名服务,如.tk等。但是免费域名有被GFW无差别封锁的风险。
  • Trojan-Go,可以从release页面下载。

配置证书

为了伪装成一个正常的HTTPS站点,也为了保证通讯的安全,我们需要一份经过权威证书机构签名的证书。Trojan-Go支持从Let’s Encrypt自动申请证书。首先将你的域名正确解析到你的服务器IP。然后准备好一个邮箱地址,合乎邮箱地址规则即可,不需要真实邮箱地址。保证你的服务器443和80端口没有被其他程序(nginx,apache,正在运行的Trojan等)占用。然后执行

sudo ./trojan-go -cert request

按照屏幕提示填入相关信息。如果操作成功,当前目录下将得到四个文件

  • server.key 服务器私钥
  • server.crt 经过Let’s Encrypt签名的服务器证书
  • user.key 用户Email对应的私钥
  • domain_info.json 域名和用户Email信息

备份好这些文件,不要将.key文件分享给其他任何人,否则你的身份可能被冒用。

证书的有效期通常是三个月,你可以使用

sudo ./trojan-go -cert renew

进行证书更新。更新之前请确保同目录下有上述的四个文件。

服务端配置

我们的目标是,使得你的服务器和正常的HTTPS网站表现相同。

首先你需要一个配置Web服务器。当GFW主动探测时,向它展示一个完全正常的Web页面。你可以在本地使用nginx,apache等搭建一个HTTP服务器,由于他们配置方法各不相同,已经有很多的教学,这里不再赘述。

这是一份比较安全的服务器配置,需要你在本地80端口配置一个HTTP服务器(必要),在1234端口配置一个HTTPS服务器(可选,可以删除fallback_port字段,跳过这个步骤)

{
    "run_type": "server",
    "local_addr": "0.0.0.0",
    "local_port": 443,
    "remote_addr": "127.0.0.1",
    "remote_port": 80,
    "password": [
        "your_awesome_password"
    ],
    "ssl": {
        "cert": "server.crt",
        "key": "server.key",
        "fallback_port": 1234
    }
}

这个配置文件使Trojan-Go在服务器的所有网卡上监听443端口,使用server.crt和server.key作为证书和密钥进行TLS握手。你应该使用比较长和比较复杂的密码,同时确保这里的密码password和客户端是相同的。

如果TLS连接建立后,检测到TLS的内容非法,将TLS连接代理到本地127.0.0.1:80上的HTTP服务,这时远端看起来就是一个HTTPS的网站页面。

如果TLS握手都失败了,说明对方使用的不是TLS协议进行主动探测,此时Trojan-Go将连接代理到本地127.0.0.1:1234上运行的HTTPS服务,本地HTTPS服务器也会检测到连接不是TLS连接,返回一个400 Bad Reqeust的HTTP页面。fallback_port是一个可选选项,如果没有填写,Trojan-Go会直接终止连接。

如果TLS连接建立,并且确认是Trojan协议,而且密码正确,那么服务器将解析来自客户端的请求并进行代理。

你可以通过使用浏览器访问你的域名 https://your_domain_name 来验证。如果工作正常,你的浏览器会显示一个正常的HTTPS保护的Web页面,页面内容与服务器本机80端口上的页面一致。你还可以使用 http://your_domain_name:443 验证fallback_port工作是否正常。

客户端配置

对应的客户端配置

{
    "run_type": "client",
    "local_addr": "127.0.0.1",
    "local_port": 1080,
    "remote_addr": "your_awesome_server",
    "remote_port": 443,
    "password": [
	    "your_awesome_password"
    ],
    "ssl": {
        "sni": "your_domain_name"
    }
}

这个客户端配置使Trojan-Go开启一个监听在本地1080端口的socks5/http代理(自动识别),远端服务器为your_awesome_server:443,your_awesome_server可以是IP或者域名。sni字段应当填写你申请证书的对应域名,或者你自己签发证书时证书的Common Name,而且必须一致。SNI字段在TLS协议中是明文传送的(目的是使服务器提供相应证书),所以不要填写类似google.com等已经被封锁的域名,否则很有可能导致你的服务器也被封锁。

自定义配置

上面只进行了最简单的配置,但已足够隐蔽和安全。

你可以在右侧导航栏中查看更多自定义配置方法。

如果你需要更多关于配置文件的信息,参考这里

评论 在此处输入想要评论的文本。

Copied title and URL