內網穿透工具對比FRP+NPS+Zerotier與NAT服務器測試


上文中展示了私有雲盤的搭建方式,但僅能本地訪問肯定無法滿足有私有雲用戶的需求,於是筆者嘗試了多個流行的內網穿透工具,首先說明一下筆者目前的配置情況,可道雲是通過樹莓派掛載的,到達公網前至少有兩次NAT,服務器有一個香港的普通服務器( 30M 帶寬)和兩個江蘇的NAT服務器( 100M 帶寬),筆者將分別在兩種服務器上使用三個軟件,並介紹安裝和配置方法以及注意事項

首先解釋一下NAT服務器,與普通服務器不同的是,NAT服務器是多個用戶共用 IP 的,僅能使用十個至幾十個端口,有的是直接划分好端口段( OLVPS ),服務器上用防火牆打開對應端口即可使用,有的可以自行設定端口映射( CloudIPLC ),但是在公網上只能打開 1 萬以上的端口號,且可能已經被占用

FRP 和 NPS 的原理都相近,一個主(Server)多個從(Client),通過一個端口(TCP復用)使多個從服務器的端口映射到主服務器上,使得訪問主服務器端口時,能獲得訪問從服務器對應端口的目的。以本文的需求為例,假如我在樹莓派的 5000 端口上掛載了一個網頁服務,想通過公網訪問,則可以將樹莓派的 5000 端口映射到公網服務器的 6000 端口,然后訪問公網服務器的6000端口即可訪問網頁,其他的可以一一映射,如5100到6001,5200到6002,如下圖所示

NAT 服務器稍有不同,即多了一層映射,需要將 NAT 服務器的內網端口映射到公網端口上,假設需求和上圖相同,則需要將樹莓派的 5000 、 5100 和 5200 端口映射到 NAT 服務器的 6000 、 6001 、 6002 端口上,數據溝通端口則填寫 37000 而不是 7000 ,然后用戶通過訪問 36000 、 36001 和 36002 可獲得相同效果,如下圖所示

 

那么下面進入部署階段

FRP

一個由 go 語言實現的內網穿透工具,優點是下載即用,不需要安裝,可以在不同服務器間拷貝,直接運行即可,缺點是官方提供的 WebUI 非常雞肋,可以直接忽略,本文使用的是 0.34.1 版本

https://github.com/fatedier/frp

普通服務器

Server端

筆者一般先部署 Server 端,因為調試邏輯會更加簡單,首先去官網下載 Release 包,注意區別服務器系統版本,解壓壓縮包之后給予 frps 文件執行的權限,當然最簡單的方式就是整個目錄遞歸賦予 777 權限(筆者通過 WinSCP 操作的),然后修改 frps.ini ,筆者使用的設置為

[common]
bind_port = 7000
kcp_bind_port = 7000
token = 服務器間通信密碼
dashboard_port = 7001
dashboard_user = 用戶名
dashboard_pwd = WebUI密碼
log_file = /root/log/frps.log
log_level = info
log_max_days = 7

其中含有 dashboard 的幾個變量都是和 WebUI 相關的,不使用該功能的話可以直接刪掉,然后切換到目錄下運行看是否報錯(記得先創建 log 文件夾,不知道為什么這些軟件連創建文件夾都不會),如果未正常開啟可以在 log 文件中查看日志並修正

./frps -c ./frps.ini

Client端

解壓后修改配置文件 frpc.ini,注意和上面的區別,別修改或運行錯了

[common]
server_addr = 服務器ip
server_port = 7000
token = 服務器間通信密碼
protocol = kcp
log_file = /root/log/frpc.log
log_level = info
log_max_days = 7
[ssh] type
= tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 [web] type = tcp local_ip = 127.0.0.1 local_port = 80 remote_port = 6001

將服務器 ip 和密碼設置好后就可以運行了,如果使用的是 kcp 協議,需要放行通信端口(如上文中的 7000 端口)的 udp 協議,也可以使用默認的 tcp 協議,下方模塊的 type 中的協議不需要更改,更多協議可以參考官方文檔

./frpc -c ./frpc.ini

這時建議先兩邊都用 ssh 客戶端直接運行命令開啟服務並驗證是否可以連通,如果一切正常再使用其他方式后台運行,如果無法連接,下面列出了幾個常見的解決思路

