Trojan原理圖解解析
如圖所示,Trojan工作在443端口,處理來自外界的HTTPS請求,如果是合法的Trojan請求,那么為該請求提供服務,否則就將該流量轉發給web。服務器Nginx,由Nginx為其提供服務。基於這個工作工程可以知道,Trojan的一切表現均與Nginx一致,不會引入額外特征,從而達到無法識別的效果。當然,為了防止惡意探測,我們需要將80端口的流量全部重定向到443端口,並且服務器只暴露80和443端口,這樣可以使得服務器與常見的Web服務器表現一致。
當Trojan客戶端連接到服務器時,它首先執行真正的TLS握手。如果握手成功,則所有后續流量都將受到TLS的保護;
實例:
本機IP: 192.168.31.176
服務器IP:
TCP握手包序號:73,74,75
TLS握手:76,77,78,79,80,81,82,83
然后,客戶端發送以下結構(TLS加密之后的):
+-----------------------+---------+----------------+---------+----------+ | hex(SHA224(password)) | CRLF | Trojan Request | CRLF | Payload | +-----------------------+---------+----------------+---------+----------+ | 56 | X'0D0A' | Variable | X'0D0A' | Variable | +-----------------------+---------+----------------+---------+----------+
當Trojan 請求是類似於如下SOCKS5的請求:
+-----+------+----------+----------+ | CMD | ATYP | DST.ADDR | DST.PORT | +-----+------+----------+----------+ | 1 | 1 | Variable | 2 | +-----+------+----------+----------+ o CMD o CONNECT X'01' o UDP :X'03' o ATYP o IP V4 : X'01' o 域名: X'03' o IP V6 : X'04' o DST.ADDR 所需的目標地址 o DST.PORT 目標端口
UDP模式
+------+----------+----------+--------+---------+----------+ | ATYP | DST.ADDR | DST.PORT | Length | CRLF | Payload | +------+----------+----------+--------+---------+----------+ | 1 | Variable | 2 | 2 | X'0D0A' | Variable | +------+----------+----------+--------+---------+----------+
服務器收到第一個數據包時,將檢查哈希密碼是否正確以及Trojan請求是否有效。如果不是,則將該協議視為非Trojan請求。
請注意,第一個數據包將附加有效負載。這避免了長度模式檢測,並可能減少要發送的數據包數量。
如果請求有效,則Trojan服務器將連接到DST.ADDR和DST.PORT字段指示的目標服務器,並在服務器和Trojan客戶端之間打開通道。
因為通常將Trojan服務器假定為HTTPS服務器,所以偵聽套接字始終是TLS套接字。在執行TLS握手之后,如果Trojan服務器確定流量為非Trojan協議,則會在服務器端點(默認為本地HTTP服務器127.0.0.1:80)到客戶端之間打開一條連接,因此服務器端點控制解密的TLS流量。
所有沒有正確結構和密碼的連接都將重定向到預設的網址,因此,如果連接了鏈接,則Trojan服務器的行為與該網址完全相同(默認為HTTP)。
反檢測
由於流量受TLS保護(使用有效證書是用戶的責任),因此,如果您訪問的是HTTP站點,則流量與HTTPS相同(TLS握手后只有一個RTT);如果您不訪問HTTP站點,則流量看起來與保持活動的HTTPS或WebSocket相同。因此,Trojan還可以繞過ISP QoS限制。
Trojan標本
長度:
IP:
搭建方式: