Frp 內網穿透服務搭建#
引言#
本文寫於 2023-04-24,服務端使用 阿里雲飛天白嫖伺服器 系統為 Ubuntu18
客戶端使用 Microsoft Windows 10 企業版 N
frp 版本為 frp_0.48.0
使用 frp 內網穿透 校園網 進行 Windows 遠程桌面、stable-diffusion 頁面、Alist 等等
服務端#
下載#
| Github 首頁 | Releases 頁 |
frp 版本與系統和架構對應
不知道下載什麼版本?使用 hostnamectl
查看 Linux 系統信息:
# hostnamectl
Static hostname: gaoqiqiang
Icon name: computer-vm
Chassis: vm
Machine ID: ec8469a4caecdssfc4eb
Boot ID: 78dded31dc7e9f2a6c62
Virtualization: kvm
Operating System: Ubuntu 18.88.8 LTS
Kernel: Linux 5.55.0-202-generic
Architecture: x86-64 # x86-64 也是 amd64
解壓並移動 (安裝) 到指定目錄#
# 解壓
tar -zxvf 壓縮文件名.tar.gz
# 移動
mv ./frp /opt/
配置 frps.ini#
由於項目會更新,下文的配置僅供特定的版本 [frp_0.48.0] 作參考,具體配置方法最有效的是查看下載的文件中 frps_full.ini
文件 或者查看倉庫的頁面 (可以使用網頁翻譯) 倉庫
vim /opt/frp/frps.ini
注意: 註釋只能獨佔一行!錯誤配置:bind_port = 7000 # 錯誤註釋
[common]
bind_addr = 0.0.0.0
bind_port = 7000
dashboard_port = 7500
# 指定 frps 服務綁定的 UDP 端口,其作用是幫助 frpc 客戶端穿透 NAT。
bind_udp_port = 7001
# 用於 kcp 協議的 udp 端口,它可以與 bind_port 相同。
# 如果未設置,則在 frp 中禁用 kcp。
kcp_bind_port = 7000
# 客戶端鏈接的密碼
token = 12345678
# 設置 log_file 將不會在控制台輸出日誌
log_file = ./frps.log
# trace, debug, info, warn, error
log_level = info
# 僅允許 frpc 綁定您列出的端口,如果您什麼也不設置,則不會有任何限制
#allow_ports = 2000-3000,3001,3003,4000-50000
# 用於基本身份驗證保護的儀表板用戶和密碼
dashboard_user = adminName
dashboard_pwd = password
手動運行測試#
推薦將 log_file = ./frps.log
註釋掉,可以在控制台看見信息
/opt/frp/frps -c /opt/frp/frps.ini
查看輸出
[I] [root.go:206] frps uses config file: /opt/frp/frps.ini
[I] [service.go:200] frps tcp listen on 0.0.0.0:7000
[I] [service.go:210] frps kcp listen on udp 0.0.0.0:7000
[I] [service.go:302] nat hole udp service listen on 0.0.0.0:7001
[I] [service.go:317] Dashboard listen on 0.0.0.0:7500
[I] [root.go:215] frps started successfully
# 運行成功
如果運行失敗了,可以參考輸出的信息,同時檢查 frps.ini 配置,Google (GPT) 尋求幫助
配置 frps 服務項#
使用 systemd
管理服務,確保你的 Linux 使用的是 systemd (沒有可以安裝)
或者使用可用的管理軟件,請自行學。
vim /lib/systemd/system/frps.service
內容如下:
[Unit]
Description = frps daemon # 服務項說明
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
#此處把 /opt/frp 替換成 你的frp的實際安裝目錄
ExecStart = /opt/frp/frps -c /opt/frp/frps.ini
[Install]
WantedBy = multi-user.target
如果不是第一次編輯這個文件可能需要重新加載
使用 systemctl daemon-reload
命令來重新加載配置並應用更改
服務項命令#
# 啟動 frps
sudo systemctl start frps
# 打開自啟動
sudo systemctl enable frps
# 重啟應用
sudo systemctl restart frps
# 停止應用
sudo systemctl stop frps
# 查看狀態和日誌
sudo systemctl status frps
客戶端#
下載對應版本 frp#
查看 Windows 架構:
使用 msinfo32
或者 systeminfo
命令
如果 系統類型:x64-based PC
選擇 amd64 的 Windows 版本
配置 frpc.ini#
測試 demo#
這裡需要有可以供測試的服務才能測試服務實際運行情況,比如 Alist、遠程桌面等等。
如果你什麼都沒有,可以使用開源軟件 簡單伺服器 搭建一個簡單的網站服務測試,本軟件由本人提供漢化支持,連官方文檔也漢化了哟!| Github 頁 | Releases 頁 | 官方網頁 | 官方文檔 |
開始配置#
注意: 註釋只能獨佔一行!錯誤配置:bind_port = 7000 # 錯誤註釋
[common]
# 伺服器地址
server_addr = 822.222.222.229
# 伺服器 bind_port 端口
server_port = 7000
token = 12345678
# ServerUDPPort 指定了伺服器用於穿透 NAT 隧道的端口。默認情況下,此值為 0。
# 該參數僅在執行命令行中的 "nathole discover" 時使用。
# server_udp_port = 0
#如果你想通過http代理或者socks5代理或者ntlm代理來連接frps,你可以在這裡或者在全局環境變量中設置http_proxy
#僅在協議為 tcp 時有效
# http_proxy = http://user:[email protected]:8080
# http_proxy = socks5://user:[email protected]:1080
# http_proxy = ntlm://user:[email protected]:2080
# 服務的名稱,隨便就好
[web]
# 轉發流量的類型
# tcp | udp | http | https | stcp | xtcp, 默認是 tcp
type = tcp
# 本地地址
local_ip = 127.0.0.1
# 本地端口
local_port = 9999
# 遠程端口
remote_port = 8083
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 8082
手動運行測試#
注意:伺服器端需要正常運行,建議兩邊都手動運行方便實時查看日誌
Windows 在 cmd 中運行
cd /d frp目錄
frpc.exe -c frpc.ini
[I] [service.go:299] login to server success, get run id [xx], server udp port [7001]
[I] [proxy_manager.go:142] proxy added: [sd rdp]
[I] [control.go:172] [sd] start proxy success
[I] [control.go:172] [rdp] start proxy success
# 穿透成功,成功映射對應服務
伺服器日誌
[I] [service.go:500] client login info: ip [xxx] version [0.48.0] hostname [] os [windows] arch [amd64]
[I] [tcp.go:66] [] [sd] tcp proxy listen port [8888]
[I] [control.go:464] new proxy [sd] type [tcp] success
[I] [tcp.go:66] [] [rdp] tcp proxy listen port [9999]
[I] [control.go:464] [] new proxy [rdp] type [tcp] success
服務已經成功了,訪問對應的端口即可看見結果
配置 frpc 服務項#
在 Windows 上將普通程序設置為服務項的方法有很多,我使用的是 nssm 開源軟件,雖然軟件多年沒有更新了,GUI 界面在 Win10 上顯示也不太方便使用,但是又不是不能用。
nssm 軟件使用本文不涉。
可用的軟件有:
Frp 控制台#
訪問: http://IP地址:7500
如果在 frps.ini 中配置了鑒權還需要輸入用戶和密碼
其他#
關於配置文件#
[common]
是公共配置的意思,以這種節點的方式進行配置是 ini 文件的常見寫法。顧名思義,如果有多個 frps 伺服器,也可以單獨設置每個應用的 frps 服務,本文不展開,參考官方文檔是最好的學習方式 frpc.ini。
nathole discover
是 frp 工具中的一個命令行工具,用於探測當前網絡環境下是否存在 NAT 隧道,並嘗試通過穿透 NAT 隧道來建立連接。
在使用 frp 進行內網穿透時,如果客戶端和伺服器之間存在 NAT 隧道,就會導致無法建立連接。通過執行 nathole discover
命令,frp 可以探測當前網絡環境下是否存在 NAT 隧道,並嘗試通過穿透 NAT 隧道來建立連接,從而解決連接問題。
在執行 nathole discover
命令時,frp 將會向伺服器發送 UDP 資料包,並從伺服器的響應中獲取 NAT 類型和公網 IP 地址等信息。根據獲取到的信息,frp 嘗試使用不同的方式來穿透 NAT 隧道,以建立連接。
需要注意的是,nathole discover
命令僅適用於 UDP 類型代理,因為它需要使用 UDP 資料包來進行探測。如果您使用的是 TCP 類型代理,則無法使用 nathole discover
命令來穿透 NAT 隧道。
代理類型#
frp 支持多種代理類型來適配不同的使用場景。
類型 | 描述 |
---|---|
tcp | 單純的 TCP 端口映射,伺服器會根據不同的端口路由到不同的內網服務。 |
udp | 單純的 UDP 端口映射,伺服器會根據不同的端口路由到不同的內網服務。 |
http | 針對 HTTP 應用定制了一些額外的功能,例如修改 Host Header,增加鑒權。 |
https | 針對 HTTPS 應用定制了一些額外的功能。 |
stcp | 安全的 TCP 內網代理,需要在被訪問者和訪問者的機器上都部署 frpc,不需要在伺服器暴露端口。 |
sudp | 安全的 UDP 內網代理,需要在被訪問者和訪問者的機器上都部署 frpc,不需要在伺服器暴露端口。 |
xtcp | 點對點內網穿透代理,功能同 stcp,但是流量不需要經過伺服器中轉。 |
tcpmux | 支持伺服器 TCP 端口的多路復用,通過同一個端口訪問不同的內網服務。 |