1、查看 log 日志的報錯信息,其中 log 日志所在的目錄需要提前創建,然后根據錯誤信息來排查問題
2、查看是否端口已經被占用 netstat -lnp|grep 端口號
3、查看兩側防火牆是否均放行所有相應的端口的 tcp 協議,其中 kcp 需要放行溝通端口(如上文中的7000)的 tcp + udp 協議
4、從外部查看端口是否開放(測服務器的),需要開啟服務后即有程序監聽端口后查看, http://coolaf.com/tool/port
5、frpc.ini 配置文件里面的模塊是否重名,可能因為復制粘貼忘記修改而重名以至無法開啟服務

 

NAT服務器

Server端

和上面完全相同,如果是手動開啟映射的服務器,記得在使用 kcp 協議的時候,增加一條 udp 的映射

Client端

稍有不同的是需要將 server_port 改為映射后的端口,如上圖中的 37000 ,server_addr 實測支持填寫域名

 

NPS

一個同樣由 go 實現的內網穿透工具,但官方提供了更好的 WebUI ,並且可以直接操作 Server 端就能完成映射,在增減映射的時候不用重啟服務,避免了想重啟服務但關閉服務導致 ssh 掉線然后服務無法開啟因此失聯的尷尬局面,當然,為了更保險起見,筆者同時開了 FRP 和 NPS 服務,防止掉線后無法重連的尷尬,當然,后面加入了 ZeroTier  實現了三重保險,本文使用的是 0.26.9 版本

https://github.com/ehang-io/nps

普通服務器

Server端

下載Release包,解壓然后進入目錄,安裝

./nps install

默認情況下,服務會安裝到  /etc/nps  文件夾中,編輯配置文件  /etc/nps/conf/nps.conf  

一般情況下修改這四行內容即可

http_proxy_port=未被占用的端口
https_proxy_port=未被占用的端口
web_username=用戶名
web_password=密碼

因為很可能服務器的80和443端口已經用來開啟其他服務比如被 Nginx 監聽了,所以直接運行會報錯,因此需要修改成未被占用的端口,並填寫后台管理用的用戶名和密碼,在放行 8080 端口后開啟服務就可以訪問到后台了

nps start

點擊  客戶端 - 新增 - 新增  使用默認配置新增一個服務器,可以自行選擇是否加密和壓縮,然后點擊  隧道 - 新增  新增一個映射,以上圖為例,則  服務器端口  填寫 6000 , 目標 (IP:端口)  填寫  路由器下內網:5000  或者  127.0.0.1:5000 

然后返回  客戶端列表  點擊服務器左側加號,可以得到一條如下所示的  客戶端命令  ,復制后配置客戶端時使用,記得放行防火牆端口

./npc -server=服務器IP:端口(默認8024) -vkey=自動生成的密鑰 -type=tcp

如果需要修改默認端口 8024 ,可以修改  bridge_port  后重啟生效(理論上,筆者未測試),卸載可以執行  nps uninstall  后通過  whereis nps  找到殘留文件刪除即可

Client端

首先防火牆放行相應端口,然后解壓壓縮包然后進入目錄並執行上面復制的  客戶端命令 ,理論上,刷新后台即可看到客戶端狀態均變為綠色,因為是直接用 ssh 執行的命令,因此如果未正常連接,可以通過日志來查錯和修正,基本的排查錯誤的思路和 FRP 相同

 

NAT服務器

Server端

和上面完全相同

Client端

稍有不同的是需要將  客戶端命令  改為映射后的端口,如上圖中的 37000 , 服務器IP  實測支持填寫域名

 

ZeroTier

如果閱讀了上面兩個工具的 Github 頁面或者官方文檔,就會發現,里面都提到了一個 P2P 的連接方式,但是筆者嘗試后會發現存在諸多問題且很多時候無法連接,官方也表名並不穩定,那么,有沒有一個專門做 P2P 連接的工具呢,這個就是了,一個使用 CPP 和 C 實現的內網穿透工具,並且組建的是局域網,本文使用的是 1.4.6 版本

https://github.com/zerotier/ZeroTierOne

Leaf 節點(葉子節點)

這里面的概念發生了一些變化,因為這個的目的是將所有用戶連接起來形成一個局域網,因此所有用戶都是平等的,也就沒有服務端和客戶端的區別了,增加一個用戶相當於增加了一個 Leaf 節點,可以使用一鍵安裝包, Windows 用戶去下載 exe 文件安裝即可,如果 debian 系統下提示沒有 sudo 同時已經在 root 用戶下,去掉 sudo 即可

curl -s https://install.zerotier.com | sudo bash

如果安裝時提示  NO_PUBKEY 1657198823E52A61  ,則需要添加公鑰,這種情況一般是使用了第三方的鏡像導致的,比如清華源、阿里源

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1657198823E52A61

