最近看到很多关于 window 远程方案登录的讨论,所以在此也和大家分享一下之前自己的方案,以供相同条件约束下的朋友参考,也借此机会看看大家是怎么处理的。(叠甲:当前方案是目前的资源和约束下的选择)
在公司访问家里的 Windows 开发机,用来浏览器查阅资料、微信、Typora 笔记、Termius 等。
目前的现状是:
核心诉求是
| 方案 | 访问方式 | 客户端依赖 | 延迟 | 安全性 | 结论 |
|---|---|---|---|---|---|
| 日本服务器 + Guacamole | Web | 无 | 高 | 高 | ⚠️ 可用,但体验一般 |
| FRP + 家庭 Guacamole | Web | 无 | 中 | 高 | ⚠️ 可用,但体验一般 |
| FRP + SSH 隧道 + RDP | RDP | 无 | 低 | 高 | ✅ 最优解 |
| FRP + RDP + multiOTP | RDP | 无 | 低 | 很高 | ⭐ 可叠加 |
| 公益 FRP 内置 TOTP | RDP | 无 | 低 | 高 | ⚠️ 依赖定制 FRP |
公司电脑(自带 SSH 客户端)
│
│ ssh -i key -N -L 13389:WIN:3389
▼
公益 FRP ( TCP 高位端口)
│
▼
PVE · Debian 跳板机
│ · 仅 SSH key
│ · 仅允许访问 Windows:3389
▼
家庭 Windows ( RDP )
❌ Windows 不暴露公网
❌ Debian 不能随意访问内网
❌ 禁止密码登录
❌ 不使用 22 / 3389 等常见端口
✅ Windows 启用 NLA ,使用非管理员账户
✅ 可选叠加 Windows 端 MFA ( multiOTP )
✅ 所有流量必须:FRP → SSH → 指定 RDP
✅ SSH 权限最小化(只做端口转发),通过防火墙锁死出口,只允许访问 Windows 的 3389 ,防止跳板机沦陷后内网被横向渗透。
apt update && apt upgrade -y
apt install -y openssh-server ufw fail2ban curl
为了安全,我们将"管理权限"和"隧道权限"分开。
tunnel:只允许端口转发debian:运维备用账号# tunnel 用户:仅用于建立隧道,无 Shell 权限
adduser tunnel
usermod -aG sudo tunnel
# debian-cc 用户:管理员,用于维护系统
adduser debian
usermod -aG sudo debian
在公司电脑生成密钥对,将公钥上传至 Debian 的 /home/tunnel/.ssh/authorized_keys
ssh-keygen -t ed25519 -f id_frp_ssh
authorized_keys 中强制限制能力:我们需要配置 SSH ,使得公司电脑连接时,只能做端口转发,不能执行命令,且只能转发到家里的 Windows IP 。
restrict,port-forwarding,permitopen="192.168.31.120:3389" ssh-ed25519 AAAA...
这个 key:
编辑 /etc/ssh/sshd_config,修改 SSH 端口为高位端口(防扫描),并禁用密码登录。
Port 53822 # 高位端口
PermitRootLogin no # 禁止 Root
PasswordAuthentication no # 禁止密码
ChallengeResponseAuthentication no
PubkeyAuthentication yes # 只认 Key
AllowUsers tunnel debian # 白名单用户
# 针对管理员:允许 Shell ,禁止转发
Match User debian
PermitTTY yes
AllowTcpForwarding no
# 针对隧道用户:禁止 Shell ,限制转发目标
Match User tunnel
AllowTcpForwarding yes
PermitOpen 192.168.31.120:3389
X11Forwarding no
AllowAgentForwarding no
PermitTTY no
配置完成后重启 SSH 服务:systemctl restart ssh
验证原则只有一条:
跳板机只能访问 Windows ,不能访问任何其他内网。
# 1. 默认策略:拒绝入站,默认允许出站(稍后限制)
ufw default deny incoming
ufw default allow outgoing
# 2. 允许 FRP 流量进出( SSH 端口)
ufw allow 53822/tcp
# 3. 精细化出站规则 (Output Chain)
# 允许 Debian 访问 Windows 的 RDP
ufw allow out to 192.168.31.120 port 3389 proto tcp
# 允许访问网关 (DNS/路由需要)
ufw allow out to 192.168.31.1
# 拒绝访问内网其他所有 IP (防止横向移动)
ufw deny out to 192.168.31.0/24
# 启用防火墙
ufw enable
配置 /etc/fail2ban/jail.local 监控 53822 端口,错误尝试 2 次即封禁 24 小时。因为公网暴露 SSH 必然会被扫描,这是最后一道防线。
[sshd]
enabled = true
port = 53822
maxretry = 2
bantime = 24h
虽然 RDP 不暴露公网,但还是建议对目标 Windows 进行加固:
使用低延迟的国内公益 FRP (如樱花 FRP / Nyat 等),将 Debian 的 SSH 端口暴露出去。
# 切换到 tunnel 用户安装,避免使用 root
su - tunnel
wget https://github.com/fatedier/frp/releases/download/v0.56.0/frp_0.56.0_linux_amd64.tar.gz
# ...解压并移动到 /usr/local/bin/frpc
/etc/frpc.toml)我们**不直接穿透 RDP (3389)**,而是穿透 **SSH (53822)**。
serverAddr = "rdp.example.com" # FRP 服务端地址
serverPort = 7000
user = "your_user_id"
auth.token = "your_token"
[[proxies]]
name = "tunnel_ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 53822
remotePort = 53389
创建 /etc/systemd/system/frpc.service 并启动,确保断电重启后自动上线。
在公司电脑上,不需要安装任何软件,只需要一个 SSH 私钥文件(id_frp_ssh)。
打开 PowerShell 或 CMD:
ssh -i id_frp_ssh -N \
-L 13389:192.168.31.120:3389 \
-p 53389 [email protected]
-N: 不执行远程命令(仅转发)。-L 13389:IP:3389: 将本地的 13389 端口映射到家中 Windows 的 3389 。打开 Windows 自带的"远程桌面连接"
mstsc → 127.0.0.1:13389
.exe 或 VPN 客户端。