使用 Frp 和 Docker 通過遠端桌面和 SSH 來遠端控制 Windows(反向代理)

田三番發表於2022-02-08

最新部落格文章連結


大體思路

使用 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 等多種協議,提供了加密、壓縮,身份認證,代理限速,負載均衡等眾多能力。

    https://i.iter01.com/images/a5163260a4d9e78b090ec5c09883efa46614432f5ee3853fd514ccd0823929f8.png

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 frpsdocker logs frpc 來檢視除錯資訊

https://i.iter01.com/images/4650d06a823bbca0e6e7e838d957b719f64063244da8a11e876f37ff2690e1b0.png

被控制端本地 SSH 設定

微軟官方 | 通過 SSH 進行 PowerShell 遠端處理

  1. 先安裝 OpenSSH,最新的 PowerShell 裡就內建了 OpenSSH,可以直接去 Windows 商店裡下載

  2. 將 SSH 預設 shell 改為 powershell.exe

    New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

  3. 我沒有給電腦設定登入密碼,所以要開啟免密登陸

    C:\ProgramData\ssh\sshd_config 中的 PermitEmptyPasswords 選項,取消註釋並設定為 PermitEmptyPasswords yes

  4. 最後再重啟 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)了

https://i.iter01.com/images/2cb3e293bbe1f661fe5cfe06b77a72118c0570a5087690c6c50d29724df19429.png

https://i.iter01.com/images/36fbe96fc9d39a1c3e7218c81da87dedbee2c8454a8dbcd7110956225ee06d1f.png

可替代方案: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 :遠端桌面的隧道 ID
  • 2804403 :SSH 的隧道 ID
  • yyyyyy :設定在 Sakura Frp 官網網頁上遠端管理隧道的密碼(不是訪問密碼)

如果被控制端的 Docker 執行正常的話,官網上的隧道顏色,會由灰色變成綠色。之後就可以在官網上對相應的隧道進行授權,一般就授權本地的 IP 地址。完成過後就可以連線 Sakura Frp 官網的代理伺服器的域名和相應埠,來進行遠端控制了。如果自己有已備案的域名的話,可以用 DNS 的 CNAME 解析,把自己的域名對映到 Sakura Frp 的代理伺服器,方便隧道節點的更換。


本文由 Tsanfer's Blog 釋出!

相關文章