安裝完后就可以通過  zerotier-cli  配置服務器了,首先,開啟服務並設置開機自啟

systemctl start zerotier-one
systemctl enable zerotier-one

打開官網創建賬號然后新增網絡

https://my.zerotier.com/network

然后獲得一個  Network ID  ,所有節點加入網絡都使用相同的命令,Windows 下就使用管理員權限的 CMD 來執行

zerotier-cli join ID

如果成功則會返回

200 join success

然后打開防火牆 9993 的 udp 協議,Windows 下自動打開了,無需手動操作

然后在官網中打開該網絡的設置頁面,在  Members  中就會多出一個成員,即 Leaf 節點,左側打鈎即可同意加入網絡,同時會顯示版本號和公網 IP 並分配一個內網 IP ,當有超過兩個節點之后,就可以通過內網IP  Managed IPs  相互連通了,這個頁面似乎是會進行 ajax 刷新的,所以不需要手動刷新

 

Moon節點(月亮節點)

但如果連接國外 Planet 節點(行星節點)的效果不夠好怎么辦,可以自行搭建 Moon 節點當中轉站,首先,將 Moon 節點按上面方法加入網絡並授權,然后新增 Moon 配置

cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json

修改配置文件  moon.json  ,在括號內填入服務器的公網 IP 和端口,注意需要雙引號,同時復制ID,位於  ["id": "18fasd2319"] 內 ,后面讓其他 Leaf 節點加入時使用 

"stableEndpoints": ["公網IP/9993"]

在該目錄下生成 Moon 文件,文件名類似於 00000018fasd2319.moon

zerotier-idtool genmoon moon.json

新增 moons.d 文件夾,即  /var/lib/zerotier-one/moons.d/  ,將 00000018fasd2319.moon 文件移入,然后重啟服務

systemctl restart zerotier-one

其他節點綁定 moon 節點的方式都是輸入以下命令, ID 需要改為上面復制的 ID

zerotier-cli orbit 18fasd2319 18fasd2319

重啟服務后查看是否添加成功

zerotier-cli listpeers
zerotier-cli listmoons

listpeers 列出了局域網內所有的節點,包括官方的行星中轉節點 Planet 、所有用戶的葉子節點 Leaf 以及自建的月亮中轉節點 Moon ,一行為一個節點,如果沒有看到 Moon 節點則添加失敗, listmoons 如果返回為空則失敗

當然 Linux 下可以新建目錄  /var/lib/zerotier-one/moons.d/  ,然后復制生成的 moon 文件到文件夾下,重啟服務后查看是否生效

Windows下的默認目錄在  C:\ProgramData\ZeroTier\One\moons.d\  ,新建該文件夾然后復制進去,重啟(停止然后啟動)服務(打開開始菜單然后搜索服務即可找到)即可,如果執行 zerotier-cli 的命令時出現 missing authentication token ,則需要用管理員身份啟動 CMD ,如果出現了服務不正常的情況,比如右鍵狀態欄中圖標發現沒有節點,可以嘗試手動重啟服務或重啟電腦

兩個 Leaf 節點如果打通則通過 9993 端口的 UDP 協議連接,速度取決於兩端的帶寬和延時,與中轉節點無關,如果兩個 Leaf 節點之間未能成功打通,則會走服務器中轉

 

NAT服務器對比

無論如何都要選擇 KVM 架構的服務器,一般都有標明的,這個可玩性才高,一般情況下價格也不會高很多

CloudIPLC

https://www.cloudiplc.com/

需要實名認證,僅能開啟一個服務器,電信移動聯通均有,最便宜的 1C+384M+4G+600G ,價格為30元一個月,這個大小的內存如果重裝純凈版,僅能安裝 Debian9 , CentOS 和 Debian10 都是裝不上的,512M 的內存可以裝 Debian10 ,具體的重裝教程請閱讀下一篇文章

需要手動映射內網端口到公網端口上,TCP和UDP分開映射,考慮 ssh 端口占用一條,則可以配置額外十條映射規則

如果使用 FRP 的 KCP 模式,通信端口占用 TCP + UDP 兩條映射規則,則可以映射 8 個額外的端口

如果使用 NPS ,通信和 WebUI 占用兩個端口,同樣有額外 8 個端口可用,如果使用純文本配置,則多一個,但是會麻煩很多,用 NPS 就是看上了他的 WebUI

如果使用 ZeroTier,emmmmmm,為什么要為一個中轉功能開一個 NAT 服務器啊淦,隨便開個普通的服務器就好了,或者直接用官方的節點

