大體思路
使用 Docker 容器,在云服務(wù)器上部署 Frps 容器來中轉(zhuǎn)流量,在被控制的 Windows 上部署 Frpc 容器來暴露內(nèi)網(wǎng)的服務(wù),在主控制端的 Windows 上直接運(yùn)行 Frpc,來連接要訪問的服務(wù)到本地。
| 主控制端 | 中轉(zhuǎn)服務(wù)器 | 被控制端 | |
|---|---|---|---|
| Frp 類型 | Frpc | Frps | Frpc |
| SSH 端口 | 6000 | 22 | |
| 遠(yuǎn)程桌面端口 | 3390 | 3389 | |
| 轉(zhuǎn)發(fā) IP | 127.0.0.1(本地 IP) | 192.168.1.7(容器外部宿主,局域網(wǎng) IP) |
用到的東西
- 反向代理
反向代理在電腦網(wǎng)絡(luò)中是代理服務(wù)器的一種。服務(wù)器根據(jù)客戶端的請(qǐng)求,從其關(guān)系的一組或多組后端服務(wù)器(如Web服務(wù)器)上獲取資源,然后再將這些資源返回給客戶端,客戶端只會(huì)得知反向代理的IP地址,而不知道在代理服務(wù)器后面的服務(wù)器集群的存在。
-
Frp:
frp 采用 C/S 模式,將服務(wù)端部署在具有公網(wǎng) IP 的機(jī)器上,客戶端部署在內(nèi)網(wǎng)或防火墻內(nèi)的機(jī)器上,通過訪問暴露在服務(wù)器上的端口,反向代理到處于內(nèi)網(wǎng)的服務(wù)。 在此基礎(chǔ)上,frp 支持 TCP, UDP, HTTP, HTTPS 等多種協(xié)議,提供了加密、壓縮,身份認(rèn)證,代理限速,負(fù)載均衡等眾多能力。
https://cdn.tsanfer.com/image/2022119165912.png
Frp 配置文件
主要是參考官方教程,根據(jù)需要增刪內(nèi)容
先是去官方的 Github 倉庫下載相應(yīng)版本的 Frp 軟件,然后解壓
服務(wù)器端配置文件
記得在云服務(wù)器后臺(tái),放行相應(yīng)的端口
# frps.ini
# 固定段落,用于配置通用參數(shù)
[common]
# 服務(wù)器監(jiān)聽端口
bind_port = 7000
bind_udp_port = 7000
token = 123456
# 服務(wù)器 dashboard
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
# 每個(gè)客戶端的連接數(shù)量上限
max_pool_count = 5
# kcp 綁定的是 udp 端口,可以和 bind_port 一樣(kcp 可能會(huì)連接不上)
# kcp_bind_port = 7000
客戶端(被控制端)配置文件
# frpc.ini(被控制端)
[common]
server_addr = x.x.x.x
server_port = 7000
token = 123456
# 客戶端指定,預(yù)創(chuàng)建的連接數(shù)量
pool_count = 1
# server_port 指定為 frps 的 kcp_bind_port
# server_port = 7000
# 使用kcp協(xié)議(kcp 可能會(huì)連接不上)
# protocol = kcp
use_encryption = true
use_compression = true
# 代理名稱(必須唯一)
[secure_ssh]
# 協(xié)議類型
# stcp 或 sudp 協(xié)議可以不在服務(wù)器暴露端口,
# 所以可以省略 remote_port 選項(xiàng)
type = stcp
# 安全角色(用于stcp、sudp)(只能填 server 或 visitor)
role = server
# 安全角色密鑰
sk = abcdefg
# 指定遠(yuǎn)程登陸地址為,被控制主機(jī)的局域網(wǎng) IP 地址
#(如果 frpc 沒有部署在 docker 上則可使用 127.0.0.1)
local_ip = 192.168.1.7
local_port = 22
# 遠(yuǎn)程桌面 tcp 端口
[remote_tcp]
type = stcp
role = server
sk = abcdefg
local_ip = 192.168.1.7
local_port = 3389
# 遠(yuǎn)程桌面 udp 端口
[remote_udp]
type = sudp
role = server
sk = abcdefg
local_ip = 192.168.1.7
local_port = 3389
客戶端(主控制端)配置文件
# frpc.ini(主控制的機(jī)器)
[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 連接可能會(huì)卡頓,估計(jì)是容易被運(yùn)營(yíng)商 QoS
# [remote_udp_visitor]
# type = sudp
# server_name = remote_udp
# sk = abcdefg
# role = visitor
# bind_port = 3390
其他配置和部署連接
在配置時(shí)可以用 docker logs frps 或 docker logs frpc 來查看調(diào)試信息

被控制端本地 SSH 設(shè)置
先安裝 OpenSSH,最新的 PowerShell 里就內(nèi)置了 OpenSSH,可以直接去 Windows 商店里下載
-
將 SSH 默認(rèn) shell 改為 powershell.exe
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force -
我沒有給電腦設(shè)置登錄密碼,所以要開啟免密登陸
把
C:\ProgramData\ssh\sshd_config中的PermitEmptyPasswords選項(xiàng),取消注釋并設(shè)置為PermitEmptyPasswords yes 最后再重啟 sshd 服務(wù)
Restart-Service sshd
配置 Windows 遠(yuǎn)程桌面
在被控制的電腦上開啟遠(yuǎn)程桌面,然后在主控制端連接
部署 Frp
在服務(wù)器端部署 frps 容器,服務(wù)器的配置文件我放在了 ~/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
在客戶端(主控制端)運(yùn)行 frpc,主控制端的配置文件我放在了 C:\Stand_alone\frp\frpc.ini 。
C:\Stand_alone\frp\frpc.exe -c C:\Stand_alone\frp\frpc.ini
最后就可以直接訪問 SSH(localhost:6000) 和遠(yuǎn)程桌面(localhost:3389)了


可替代方案:Sakura Frp
如果嫌麻煩,以及不太強(qiáng)調(diào)安全的話,可以使用 Sakura Frp
原理和普通的 Frp 一樣,不過配置起來更方便。你可以在被控制端直接下載一個(gè) Sakura Frp 官方的啟動(dòng)器,或者用 Frpc 或 Docker 來連接到 Sakura Frp 的服務(wù)器。
配置的步驟比較簡(jiǎn)單,直接看官方的教程就行了。
我是用的 Docker 方式部署,這里我列一下我自己的配置:
| 節(jié)點(diǎn) | 成都電信 |
|---|---|
| 隧道類型 | TCP |
| 端口 | 自動(dòng)生成 |
| 本地 IP | 192.168.1.7 |
| 訪問密碼 | xxxxxx |
| 加密傳輸 | 禁用 |
| 壓縮數(shù)據(jù) | 啟用 |

被控制端 Docker 的配置
docker run -d --restart=always --name=frpc_sakura natfrp/frpc -f abcdefghijklmnop:2680675,2804403 --remote_control yyyyyy
-
abcdefghijklmnop:Sakura Frp 賬號(hào)的總訪問密鑰 -
2680675:遠(yuǎn)程桌面的隧道 ID -
2804403:SSH 的隧道 ID -
yyyyyy:設(shè)置在 Sakura Frp 官網(wǎng)網(wǎng)頁上遠(yuǎn)程管理隧道的密碼(不是訪問密碼)
如果被控制端的 Docker 運(yùn)行正常的話,官網(wǎng)上的隧道顏色,會(huì)由灰色變成綠色。之后就可以在官網(wǎng)上對(duì)相應(yīng)的隧道進(jìn)行授權(quán),一般就授權(quán)本地的 IP 地址。完成過后就可以連接 Sakura Frp 官網(wǎng)的代理服務(wù)器的域名和相應(yīng)端口,來進(jìn)行遠(yuǎn)程控制了。如果自己有已備案的域名的話,可以用 DNS 的 CNAME 解析,把自己的域名映射到 Sakura Frp 的代理服務(wù)器,方便隧道節(jié)點(diǎn)的更換。
本文由 Tsanfer's Blog 發(fā)布!
