5分鐘瞭解遊戲加速器的原理與搭建

背景

一般來講,國內運營商都有QoS

百度百科:QoS ( Quality of Service,服務質量)指一個網路能夠利用各種基礎技術,為指定的網路通訊提供更好的服務能力,是網路的一種安全機制, 是用來解決網路延遲和阻塞等問題的一種技術。

說白了就是在網路擁堵的時候運營商會直接把一些不重要的流量包丟掉,至於啥是“不重要的”就要去問運營商了(看人下菜碟)。對被 QoS的使用者來說,表現就是、網速降低、丟包、ping 值極不穩定,給錢越多的網路質量越好,例如頻寬更高,丟包更少,延遲更低。

當然QoS是不區分TCP和UDP的,對於UDP而言,除了常規QoS,還有更嚴格的限制甚至在某些極端情況下會遮蔽掉UDP,主要原因是UDP無連線、無狀態、支援廣播、最大努力送達等特性讓運營商控制UDP的成本太高

5分鐘瞭解遊戲加速器的原理與搭建

來一張喜聞樂見的對比圖

5分鐘瞭解遊戲加速器的原理與搭建

一般遊戲為了保證實時性,都會採用UDP進行網路傳輸,比如玩射擊遊戲角色正在行走的時候,網路卡了一下,但是一秒不到遊戲角色已經移動到下一個位置了,這是UDP的表現,它盡最大努力送達,允許丟包;假設是TCP,網路卡一下,你會發現遊戲畫面暫停了,角色向卡幻燈片一樣的往前行走,因為TCP是面向連線的,丟包會重發,到達會確認。

當然遊戲不全是UDP,TCP甚至更上層的HTTP也有,這完全取決於遊戲對延遲的要求。

那麼遊戲中到底是用UDP還是TCP呢?

如果是由客戶端間歇性的發起無狀態的查詢,並且偶爾發生延遲是可以容忍,那麼使用

HTTP/HTTPS

吧。

如果客戶端和伺服器都可以獨立發包,但是偶爾發生延遲可以容忍(比如:線上的紙牌遊戲,許多MMO類的遊戲),那麼可考慮使用

TCP長連線

如果客戶端和伺服器都可以獨立發包,而且無法忍受延遲(比如:大多數的多人動作類遊戲,一些MMO類遊戲),那麼考慮使用

UDP

在玩一些外服遊戲(遊戲伺服器在國外)的時候,直連效果差,需要加一層代理也就是加速器,實現加速效果,因為遊戲一般為UDP傳輸但運營商對UDP干擾嚴重,所以需要將遊戲客戶端到代理伺服器之間的連線做一些處理。

UDP QoS

下面詳細說一下針對UDP的QoS,UDP socket每次發包都換一個不同的源埠,如果一個裝置瘋狂傳送UDP包,將會在短時間內創造大量的五元組。傳統的狀態防火牆,狀態NAT會用一個 五元組來追蹤一條 連線 。

如果連線過多,就會對這些儲存狀態的裝置造成很大的壓力

,這種壓力主要體現在兩個方面:

儲存壓力:裝置不得不配置大量的記憶體來儲存大量的連線。

處理器壓力:裝置不得不在資料包到來的時候花更多的時間來匹配到一條連線。

由於UDP的無狀態特徵,沒有任何報文指示一條連線什麼時候該建立什麼時候該銷燬,裝置必須有能力自行老化已經建立的UDP連線,且不得不在權衡中作出抉擇:

如果老化時間過短,將會破壞正常通訊但通訊頻率很低的UDP連線。

如果老化時間過長,將會導致已經無效的UDP連線消耗大量的記憶體,這將為DDoS攻擊創造一個攻擊面。