不過不太能夠理解的是,因為不明原因,在穿透可道雲的時候,加載含大文件的文件夾時百分百會出現  Ajax Error ,且無法打開  AriaNG ,在重裝清華源 Debian9 、開啟 BBR 、檢查 MTU 、手動部署 Nginx-1.14.2 、手動部署 PHP7.3-FPM 、提高所有超時和大小限制、開啟 UDP 之后問題依舊,服務器提供商表示問題你們自己解決,可道雲開發者表示不關我事,遂放棄。不過在下載時,速度比較穩定,能長期維持 5MB/s 的速度,因為百兆是進出口帶寬,在中轉的時候同時進出,所以滿速就是 5MB/s 左右,如果有 dalao 能解決上述問題,歡迎評論區留言和討論

 

OLVPS

https://olvps.com/

不需要實名認證,能開啟多個服務器,電信移動聯通均有,最便宜的僅有 256M 內存,考慮到上面的經歷,嘗試了下 512M 內存的服務器,價格稍貴,讀者可以嘗試更便宜的那一款,進去后成功重裝清華源的 Debian10 

固定開啟一個端口段,需要在使用的時候將端口改到相應的端口段內,不過好處是 TCP 和 UDP 可以同時開啟,直接在防火牆上放行即可,因此最多有 10 個端口(相當於20 條映射規則)

測試可道雲穿透和 AriaNG 穿透均正常,不過速度不是很穩定,經常會掉到幾百 K ,在開啟 BBR 之后情況依舊,那么,有什么理由讓我不使用 ZeroTier 呢

 

BBR

NAT 服務器的內存普遍偏小,不適合直接安裝 CentOS 系統,當然服務商提供的系統是沒問題的,經過了一定的精簡,可以順利裝上,如果用戶直接從清華源安裝會報內存不足的錯誤,不過,無論使用哪個系統,都可以開啟 BBR 加速

Debian 在內核版本大於 4.9 時可以直接通過以下命令開啟並應用設置,現在的系統基本都符合要求

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

然后檢測是否開啟成功,返回值中含有 bbr 或者 fq 即開啟成功

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
lsmod | grep bbr

也可以安裝 BBR - PLUS ,readme 里面有安裝說明

https://github.com/Xaster/bbrplus-debian

CentOS 則需要安裝相應的編譯好的內核,有一鍵腳本可以使用,會下載一個內核,如果速度太慢可以下載好傳上服務器,不過需要自己修改一下腳本,難度很低

wget "https://github.com/cx9208/bbrplus/raw/master/ok_bbrplus_centos.sh" && chmod +x ok_bbrplus_centos.sh && ./ok_bbrplus_centos.sh

然后可以通過與上面相同的命令查看是否安裝成功

 

Supervisor守護進程

因為要開機啟動和后台掛載,於是使用 supervisor 服務,配置教程可以參考 基於CentOS7+supervisor+logrotate部署nginx+uwsgi ,debian下安裝supervisor命令稍有改變 

apt-get install supervisor

啟動服務並設置開機啟動

systemctl start supervisor
systemctl enable supervisor

修改配置文件 /etc/supervisor/supervisord.conf ,新增 web 頁面

[inet_http_server]         ; inet (TCP) server disabled by default
port=0.0.0.0:端口           ; (ip_address:port specifier, *:port for all iface) username=用戶名 ; (default is no username (open server)) password=密碼 ; (default is no password (open server))

端口、用戶名、密碼需自行修改,同時記得放行端口,然后更新配置

supervisorctl reload

Debian 下的任務后綴是 conf 而不是 ini ,在 /etc/supervisor/conf.d 文件夾下新增 frp.conf ,nps 則只用掛載客戶端, zerotier 不需要

[program:frp_supervisor]
stdout_logfile=/root/log/frp_supervisor.out.log stderr_logfile=/root/log/frp_supervisor.out.err directory=/root/frp command=/root/frp/frpc -c /root/frp/frpc.ini user=root autostart=true autorestart=true redirect_stderr=true

其中log路徑需要手動創建,否則無法運行,Server 端為 frps ,不要寫錯,然后更新列表並在 web 上查看是否正常運行

supervisorctl update

 

感謝

ZeroTier-One配置moon心得
https://blog.csdn.net/coldboy258/article/details/93133860
centos查看實時網絡帶寬占用情況方法
https://www.cnblogs.com/agang-php/p/6210900.html
Debian 9/10快速開啟Google BBR的方法,實現高效單邊加速
https://www.moerats.com/archives/297/ 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM