天天看點

怎麼利用frp實作内網穿透

内網穿透介紹

内網穿透是一種将内部網絡中的應用程式通過公共網絡通路的技術。它可以幫助使用者輕松地在外部網絡通路内部網絡中運作的應用程式,而無需在路由器上進行端口轉發或使用VPN。

内網穿透的實作方式有多種,其中較為常見的是基于反向代理伺服器的方式。反向代理伺服器可以将公共網絡請求轉發到内部網絡中的應用程式,并将響應傳回給用戶端。這種方式需要在公共網絡上配置反向代理伺服器,并在内部網絡中配置相應的應用程式和端口轉發規則。

另一種實作方式是使用專門的内網穿透軟體。這些軟體通常需要在内部網絡中安裝代理用戶端,并在公共網絡上安裝代理伺服器。使用者可以通過代理用戶端連接配接到代理伺服器,然後通路内部網絡中運作的應用程式。這種方式相對比較簡單,但需要額外安裝和配置軟體。

内網穿透的使用場景非常廣泛,例如遠端桌面、檔案共享、監控系統等。特别是在疫情期間,遠端辦公成為了趨勢,内網穿透技術也是以得到了更廣泛的應用。

然而,内網穿透也存在一些安全風險。由于内網穿透技術可以将内部網絡中的應用程式暴露在公共網絡上,如果沒有正确的安全措施,可能會導緻網絡攻擊和資料洩露等問題。是以,在使用内網穿透技術時需要注意加強網絡安全,例如限制通路IP位址、加密資料傳輸等。

frp介紹

frp 是一個開源、簡潔易用、高性能的内網穿透和反向代理軟體,支援 tcp, udp, http, https等協定。

frp 項目官網是 https://github.com/fatedier/frp,中文官方文檔位址:https://gofrp.org/docs/。除了安裝過程,中文文檔對使用過程已經介紹的非常詳細,如遇到問題,建議先檢視官方文檔。

frp工作原理為:

  1. 服務端運作,監聽一個主端口,等待用戶端的連接配接;
  2. 用戶端連接配接到服務端的主端口,同時告訴服務端要監聽的端口和轉發類型;
  3. 服務端fork新的程序監聽用戶端指定的端口;
  4. 外網使用者連接配接到用戶端指定的端口,服務端通過和用戶端的連接配接将資料轉發到用戶端;
  5. 用戶端程序再将資料轉發到本地服務,進而實作内網對外暴露服務的能力。

其他内網穿透工具

除了開源的frp,還有如下内網穿透/遠控工具:

  • ngrok:ngrok 也是很知名的内網穿透工具,自從2.x版本不再開源,名氣在下降。ngrok官網也提供免費穿透隧道,但國内連接配接速度較慢。NATAPP、Sunny-Ngrok等工具基于ngrok二次開發而來;
  • ZeroTier:号稱零配置的内網穿透工具,提供與企業 SDN 交換機同等的進階網絡虛拟化和管理功能,可以跨本地和廣域網連接配接任何裝置和程式。然而由于ZeroTier的伺服器在國外,國内連接配接速度經常很感人,需要自行搭建Moon來解決;
  • V2ray:V2ray是一個功能強大的網絡平台,提供代理、反向代理、内網穿透等功能。本站之前已有V2ray相關資源: V2ray教程、V2ray進階教程:流量僞裝 和 V2ray用戶端下載下傳;
  • 花生殼/向日葵:相信大部分折騰過路由器的人都聽說過花生殼DDNS,可能也知道向日葵遠控軟體。花生殼和向日葵是貝銳科技旗下的産品,注冊賬戶後可免費體驗内網穿透功能;
  • TeamViewer:TeamViewer是國内外知名的遠端控制、遠端會議軟體,額外提供檔案上傳下載下傳等實用功能,比QQ遠端協助好用一萬遍。雖然個人版免費,但是現在TeamViewer商業化道路一去不複往,用起來越來越惡心;
  • SAKURA FRP:基于frp的免費内網穿透工具,也有收費服務。對于這家的行為,網民褒貶不一。如果你沒有自己的伺服器,可以嘗試一下這家。

frp内網穿透教程

1、部署前需準備