攻擊者只需要用不同的UDP五元組構造報文使其經過狀態裝置即可,由於UDP報文沒有任何指示連線建立銷燬的控制資訊,狀態裝置不得不平等對待任何新來的五元組,即為它們建立連線,並且指定相同的老化時間。TCP與此完全不同,由於存在syn,fin,rst等控制資訊,狀態裝置便可以針對不同狀態的TCP連線指定不同的老化時間,ESTABLISHED狀態的連線顯然要比其它狀態的連線老化時間長得多。

這導致使用TCP來實施同樣的攻擊會困難很多。為什麼快速構造不同的TCP五元組達不到UDP同樣的效果?如果你只是盲目的用不同源埠傳送syn,在沒有真正的對端迴應的情況下,這種狀態的連線將會很快老化掉(10秒以內,甚至更短)。

如果你構造使用不同埠的大量真正的TCP連線,那麼在狀態裝置受到傷害的同時,你自己也必須付出巨大的代價來維持住這些連線。你發起一個TCP連線,為了讓狀態裝置儲存這條連線,你自己也不得不儲存這條連線,除非你透過海量的反射主機同時發起真連線,否則在單臺甚至少量的主機上,這種攻擊很難奏效。

對於無狀態裝置,我們便不必再糾結五元組連線的保持了。但是UDP短期構造海量五元組的能力仍然會影響無狀態裝置包分類演算法的正常執行。基於包分類演算法的優先順序佇列,快取管理幾乎也是透過五元組計算來完成的,UDP的特徵將會使無狀態裝置對其做流量管控變得困難。其結果就是,眼睜睜任憑UDP流量擠滿各級佇列快取卻沒有辦法將其精確識別出來,即便是BBR遇到了UDP流量,也只能自降pacing rate而興嘆。

運營商對TCP更加友好,對UDP不友好,但卻無力深度檢測TCP連線的真實性。

一個簡單的例子就是將正常TCP資料的protocol欄位改成UDP,丟包率大大增加了,甚至根本無法通訊!

if (iph->protocol == IPPROTO_TCP) { iph->protocol = IPPROTO_UDP; ip_send_check(iph); udph->check = 0;} else if (iph->protocol == IPPROTO_UDP) { iph->protocol = IPPROTO_TCP; ip_send_check(iph);}

加速器原理

加速器的原理很簡單,就是UDP代理,主要難在兩點,其一是怎麼處理遊戲客戶端到加速器伺服器之間的UDP連線,其二是怎麼讓遊戲客戶端去連線這個加速器(一般遊戲客戶端是沒有設定代理伺服器的功能的)

處理UDP

處理UDP有兩種思路,一種是協議套娃,將遊戲的UDP包外面套一層TCP(UDP over TCP ),到了目的地再把TCP解包成UDP,最後在傳送到遊戲伺服器,返回的資料包也做同樣處理;另外一種是偽造TCP(FakeTCP),對UDP資料包加上偽造的TCP包頭,讓其看起來像是TCP協議,欺騙運營商。

UDP over TCP

UDP over TCP 或者 UDP in TCP都是一回事,就是把UDP協議封裝到TCP協議裡。其缺點是會影響UDP傳輸的速率和實時性,因為TCP有可靠傳輸、擁塞控制、按序到達等特性,這些特性都是會犧牲速率和實時性且無法避免掉的:

如果網路很好不丟包,那麼UDP in TCP方案會工作得很好;如果網路稍微有一點丟包,資料包的延遲會極大得增加。 (按序到達造成的副作用)

如果頻寬充足,UDP in TCP方案也會工作得很好;如果UDP資料傳送的資料一但超過了TCP的頻寬,連線就會卡住一段時間,有時候會造成超過10秒的時間無法傳送資料。(可靠傳輸、擁塞控制造成的副作用)

原理如下圖所示

5分鐘瞭解遊戲加速器的原理與搭建

常見專案:

https://github。com/mullvad/udp-over-tcp

$$R中的udp in tcp選項

v2ray中的VMess協議也是支援ucp over tcp

FakeTCP

