內網穿透,也即 NAT 穿透,進行 NAT 穿透是為了使具有某一個特定源 IP 地址和源端口號的數據包不被 NAT 設備屏蔽而正確路由到內網主機。
簡單來說,就是讓互聯網(外網)設備能訪問局域網(內網)設備提供的服務,這里的設備通常指電腦。
一、內網穿透的應用場景
對開發人員來說,需要使用到內網穿透的一個典型的應用場景就是針對第三方授權(通常是 OAuth2.0)和支付回調的開發調試。通過內網穿透工具將第三方 SDK 或平臺的回調地址映射到本機開發環境,從而達到實時調試的目的。
其次是節約部署成本(通常是公網服務器費用)。通過將應用部署在本機,再利用內網穿透工具對外提供服務,這樣既能節約服務器租用費用,又能提升服務器的硬件配置。
目前,市面上有不少免費提供內網穿透的工具/產品,比如很大眾化的nat123,那為什么還要自己搭建呢?
筆者搭建內網穿透的目的就屬于,低頻率開發調試用,在擁有公網服務器的條件下,自建是最合適的方式。
二、內網穿透的搭建工具
ngrok:一個國外的穿透工具,1.0 版本是開源的,目前 2.0 及以上版本已經閉源,并且提供免費和收費的服務。
frp:這是一個國內的開源工具,目前最新版本為 v0.61.1(截止2025-02-14),有比較詳盡的中文文檔,并且一直在維護更新。
由于 frp 一直開源,并且維護積極、更新頻繁,再加上中文文檔的加持,筆者最終選擇了 frp 作為搭建工具。
注:frp 自主搭建需要一個有公網 ip 的服務器,本文使用阿里云 ECS。
三、frp 下載和版本選擇
官方 github release 地址,目前最新版本是 v0.61.1(截止2025-02-14),官方github地址可能不易訪問和下載,這里提供了 v0.61.1 的常用平臺安裝包:developbook.cn/download/fr…
1、版本選擇說明
壓縮包說明
frp_0.61.1_darwin_amd64.tar.gz適用于 Mac OS 系統
frp_0.61.1_freebsd_amd64.tar.gz適用于 FreeBSD 64 位系統
frp_0.61.1_linux_amd64.tar.gz適用于 Linux 64 位系統
frp_0.61.1_linux_arm.tar.gz適用于 Linux 32 位嵌入式系統
frp_0.61.1_linux_arm64.tar.gz適用于 Linux 64 位嵌入式系統
frp_0.61.1_windows_amd64.zip適用于 Windows 64 位系統
frp_0.61.1_windows_arm64.zip適用于 Windows 64 位嵌入式系統
筆者的服務器系統為 CentOS7 64 位,所以選擇了 frp_0.61.1_linux_amd64.tar.gz;筆者的個人電腦系統為 Mac OS X,所以選擇了 frp_0.60.1_darwin_amd64.tar.gz。
2、下載方式
直接下載
直接點擊鏈接,使用瀏覽器下載到本機。利用 ssh 工具連接到阿里云 ECS,再使用 lrzsz 工具的 rz 命令將 frp_0.61.1_linux_amd64.tar.gz 上傳到服務器,而壓縮包 frp_0.61.1_darwin_amd64.tar.gz 直接在本機解壓。
推薦大家一款Mac上好用的免費SSH工具:FinalShell
注:ssh 工具、lrzsz 實用工具的安裝和用法可自行搜索。
終端命令下載
? ? 服務器// 下載
wget https://developbook.cn/download/frp/v0.61.1/frp_0.61.1_linux_amd64.tar.gz
// 解壓
tar -xzvf frp_0.61.1_linux_amd64.tar.gz
? ? 本機// 使用curl下載
curl -O https://developbook.cn/download/frp/v0.61.1/frp_0.61.1_darwin_amd64.tar.gz
// 解壓
tar -xzvf frp_0.61.1_darwin_amd64.tar.gz
3、frp 壓縮包文件說明
每個壓縮包解壓后都包含以下文件:
? ? frpc —— 客戶端可執行二進制文件
frpc.toml —— 客戶端使用的配置文件
frps —— 服務端可執行二進制文件
frps.toml —— 服務端使用的配置文件
注:服務端只需用到 frp_0.61.1_linux_amd64 目錄下的 frps 相關文件,本機(客戶端)只需用到 frp_0.61.1_darwin_amd64 目錄下的 frpc 相關文件。
四、FRP服務端配置和啟動
1、在服務器上打開 frps.toml:
??vi frps.toml
注:確保當前已進入工作目錄/root/frp_0.61.1_linux_amd64/。
2、配置 frps 要監聽的端口:按下 i 進入編輯模式,在末尾增加一行:vhostHTTPPort = 8080,使 frps.toml 最終配置如下:
??[common]
bindPort = 7000
vhostHTTPPort = 8080
注:vhostHTTPPort 監聽的端口不能被占用,否則會導致 frps 不能啟動,端口可根據實際需要修改;bindPort 端口為 frp 服務端和客戶端連接通信的端口,默認為 7000。
3、保存配置并退出:按下 Esc,輸入:wq。
4、啟動 frps 程序:
??./frps -c ./frps.toml
注:如遇 permission denied 錯誤,表明 frps 可能沒有運行權限,則先賦權:
??chmod 700 frps
然后再次執行啟動命令。
五、FRP客戶端配置和啟動
1、在本機進入 frp_0.61.0_darwin_amd64 目錄,打開 frpc.toml 文件;
2、以配置訪問內網的 web 服務(常見情形)為例,最終修改 frpc.toml 如下:
??serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "local-service"
type = "http"
localIP = "127.0.0.1"
localPort = 3000
注:x.x.x.x 為運行 frps 的服務器公網 ip,localPort 為本機啟動的 web 服務對應的端口,請根據實際情況修改。
3、啟動 frpc 程序:
??sudo ./frpc -c ./frpc.toml
注:此時 frpc 會通過 7000 端口嘗試與 frps 建立通信連接,如果一切順利,則終端會提示連接成功;但實際情況卻顯示連接失敗,因為還少了兩個步驟:
一、需要登錄阿里云控制臺將 7000 端口加入阿里云 ECS 安全組的入站規則里面,同理還需將 8080 端口加入。具體操作參考:添加安全組規則;
二、將 7000 和 8080 加入服務器防火墻規則,具體操作參考:CentOS7 使用 firewalld 打開關閉防火墻與端口。
當一切就緒,frpc 啟動并連接成功后,打開瀏覽器輸入 x.x.x.x:8080 就能訪問到本機 127.0.0.1:3000 的服務(本機 web 服務需要處于啟動狀態)。
至此,一個最簡配置的基于 frp 的內網穿透便搭建完成,更多配置和用法,請參考官方文檔:frp 官方中文文檔。
六、小結
有公網主機資源和有一定的網絡知識的,是可以花點時間自己搭建自己專屬的內網穿透服務器的,采用FRP這樣的開源工具,社區支持文檔多,有什么問題可以參考相應教程來處理。
沒有公網IP的和普通用戶,或確實不想多折騰的,還要是要老老實實用其他三方內網穿透工具,如nat123這樣的有界面直接操作一步添加映射可以自定義內網地址和公網地址端口,就能實現內網提供發布到互聯網。