1.1、準備一台能被公網通路到的(通過ip能夠直接通路得到伺服器)伺服器,一台内網的測試機(你自己電腦就行),本人用的伺服器是華為雲的linux伺服器,ip為124.5.23.6,測試機為win10系統。

1.2、通路官方項目位址:Releases · fatedier/frp · GitHub 下載下傳最新的包:

怎麼利用frp實作内網穿透

根據系統類型下載下傳對應的包

2、部署服務端

2.1、把 frp_0.48.0_linux_386.tar.gz(如果伺服器為window,解壓frp_0.48.0_windows_386.zip) 解壓出來保留以下三個檔案

怎麼利用frp實作内網穿透

2.2、修改配置檔案,用編輯器打開frps.ini檔案,做如下修改

[common]
#伺服器監聽穿口
bind_port = 15000
#身份認證 後面用戶端連接配接也需配置這個token  還有另一種oidc驗證比較複雜,可以參考官方文檔
token=332361857
#web界面端口
dashboard_port = 15001
# dashboard 使用者名密碼,可選,預設為空
dashboard_user = admin
dashboard_pwd = admin332361857
#設定每個代理可以建立的連接配接池上限,避免大量資源占用,用戶端設定超過此配置後會被調整到目前值
max_pool_count = 5
#端口白名單
allow_ports = 15000,15001,15002-15009
#http監聽的端口
vhost_http_port = 15003
#日志檔案配置
log_file = ./frps.log
#日志級别配置
log_level = info

           

以上是本次測試需要用到的參數,詳細參數如下:

參數 類型 說明 預設值 可選值 備注
bind_addr string 服務端監聽位址 0.0.0.0
bind_port int 服務端監聽端口 7000 接收 frpc 的連接配接
bind_udp_port int 服務端監聽 UDP 端口 用于輔助建立 P2P 連接配接
kcp_bind_port int 服務端監聽 KCP 協定端口 用于接收采用 KCP 連接配接的 frpc
quic_bind_port int 服務端監聽 QUIC 協定端口 用于接收采用 QUIC 連接配接的 frpc
quic_keepalive_period int quic 協定 keepalive 間隔,機關: 秒 10
quic_max_idle_timeout int quic 協定的最大空閑逾時時間,機關: 秒 30
quic_max_incoming_streams int quic 協定最大并發 stream 數 100000
proxy_bind_addr string 代理監聽位址 同 bind_addr 可以使代理監聽在不同的網卡位址
log_file string 日志檔案位址 ./frps.log 如果設定為 console,會将日志列印在标準輸出中
log_level string 日志等級 info trace, debug, info, warn, error
log_max_days int 日志檔案保留天數 3
disable_log_color bool 禁用标準輸出中的日志顔色 false
detailed_errors_to_client bool 服務端傳回詳細錯誤資訊給用戶端 true
tcp_mux_keepalive_interval int tcp_mux 的心跳檢查間隔時間 60 機關:秒
tcp_keepalive int 和用戶端底層 TCP 連接配接的 keepalive 間隔時間,機關秒 7200 負數不啟用
heartbeat_timeout int 服務端和用戶端心跳連接配接的逾時時間 90 機關:秒
user_conn_timeout int 使用者建立連接配接後等待用戶端響應的逾時時間 10 機關:秒
udp_packet_size int 代理 UDP 服務時支援的最大包長度 1500 服務端和用戶端的值需要一緻
tls_cert_file string TLS 服務端證書檔案路徑
tls_key_file string TLS 服務端密鑰檔案路徑
tls_trusted_ca_file string TLS CA 證書路徑

2.3、把三個檔案上傳至伺服器指定目錄,運作指令

./frps -c frps.ini           

輸出如下指令說明服務端運作成功

2023/03/31 10:59:01 [I] [root.go:206] frps uses config file: /home/web/frp/frps.ini
2023/03/31 10:59:01 [I] [service.go:200] frps tcp listen on 0.0.0.0:15000
2023/03/31 10:59:01 [I] [service.go:261] http service listen on 0.0.0.0:15003
2023/03/31 10:59:01 [I] [service.go:317] Dashboard listen on 0.0.0.0:15001
2023/03/31 10:59:01 [I] [root.go:215] frps started successfully
           

2.4、通路web界面 124.5.23.6:15001,如下:

怎麼利用frp實作内網穿透

2.5、至此服務端配置成功

3、用戶端基礎配置

3.1、把 frp_0.48.0_windows_386.zip(如果伺服器為window,解壓frp_0.48.0_linux_386.tar.gz) 解壓出來保留以下三個檔案

怎麼利用frp實作内網穿透

3.2、修改配置檔案,用編輯器打開frpc.ini檔案,做如下修改

[common]
#外網-伺服器端ip
server_addr = 124.5.23.6
#外網-伺服器端監聽的端口(必須與frps.ini中的配置一緻)
server_port = 15000
#token驗證需與服務端配置的一緻
token=332361857
#日志檔案配置
log_file = ./frps.log
#日志級别配置
log_level = info
#連接配接池大小
pool_count=5
#用戶端的web界面
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin           

以上是本次測試需要用到的參數,詳細參數如下:

參數 類型 說明 預設值 可選值 備注
server_addr string 連接配接服務端的位址 0.0.0.0
server_port int 連接配接服務端的端口 7000
connect_server_local_ip string 連接配接服務端時所綁定的本地 IP
dial_server_timeout int 連接配接服務端的逾時時間 10
dial_server_keepalive int 和服務端底層 TCP 連接配接的 keepalive 間隔時間,機關秒 7200 負數不啟用
http_proxy string 連接配接服務端使用的代理位址 格式為 {protocol}://user:[email protected]:8080 protocol 目前支援 http、socks5、ntlm
log_file string 日志檔案位址 ./frpc.log 如果設定為 console,會将日志列印在标準輸出中
log_level string 日志等級 info trace, debug, info, warn, error
log_max_days int 日志檔案保留天數 3
disable_log_color bool 禁用标準輸出中的日志顔色 false
pool_count int 連接配接池大小
user string 使用者名 設定此參數後,代理名稱會被修改為 {user}.{proxyName},避免代理名稱和其他使用者沖突
dns_server string 使用 DNS 伺服器位址 預設使用系統配置的 DNS 伺服器,指定此參數可以強制替換為自定義的 DNS 伺服器位址
login_fail_exit bool 第一次登陸失敗後是否退出 true
protocol string 連接配接服務端的通信協定 tcp tcp, kcp, quic, websocket
quic_keepalive_period int quic 協定 keepalive 間隔,機關: 秒 10
quic_max_idle_timeout int quic 協定的最大空閑逾時時間,機關: 秒 30
quic_max_incoming_streams int quic 協定最大并發 stream 數 100000
tls_enable bool 啟用 TLS 協定加密連接配接 false
tls_cert_file string TLS 用戶端證書檔案路徑
tls_key_file string TLS 用戶端密鑰檔案路徑
tls_trusted_ca_file string TLS CA 證書路徑
tls_server_name string TLS Server 名稱 為空則使用 server_addr
disable_custom_tls_first_byte bool TLS 不發送 0x17 false 當為 true 時,不能端口複用
tcp_mux_keepalive_interval int tcp_mux 的心跳檢查間隔時間 60 機關:秒
heartbeat_interval int 向服務端發送心跳包的間隔時間 30 建議啟用 tcp_mux_keepalive_interval,将此值設定為 -1
heartbeat_timeout int 和服務端心跳的逾時時間 90
udp_packet_size int 代理 UDP 服務時支援的最大包長度 1500 服務端和用戶端的值需要一緻
start string 指定啟用部分代理 當配置了較多代理,但是隻希望啟用其中部分時可以通過此參數指定,預設為全部啟用
meta_xxx map 附加中繼資料 會傳遞給服務端插件,提供附加能力

3.3、用cmd運作

frpc -c frpc.ini           

3.4、通路管理端 http://127.0.0.1:7400/,出現如下說明配置成功

怎麼利用frp實作内網穿透

4、代理配置

4.1、代理的基礎配置如下:

