1. 程式人生 > 實用技巧 >內網穿透工具對比FRP+NPS+Zerotier與NAT伺服器測試

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

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

首先解釋一下NAT伺服器,與普通伺服器不同的是,NAT伺服器是共用IP的,僅能使用十個至幾十個埠,有的是直接劃分好埠段(OLVPS),伺服器上用防火牆開啟對應埠即可使用,有的可以自行設定埠對映(CloudIPLC),但是在公網上只能開啟1萬以上的埠號

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

NAT伺服器稍有不同,即多了一層對映,需要將NAT伺服器的內網埠對映到公網埠上,假設需求和上圖相同,則需要將5000、5100和5200埠對映到6000、6001、6002,資料溝通則填寫37000,然後使用者通過訪問36000、36001和36002獲得相同效果,如下圖所示

那麼進入部署階段

FRP

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

https://github.com/fatedier/frp

普通伺服器

Server端

筆者一般習慣先部署 Server 端,因為除錯邏輯會更加簡單,首先去官網下載 Release 包,注意區別伺服器系統版本,解壓壓縮包之後給予 frps 檔案執行的許可權,當然最簡單的方式就是整個目錄遞迴給 777 許可權,修改 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

NAT伺服器

Server端

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

Client端

稍有不同的是需要將 server_port改為對映後的埠,如上圖中的 37000 ,server_addr 實測支援填寫域名

NPS

一個有更好 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埠已經用來開啟其他服務了,所以直接執行會報錯,因此需要修改成未被佔用的埠,並填寫使用者名稱和密碼,在放行 8080 埠後開啟服務就可以訪問到後臺了

nps start

點選客戶端 - 新增 - 新增 使用預設配置新增一個伺服器,可以自行選擇是否加密和壓縮,然後點選隧道 - 新增 新增一個對映,以上圖為例,則伺服器埠 填寫 6000 ,目標 (IP:埠)填寫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 連線的服務呢,這個就是了,本文使用的是 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

然後在官網中開啟該網路的設定頁面,在Members 中就會多出一個成員,即 Leaf 節點,左側打鉤即可同意加入網路,當有超過兩個節點之後,就可以通過內網IPManaged IPs 相互連通了,這個頁面似乎是會進行 ajax 重新整理的,所以不需要手動重新整理

Moon節點

但如果連線國外 Planet 伺服器的效果不夠好怎麼辦,可以自行搭建 Moon 節點當中轉站,首先,將 Moon 節點按上面方法加入網路,然後新增 Moon 配置

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

修改配置檔案moon.json ,在括號內填入公網 ip 和埠,注意需要雙引號,同時複製一個類似["id": "18fasd2319"]的 ID ,後面讓其他 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

其他節點加入的方式都是輸入以下命令, ID 需要改為實際值

zerotier-cli orbit 18fasd2319 18fasd2319

重啟服務後檢視是否新增成功

zerotier-cli listpeers
zerotier-cli listmoons

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

當然可以新建目錄/var/lib/zerotier-one/moons.d/ ,然後複製 moon 檔案到資料夾下,重啟服務後檢視是否生效

Windows下的預設目錄在C:\ProgramData\ZeroTier\One\moons.d,新建資料夾然後複製進去,重啟(停止然後啟動)服務(開啟開始選單然後搜尋服務即可找到)即可,Windows 下會自動開啟防火牆埠,不需要更多的設定,如果執行 zerotier-cli 的命令時出現missing authentication token ,則需要用管理員身份啟動 CMD ,如果出現了服務不正常的情況,可以嘗試手動重啟服務

兩個 Leaf 節點如果打通則速度取決於兩端的頻寬和延時,與中轉節點無關,如果兩個 Leaf 節點之間未能成功打通,則會走伺服器中轉

NAT伺服器對比

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,為什麼一箇中轉伺服器要開這麼個伺服器啊淦,隨便開個普通的伺服器就好了

不過不太能夠理解的是,因為不明原因,在穿透可道雲的時候,載入含大檔案的資料夾時百分百會出現Ajax Error,無法開啟AriaNG,在重灌清華源 Debian9 、開啟 BBR 、檢查 MTU 、手動部署 Nginx-1.14.2 、手動部署 PHP7.3-FPM 、提高所有超時和大小限制之後問題依舊,於是只能放棄,不過在下載時,速度比較穩定,能長期維持 5MB/s 的速度,因為百兆是進出口頻寬,在中轉的時候同時進出,所以滿速就是 5MB/s 左右,如果有 dalao 能解決上述問題,歡迎評論區留言和討論

OLVPS

https://olvps.com/

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

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

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

感謝

ZeroTier-One配置moon心得
https://blog.csdn.net/coldboy258/article/details/93133860
centos檢視實時網路頻寬佔用情況方法
https://www.cnblogs.com/agang-php/p/6210900.html