用raw socket給UDP協議直接加上偽造的TCP包頭,把UDP偽裝成TCP;本質上還是UDP,不需要經過系統的TCP協議棧,所以不會有UCP over TCP引入的問題。但是偽裝成TCP的UDP流量可以騙過運營商的防火牆,可以避免UDP斷流。這就是FakeTCP。原理如下圖

5分鐘瞭解遊戲加速器的原理與搭建

FakeTCP跟UDP over TCP方案相比的缺點是無法穿透TCP代理(包括反向TCP代理),比如Haproxy。

常見專案:

udp2raw:https://github。com/wangyu-/udp2raw

遊戲客戶端連線加速器

SSTap

SSTap全稱SOCKSTap, 是一款使用虛擬網絡卡在網路層實現的轉發工具。 SSTap能在網路層攔截全部連線並轉發給HTTP、SOCKS4/5。 而無需對被代辦的應用程式做任何修改或設定。 它能同時轉發TCP、UDP資料包。

5分鐘瞭解遊戲加速器的原理與搭建

SSTap會在電腦中安裝一個虛擬網絡卡,配合網路規則(比如哪些IP走這個虛擬網絡卡,哪些不走)

5分鐘瞭解遊戲加速器的原理與搭建

然後在配置路由表中新增如下規則(cmd中

netstat -nr

可檢視)

網路目標 網路掩碼 閘道器 介面 躍點數0。0。0。0 0。0。0。0 10。198。75。61 10。198。75。60 20。0。0。0 128。0。0。0 10。198。75。61 10。198。75。60 2

10。198。75。60即為上面設定的虛擬網絡卡的IP,如果網路規則設定的全域性,那就是真全域性(接管系統中所有程式的UDP/TCP流量),包括系統CMD命令都會被代理到,如下實測,當不開啟SStap時,百度能ping通,開啟時,全部超時(因為我的梯子遮蔽了百度)

C:\Users\xxx>ping www。baidu。com正在 Ping www。a。shifen。com [110。242。68。4] 具有 32 位元組的資料:來自 110。242。68。4 的回覆: 位元組=32 時間=36ms TTL=53來自 110。242。68。4 的回覆: 位元組=32 時間=36ms TTL=53來自 110。242。68。4 的回覆: 位元組=32 時間=36ms TTL=53來自 110。242。68。4 的回覆: 位元組=32 時間=36ms TTL=53​110。242。68。4 的 Ping 統計資訊: 資料包: 已傳送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),往返行程的估計時間(以毫秒為單位): 最短 = 36ms,最長 = 36ms,平均 = 36ms​# 開啟SStap之後ping百度C:\Users\xxx>ping www。baidu。com​正在 Ping www。baidu。com [110。242。68。3] 具有 32 位元組的資料:請求超時。請求超時。請求超時。請求超時。​110。242。68。3 的 Ping 統計資訊: 資料包: 已傳送 = 4,已接收 = 0,丟失 = 4 (100% 丟失),

然後在2017年,作者聲稱硬碟損壞,資料丟失,現已停止開發。所以後續不會再有更新了,未來也許會不可用。但是現在(2021)依然可用

各歷史版本收藏:https://github。com/solikethis/SSTap-backup

備用連結: https://sabrinathings。lanzous。com/b01hin52h

官網:https://www。sockscap64。com/sstap-享受遊戲-使用sstap/

Netch

一款可代替SStap的開源網遊加速工具,眾所周知的遊戲加速工具SStap已於2017年年11月19日停止開發及維護,雖然停止了維護與開發,時至今日,其依然是一款熱門的遊戲加速工具。但是由於年久失修,已經難以適應部分新出的網路遊戲,可能會被新出的遊戲認定為外掛程式。

不同於SSTap那樣需要透過新增規則來實現黑名單代理,Netch原理更類似Sockscap64,透過掃描遊戲目錄獲得需要代理的程序名進行代理。與此同時Netch避免了SSTap的NAT問題,使用SSTap加速部分P2P聯機,對NAT型別有要求的遊戲時,可能會因為NAT型別嚴格遇到無法加入聯機,或者其他影響遊戲體驗的情況。