參數 類型 說明 是否必須 預設值 可選值 備注
type string 代理類型 tcp tcp, udp, http, https, stcp, sudp, xtcp, tcpmux
use_encryption bool 是否啟用加密功能 false 啟用後該代理和服務端之間的通信内容都會被加密傳輸
use_compression bool 是否啟用壓縮功能 false 啟用後該代理和服務端之間的通信内容都會被壓縮傳輸
proxy_protocol_version string 啟用 proxy protocol 協定的版本 v1, v2 如果啟用,則 frpc 和本地服務建立連接配接後會發送 proxy protocol 的協定,包含了原請求的 IP 位址和端口等内容
bandwidth_limit string 設定單個 proxy 的帶寬限流 機關為 MB 或 KB,0 表示不限制,如果啟用,會作用于對應的 frpc
bandwidth_limit_mode string 限流類型,用戶端限流或服務端限流 client client, server

4.2、代理的本地服務配置

local_ip 和 plugin 的配置必須配置一個,且隻能生效一個,如果配置了 plugin,則 local_ip 配置無效。

參數 類型 說明 是否必須 預設值 可選值 備注
local_ip string 本地服務 IP 127.0.0.1 需要被代理的本地服務的 IP 位址,可以為所在 frpc 能通路到的任意 IP 位址
local_port int 本地服務端口 配合 local_ip
plugin string 用戶端插件名稱 見用戶端插件的功能說明 用于擴充 frpc 的能力,能夠提供一些簡單的本地服務,如果配置了 plugin,則 local_ip 和 local_port 無效,兩者隻能配置一個
plugin_params map 用戶端插件參數 map 結構,key 需要都以 “plugin_” 開頭,每一個 plugin 需要的參數也不一樣,具體見用戶端插件參數中的内容

4.3、代理的負載均衡和健康檢查

參數 類型 說明 是否必須 預設值 可選值 備注
group string 負載均衡分組名稱 使用者請求會以輪詢的方式發送給同一個 group 中的代理
group_key string 負載均衡分組密鑰 用于對負載均衡分組進行鑒權,group_key 相同的代理才會被加入到同一個分組中
health_check_type string 健康檢查類型 tcp,http 配置後啟用健康檢查功能,tcp 是連接配接成功則認為服務健康,http 要求借口傳回 2xx 的狀态碼則認為服務健康
health_check_timeout_s int 健康檢查逾時時間(秒) 3 執行檢查任務的逾時時間
health_check_max_failed int 健康檢查連續錯誤次數 1 連續檢查錯誤多少次認為服務不健康
health_check_interval_s int 健康檢查周期(秒) 10 每隔多長時間進行一次健康檢查
health_check_url string 健康檢查的 HTTP 接口 如果 health_check_type 類型是 http,則需要配置此參數,指定發送 http 請求的 url,例如 “/health”

4.4、代理的TCP配置,在下面我們配置通路内網的SSH。

4.4.1、接上一節繼續修改配置檔案frpc.ini,在前面的基礎上加入

#代理名稱 注意代理名稱不能重複,配置多個需要區分,如[ssh] [ssh1] [ssh2]
[ssh]
#配置類型為http協定
type = tcp
#内網機器的IP
local_ip = 127.0.0.1
#内網需要監聽的端口(win10所啟服務端口)
local_port = 22
remote_port = 15002
#是否開啟加密
use_encryption = true
#是否開啟壓縮
use_compression = true           

4.4.2、運作用戶端後

ssh -p 15002  [email protected]            

4.4.3、成功通路

怎麼利用frp實作内網穿透

4.5、代理的Http配置,下面我們配置一個通路内網web的例子

4.5.1、接上一節繼續修改配置檔案frpc.ini,在前面的基礎上加入

[web]
type = http
#本地端口
local_port = 8080
#伺服器綁定自定義域名,需把域名解析到伺服器ip
custom_domains = proxy.test.com            

4.5.2、運作用戶端後,即可通路到本地的http服務了,15003是服務端配置的http監聽端口

怎麼利用frp實作内網穿透

4.6、frp還可以代理STCP\SUDP\XTCP\TCPMUX\UDP,由于本人暫時沒用到,等用到時候再給大家分享,有問題可以評論區提出,謝謝!

最後分享下配置過程中會涉及到的一些技術:

1、如果需要frp開機自啟動可以參考:frp開機自啟動

2、配置中所有配置的端口服務端都需要開放防火牆,參考:linux防火牆配置

1