原文:https://www.cnblogs.com/DouglasLuo/p/11605086.html
這篇文章意義在於提供一種優化網絡的思路,提供tinyfecVPN這一軟件的使用方法。本人和軟件的作者沒有任何關系。本人堅決反對使用該軟件搭建非法信道進行國際互聯。所有讀者閱讀此篇文章后所做所為本人概不負責。下面開始正文。
這里以Minecraft Bedrock Edition服務器為例。假設現在服務器上已經運行這一個Minecraft Bedrock Edition服務器,端口為19132。
tinyfecVPN是一款基於UDPSpeeder的VPN工具。其作者開發這一軟件的初衷是提供一種加速網絡,優化網絡環境的方法。
tinyfecVPN使用了和UDPSpeeder相同的lib,功能和UDPspeeder類似,只不過tinyfecVPN工作方式是VPN,UDPspeeder工作方式是UDP tunnel.
由於tinyfecVPN的服務端和客戶端,作者都只提供了linux版本。所以服務端和客戶端都只能搭建在linux環境下(事實上只是沒有人移植到其他平台。等待其他大神出馬)。所以要在其他平台使用tinyfecVPN需要使用路由器,或者使用虛擬機來運行客戶端,讓數據先走到虛擬機\路由器再從路由器將數據路由到VPN通道,到達遠程服務器。所以是這樣的:
路由器/虛擬機 ----> tinyfecVPN client ----> VPN tunnel ----> tinyfecVPN server ----> Minecraft Bedrock Edition Server
再鑒於tinyfecVPN實際是基於udp進行加速。眾所周知過大的udp流量會被運營商封殺。所以,需要使用工具把udp的流量偽裝成tcp的流量,欺騙運營商。tinyfecVPN的作者非常厲害,他同時開發了一個這樣的工具用以偽裝流量為udp流量,udp2raw--tunnel。所以tinyfecVPN的客戶端就需要經過udp2raw建立VPN通道。所以現在的網絡變成了這樣:
路由器/虛擬機 ----> tinyfecVPN client ----> udp2raw client ----> VPN tunnel ----> udp2raw server ----> tinyfecVPN server ----> Minecraft Bedrock Edition Server
tinyfecVPN是運行在虛擬機/路由器上。所以流量需要經過虛擬機/路由器轉發給tinyfecVPN client才能經過VPN tunnel。所以需要在虛擬機/路由器上開放端口,通過端口將流量轉發給tinyfecVPN。tinyfecVPN的作者很強大,也開發了一個軟件用以滿足這一需求,tinyPortMapper。所以現在的網絡變成了這樣:
本地 ----> tinyPortMapper ----> tinyfecVPN client ----> udp2raw client ----> VPN tunnel ----> udp2raw server ----> tinyfecVPN server ----> Minecraft Bedrock Edition Server
因為我這里沒有可以運行openwrt的家用路由器。我這里使用虛擬機的方案實現。
首先進入官方readme下載作者提供的超小型虛擬機鏡像。使用VMware打開鏡像,並運行虛擬機。這里需要在VMware中設置虛擬機的網絡連接為橋接模式。
虛擬機中已經繼承了ssh。所以虛擬機開機后可以通過putty直接連接虛擬機。linux的tty界面個人用不慣(作者提供的鏡像沒有GUI),所以使用putty連接虛擬機。root的密碼為123456。首先先安裝tinyfecVPN,分別在服務器和虛擬機中下載release編譯好的文件,並解壓。
假定遠程服務器的ip地址為44.55.66.77。tinyfecVPN server的端口為4096。在虛擬機中執行:
./tinyvpn_x86 -c -r44.55.66.77:4096 -f20:10 -k "passwd" --sub-net 10.22.22.0 &
虛擬機中執行ifconfig會出現一個新的網卡。可以看到這個網卡的地址是10.22.22.2。這個地址就是VPN通道中,虛擬機的地址。命令中的-k 后面制定的是加密的密鑰。加密方式為異或加密。
在遠程服務器中執行命令:
./tinyvpn_x86 -s -l0.0.0.0:4096 -f20:10 -k "passwd" --sub-net 10.22.22.0
這樣的話。本地和遠程就成功建立了VPN連接(需要確認防火牆打開開放了端口)。在遠程服務器中運行ifconfig命令,可以看到新的網卡,網卡的地址是10.22.22.1。這是服務器在VPN通道中的ip地址。在虛擬機和服務器之間建立通信,若使用的是VPN通道的地址建立連接。那么通信的數據就是經過VPN的了。
此時在虛擬機中可以直接ping遠程服務器的VPN地址(10.22.22.1)。這時候虛擬機發送ICMP包給遠程服務器就是經過VPN通道了。
現在我們就要使用udp2raw工具偽裝udp流量為tcp流量。所以先在服務器和虛擬機中停止tinyfecVPN。
進入官方readme頁面,分別下載udp2raw到虛擬機和服務器,並解壓。
在虛擬機中執行命令:
./udp2raw_x86 -c -l0.0.0.0:3333 -r44.55.66.77:4097 -k "passwd" --raw-mode faketcp --cipher-mode xor -a &
同理,命令中的-k "passwd"為加密密鑰。此時在虛擬機中訪問127.0.0.1:3333,udp2raw就會將udp流量偽裝成tcp流量,並發送給遠程服務44.55.66.77:4097
./tinyvpn_x86 -c -r127.0.0.1:3333 -f20:10 -k "passwd" --sub-net 10.22.22.0 &
這里的tinyfecVPN客戶端命令和上面的有所不同。上面的命令是直接訪問遠程服務器的IP地址。這里是訪問127.0.0.1:3333。
在遠程服務器中執行命令:
./udp2raw_x86 -s -l0.0.0.0:4097 -r127.0.0.1:4096 -k "passwd" --raw-mode faketcp --cipher-mode xor -a
此時服務器的udp2raw接收到流量后,會把流量發給本地的4096端口的服務。
./tinyvpn_x86 -s -l0.0.0.0:4096 -f20:10 -k "passwd" --sub-net 10.22.22.0
服務器依舊是這行命令運行tinyVPN server。這時候再從虛擬機中ping遠程的服務器的VPN地址,ICMP包就會經過udp2raw到達遠程服務器。
剩下的操作就是免去配置iptables實現將本地數據從本地傳給虛擬機的tinyfecVPN服務。在github頁面中下載編譯好的tinyPortMapper到虛擬機,並解壓。
在虛擬機中執行命令:
./tinymapper_x86 -l0.0.0.0:19132 -r10.22.22.1:19132 -t -u &
這時候,在本地訪問遠程服務44.55.66.77:19132(Minecraft Bedrock Server) 只需要訪問 虛擬機IP:19132。