專案地址:https://github。com/netchx/netch

實現

實現主要說明基於UDP over TCP的實現,主要原因為在已有nginx + websocket的環境下改動最小,不用開啟額外UDP埠,因為其本質是TCP,保證現存環境的穩定性,如果引入FakeTCP,則必須開啟新的UDP埠,引入新的不確定性。

基於UDP over TCP的實現

主要方案為nginx + tls + websocks + vmess,整個連線過程如下圖所示

5分鐘瞭解遊戲加速器的原理與搭建

環境概述:

服務端已配置好標準https站點(nginx接入,埠為標準443,證書正常未過期)

服務端配置v2ray,使用vmess協議,其預設支援UDP over TCP方案

客戶端使用v2rayN,在本地電腦開啟socks代理,供瀏覽器等使用

客戶端使用SStap,連線v2rayN開在本地的socks代理,在網路層新增虛擬網絡卡,供所有聯網程式使用

以下為詳細步驟

服務端:搭建標準https站點

買域名、買VPS這些過程就不贅述了,主要說明標準https站點的作用是防止流量特徵被探測,因為對防火牆來說這就是普通的瀏覽網站的流量,我們的代理程式藏在https後也會被認為是https流量,每天從防火牆經過的https流量是海量的,所以很安全。

站點使用nginx搭建,證書使用certbot-nginx自動新增免費證書(三個月過期一次)

安裝過程不贅述,認證的時候使用如下命令根據提示完成域名認證即可

/usr/bin/certbot ——nginx ——register-unsafely-without-email

主要說一下nginx的配置,需要將指定路徑下的流量轉發給v2ray,此處以

/ray

為例,這個路徑是隨機的,保持客戶端和服務端配置一致即可

