大體思路
使用 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 發布!
