frp內網穿透
參考https://gofrp.org/docs/examples/
下載https://github.com/fatedier/frp
部署
解壓縮下載的壓縮包,將其中的 frpc 拷貝到內網服務所在的機器上,將 frps 拷貝到具有公網 IP 的機器上,放置在任意目錄。
開始使用!
編寫配置檔案,先通過 ./frps -c ./frps.ini 啟動服務端,再通過 ./frpc -c ./frpc.ini 啟動客戶端。如果需要在後臺長期執行,建議結合其他工具使用,例如 systemd 和 supervisor。
如果是 Windows 使用者,需要在 cmd 終端中執行命令。
通過 SSH 訪問內網機器
這個示例通過簡單配置 TCP 型別的代理讓使用者訪問到內網的伺服器。
-
在具有公網 IP 的機器上部署 frps,修改 frps.ini 檔案,這裡使用了最簡化的配置,設定了 frp 伺服器使用者接收客戶端連線的埠:
[common] bind_port = 7000
-
在需要被訪問的內網機器上(SSH 服務通常監聽在 22 埠)部署 frpc,修改 frpc.ini 檔案,假設 frps 所在伺服器的公網 IP 為 x.x.x.x:
[common] server_addr = x.x.x.x server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
local_ip
和local_port
配置為本地需要暴露到公網的服務地址和埠。remote_port
表示在 frp 服務端監聽的埠,訪問此埠的流量將會被轉發到本地服務對應的埠。 -
分別啟動 frps 和 frpc。
-
通過 SSH 訪問內網機器,假設使用者名稱為 test:
ssh -oPort=6000 [email protected]
frp 會將請求
x.x.x.x:6000
的流量轉發到內網機器的 22 埠。
通過自定義域名訪問內網的 Web 服務
這個示例通過簡單配置 HTTP 型別的代理讓使用者訪問到內網的 Web 服務。
HTTP 型別的代理相比於 TCP 型別,不僅在服務端只需要監聽一個額外的埠vhost_http_port
-
修改 frps.ini 檔案,設定監聽 HTTP 請求埠為 8080:
[common] bind_port = 7000 vhost_http_port = 8080
-
修改 frpc.ini 檔案,假設 frps 所在的伺服器的 IP 為 x.x.x.x,
local_port
為本地機器上 Web 服務監聽的埠, 繫結自定義域名為custom_domains
。[common] server_addr = x.x.x.x server_port = 7000 [web] type = http local_port = 80 custom_domains = www.yourdomain.com [web2] type = http local_port = 8080 custom_domains = www.yourdomain2.com
-
分別啟動 frps 和 frpc。
-
將
www.yourdomain.com
和www.yourdomain2.com
的域名 A 記錄解析到 IPx.x.x.x
,如果伺服器已經有對應的域名,也可以將 CNAME 記錄解析到伺服器原先的域名。或者可以通過修改 HTTP 請求的 Host 欄位來實現同樣的效果。 -
通過瀏覽器訪問
http://www.yourdomain.com:8080
即可訪問到處於內網機器上 80 埠的服務,訪問http://www.yourdomain2.com:8080
則訪問到內網機器上 8080 埠的服務。
對外提供簡單的檔案訪問服務
這個示例通過配置static_file
客戶端外掛來將本地檔案暴露在公網上供其他人訪問。
通過static_file
外掛可以對外提供一個簡單的基於 HTTP 的檔案訪問服務。
-
frps.ini 內容如下:
[common] bind_port = 7000
-
frpc.ini 內容如下:
[common] server_addr = x.x.x.x server_port = 7000 [test_static_file] type = tcp remote_port = 6000 plugin = static_file # 要對外暴露的檔案目錄 plugin_local_path = /tmp/file # 使用者訪問 URL 中會被去除的字首,保留的內容即為要訪問的檔案路徑 plugin_strip_prefix = static plugin_http_user = abc plugin_http_passwd = abc
-
分別啟動 frps 和 frpc。
-
通過瀏覽器訪問
http://x.x.x.x:6000/static/
來檢視位於/tmp/file
目錄下的檔案,會要求輸入已設定好的使用者名稱和密碼。
為本地 HTTP 服務啟用 HTTPS
通過https2http
外掛可以讓本地 HTTP 服務轉換成 HTTPS 服務對外提供。
-
frps.ini 內容如下:
[common] bind_port = 7000
-
frpc.ini 內容如下:
[common] server_addr = x.x.x.x server_port = 7000 [test_htts2http] type = https custom_domains = test.yourdomain.com plugin = https2http plugin_local_addr = 127.0.0.1:80 # HTTPS 證書相關的配置 plugin_crt_path = ./server.crt plugin_key_path = ./server.key plugin_host_header_rewrite = 127.0.0.1 plugin_header_X-From-Where = frp
-
分別啟動 frps 和 frpc。
-
通過瀏覽器訪問
https://test.yourdomain.com
。
對於某些服務來說如果直接暴露於公網上將會存在安全隱患。
使用stcp(secret tcp)
型別的代理可以避免讓任何人都能訪問到要穿透的服務,但是訪問者也需要執行另外一個 frpc 客戶端。
-
frps.ini 內容如下:
[common] bind_port = 7000
-
在需要暴露到內網的機器上部署 frpc,且配置如下:
[common] server_addr = x.x.x.x server_port = 7000 [secret_ssh] type = stcp # 只有 sk 一致的使用者才能訪問到此服務 sk = abcdefg local_ip = 127.0.0.1 local_port = 22
-
在想要訪問內網服務的機器上也部署 frpc,且配置如下:
[common] server_addr = x.x.x.x server_port = 7000 [secret_ssh_visitor] type = stcp # stcp 的訪問者 role = visitor # 要訪問的 stcp 代理的名字 server_name = secret_ssh sk = abcdefg # 繫結本地埠用於訪問 SSH 服務 bind_addr = 127.0.0.1 bind_port = 6000
-
通過 SSH 訪問內網機器,假設使用者名稱為 test:
ssh -oPort=6000 [email protected]