大體思路
使用 Docker 容器,在雲伺服器上部署 Frps 容器來中轉流量,在被控制的 Windows 上部署 Frpc 容器來暴露內網的服務,在主控制端的 Windows 上直接執行 Frpc,來連線要訪問的服務到本地。
主控制端 | 中轉伺服器 | 被控制端 | |
---|---|---|---|
Frp 型別 | Frpc | Frps | Frpc |
SSH 埠 | 6000 | 22 | |
遠端桌面埠 | 3390 | 3389 | |
轉發 IP | 127.0.0.1(本地 IP) | 192.168.1.7(容器外部宿主,區域網 IP) |
用到的東西
- 反向代理
反向代理在電腦網路中是代理伺服器的一種。伺服器根據客戶端的請求,從其關係的一組或多組後端伺服器(如Web伺服器)上獲取資源,然後再將這些資源返回給客戶端,客戶端只會得知反向代理的IP地址,而不知道在代理伺服器後面的伺服器叢集的存在。
- Frp:
frp 採用 C/S 模式,將服務端部署在具有公網 IP 的機器上,客戶端部署在內網或防火牆內的機器上,通過訪問暴露在伺服器上的埠,反向代理到處於內網的服務。 在此基礎上,frp 支援 TCP, UDP, HTTP, HTTPS 等多種協議,提供了加密、壓縮,身份認證,代理限速,負載均衡等眾多能力。
Frp 配置檔案
主要是參考官方教程,根據需要增刪內容
先是去官方的 Github 倉庫下載相應版本的 Frp 軟體,然後解壓
伺服器端配置檔案
記得在雲伺服器後臺,放行相應的埠
# frps.ini
# 固定段落,用於配置通用引數
[common]
# 伺服器監聽埠
bind_port = 7000
bind_udp_port = 7000
token = 123456
# 伺服器 dashboard
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
# 每個客戶端的連線數量上限
max_pool_count = 5
# kcp 繫結的是 udp 埠,可以和 bind_port 一樣(kcp 可能會連線不上)
# kcp_bind_port = 7000
客戶端(被控制端)配置檔案
# frpc.ini(被控制端)
[common]
server_addr = x.x.x.x
server_port = 7000
token = 123456
# 客戶端指定,預建立的連線數量
pool_count = 1
# server_port 指定為 frps 的 kcp_bind_port
# server_port = 7000
# 使用kcp協議(kcp 可能會連線不上)
# protocol = kcp
use_encryption = true
use_compression = true
# 代理名稱(必須唯一)
[secure_ssh]
# 協議型別
# stcp 或 sudp 協議可以不在伺服器暴露埠,
# 所以可以省略 remote_port 選項
type = stcp
# 安全形色(用於stcp、sudp)(只能填 server 或 visitor)
role = server
# 安全形色金鑰
sk = abcdefg
# 指定遠端登陸地址為,被控制主機的區域網 IP 地址
#(如果 frpc 沒有部署在 docker 上則可使用 127.0.0.1)
local_ip = 192.168.1.7
local_port = 22
# 遠端桌面 tcp 埠
[remote_tcp]
type = stcp
role = server
sk = abcdefg
local_ip = 192.168.1.7
local_port = 3389
# 遠端桌面 udp 埠
[remote_udp]
type = sudp
role = server
sk = abcdefg
local_ip = 192.168.1.7
local_port = 3389
客戶端(主控制端)配置檔案
# frpc.ini(主控制的機器)
[common]
server_addr = x.x.x.x
server_port = 7000
token = 123456
# 本地繫結地址
bind_addr = 127.0.0.1
use_encryption = true
use_compression = true
[secure_ssh_visitor]
type = stcp
# 要訪問的代理名稱
server_name = secure_ssh
sk = abcdefg
role = visitor
# 本地繫結埠
bind_port = 6000
[remote_tcp_visitor]
type = stcp
server_name = remote_tcp
sk = abcdefg
role = visitor
bind_port = 3390
# UDP 連線可能會卡頓,估計是容易被運營商 QoS
# [remote_udp_visitor]
# type = sudp
# server_name = remote_udp
# sk = abcdefg
# role = visitor
# bind_port = 3390
其他配置和部署連線
在配置時可以用 docker logs frps
或 docker logs frpc
來檢視除錯資訊
被控制端本地 SSH 設定
-
先安裝 OpenSSH,最新的 PowerShell 裡就內建了 OpenSSH,可以直接去 Windows 商店裡下載
-
將 SSH 預設 shell 改為 powershell.exe
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
-
我沒有給電腦設定登入密碼,所以要開啟免密登陸
把
C:\ProgramData\ssh\sshd_config
中的PermitEmptyPasswords
選項,取消註釋並設定為PermitEmptyPasswords yes
-
最後再重啟 sshd 服務
Restart-Service sshd
配置 Windows 遠端桌面
在被控制的電腦上開啟遠端桌面,然後在主控制端連線
部署 Frp
在伺服器端部署 frps 容器,伺服器的配置檔案我放在了 ~/frp/frps.ini
。
docker run --network host --restart=always -d -v ~/frp/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps
在客戶端(被控制端)部署 frpc 容器,被控制端的配置檔案我放在了 C:\Stand_alone\frp\frpc.ini
。
docker run --network host --restart=always -d -v C:\Stand_alone\frp\frpc.ini:/etc/frp/frpc.ini --name frpc snowdreamtech/frpc
連線 Frp
在客戶端(主控制端)執行 frpc,主控制端的配置檔案我放在了 C:\Stand_alone\frp\frpc.ini
。
C:\Stand_alone\frp\frpc.exe -c C:\Stand_alone\frp\frpc.ini
最後就可以直接訪問 SSH(localhost:6000
) 和遠端桌面(localhost:3389
)了
可替代方案:Sakura Frp
如果嫌麻煩,以及不太強調安全的話,可以使用 Sakura Frp
原理和普通的 Frp 一樣,不過配置起來更方便。你可以在被控制端直接下載一個 Sakura Frp 官方的啟動器,或者用 Frpc 或 Docker 來連線到 Sakura Frp 的伺服器。
配置的步驟比較簡單,直接看官方的教程就行了。
我是用的 Docker 方式部署,這裡我列一下我自己的配置:
節點 | 成都電信 |
---|---|
隧道型別 | TCP |
埠 | 自動生成 |
本地 IP | 192.168.1.7 |
訪問密碼 | xxxxxx |
加密傳輸 | 禁用 |
壓縮資料 | 啟用 |
被控制端 Docker 的配置
docker run -d --restart=always --name=frpc_sakura natfrp/frpc -f abcdefghijklmnop:2680675,2804403 --remote_control yyyyyy
abcdefghijklmnop
:Sakura Frp 賬號的總訪問金鑰2680675
:遠端桌面的隧道 ID2804403
:SSH 的隧道 IDyyyyyy
:設定在 Sakura Frp 官網網頁上遠端管理隧道的密碼(不是訪問密碼)
如果被控制端的 Docker 執行正常的話,官網上的隧道顏色,會由灰色變成綠色。之後就可以在官網上對相應的隧道進行授權,一般就授權本地的 IP 地址。完成過後就可以連線 Sakura Frp 官網的代理伺服器的域名和相應埠,來進行遠端控制了。如果自己有已備案的域名的話,可以用 DNS 的 CNAME 解析,把自己的域名對映到 Sakura Frp 的代理伺服器,方便隧道節點的更換。
本文由 Tsanfer's Blog 釋出!