erver { listen 443 ssl; ssl on; ssl_certificate /etc/v2ray/v2ray。crt; ssl_certificate_key /etc/v2ray/v2ray。key; ssl_protocols TLSv1 TLSv1。1 TLSv1。2; ssl_ciphers HIGH:!aNULL:!MD5; server_name mydomain。me; # 與 V2Ray 配置中的 path 保持一致 location /ray { proxy_redirect off; #假設WebSocket監聽在環回地址的10000埠上 proxy_pass http://127。0。0。1:10000; # 升級websocket proxy_http_version 1。1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “upgrade”; proxy_set_header Host $http_host; # Show realip in v2ray access。log proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}

服務端:配置Vmess

v2ray配置主要參考:https://toutyrater。github。io/advanced/wss_and_web。html

下載v2ray程式後使用如下配置啟動:

v2ray -config /path/to/config。json

入站流量:即為Nginx轉發過來的流量,此時TLS證書已在Nginx解除安裝,得到的是明文資料,注意路徑

/ray

要和nginx對應

出站流量:出站不設限制

{ “inbounds”: [ { “port”: 10000, “listen”:“127。0。0。1”,//只監聽 127。0。0。1,避免除本機外的機器探測到開放了 10000 埠 “protocol”: “vmess”, “settings”: { “clients”: [ { “id”: “b831381d-6324-4d53-ad4f-8cda48b30811”, “alterId”: 64 } ] }, “streamSettings”: { “network”: “ws”, “wsSettings”: { “path”: “/ray” } } } ], “outbounds”: [ { “protocol”: “freedom”, “settings”: {} } ]}

此時,如果訪問https://mydomain。me/ray得到一個Bad Request說明服務端成功

客戶端:配置v2rayN

https://github。com/2dust/v2rayN/releases

v2rayN是v2ray一個HUI客戶端,v2ray本身即可作為服務端也可作為客戶端,所以這這是套殼,並且這種模式下,客戶端程式會有很多,都是套殼而已,客戶端參考:https://www。v2ray。com/awesome/tools。html

客戶端配置

入站流量:監聽本地1080埠,所有使用該埠的流量都轉發給outbounds

出站流量:以https的形式轉發給上文配置的服務端,注意路徑

/ray

需和上文一致

{ “inbounds”: [ { “port”: 10808, “listen”: “127。0。0。1”, “protocol”: “socks”, “sniffing”: { “enabled”: true, “destOverride”: [“http”, “tls”] }, “settings”: { “auth”: “noauth”, “udp”: false } } ], “outbounds”: [ { “protocol”: “vmess”, “settings”: { “vnext”: [ { “address”: “mydomain。me”, “port”: 443, “users”: [ { “id”: “b831381d-6324-4d53-ad4f-8cda48b30811”, “alterId”: 64 } ] } ] }, “streamSettings”: { “network”: “ws”, “security”: “tls”, “wsSettings”: { “path”: “/ray” } } } ]}

如果手動填寫參考如下,特別需要注意紅框中的欄位需要與服務端一致!

5分鐘瞭解遊戲加速器的原理與搭建

此時,在127。0。0。1介面10808埠上已經啟動監聽,將瀏覽器代理設定成這個埠可以禾目學上網了,注意VMess協議要求客戶端和服務端的時間相差不能超過90s,如果連不上,請先檢查下時間是否一致。

客戶端:配置SStap

開啟SStap,手動新增一個SOCKS5代理,如下圖所示

5分鐘瞭解遊戲加速器的原理與搭建

點選下方小齒輪設定勾選掉不轉發UDP和代理DNS伺服器

5分鐘瞭解遊戲加速器的原理與搭建

然後開啟遊戲,

最後在進入遊戲介面以後點選連結

,點選右側閃電圖示測試,右側如果現實TCP和UDP透過說明連線成功(圖中接收包失敗是因為我的伺服器遮蔽了百度,而SStap會用百度作為連結測試)

5分鐘瞭解遊戲加速器的原理與搭建

最後如果能順利進入遊戲說明加速成功!下圖右側為遊戲伺服器IP檢測程式輸出結果,左側為v2rayN日誌,結合起來可以看出遊戲伺服器無論TCP協議還是UDP協議都已經被代理了!

遊戲伺服器IP檢測程式:https://github。com/oooldtoy/SSTAP_ip_crawl_tool

5分鐘瞭解遊戲加速器的原理與搭建

客戶端:SStap規則配置

由於SStap年久失修,很多新出的遊戲規則沒有,所以需要自行製作,可以透過工具:SSTAP_ip_crawl_tool,原理也很簡單,透過指定程序,然後檢測該程序的所有對外部發出的TCP和UDP連線,取出伺服器IP,然後自動生成SStap規則

專案地址:https://github。com/oooldtoy/SSTAP_ip_crawl_tool

原始碼是由python寫成,嫌麻煩可以直接使用打包好的exe版本:

https://github。com/oooldtoy/SSTAP_ip_crawl_tool/releases/download/v4。0/ip_crawl_tool。v4。0。exe

輸入相關資訊後多玩一會兒遊戲即可抓取IP

5分鐘瞭解遊戲加速器的原理與搭建

最後生成的規則在程式所在目錄,如下生成為ItTakesTwo。exe遊戲的規則,最後將規則新增到SStap即可

#none,[‘ItTakesTwo。exe’],0,0,1,0,1,0,By-ip_crawl_tool239。255。255。0/24159。153。36。0/24159。153。42。0/24109。200。221。0/24109。200。215。0/24185。50。104。0/2452。88。180。0/24255。255。255。0/24

參考

https://www。cnblogs。com/crazytomato/p/7987332。html

https://blog。csdn。net/dog250/article/details/113706995

https://tachyondevel。medium。com/教程-在-windows-上使用-tun2socks-進行全域性代理-aa51869dd0d

https://toutyrater。github。io/advanced/wss_and_web。html

https://github。com/oooldtoy/SSTAP_ip_crawl_tool

釋出於 11-21 17:37