问题本身不复杂,复杂的是现实约束。
背景诉求
作为一名高级牛马,我经常需要在公司访问家里的 Windows 开发机,用来浏览器查阅资料、微信、Typora 笔记、Termius 等。
目前的现状是:
- 公司环境: 电脑安装了监控软件,限制安装额外微信、代理/组网软件(VPN / Tailscale / ZeroTier 全部不可),网络无公网 IPv4/IPv6。
- 家庭环境: PVE 虚拟化的 Windows,只有 IPv6 公网。
核心诉求是
- 在公司 通过 RDP 或 Web 访问家庭 Windows
- 日常操作流畅(打字、拖窗口不卡)
- 安全性优先,最好支持 MFA
- 尽量不“触发公司风控规则”
资源和约束
资源
- 日本大板服务器 ×2
- IPv4 + IPv6
- 公司 ↔ 日本 ≈ 200ms
- 家庭 ↔ 日本 ≈ 200ms
- 樱花 FRP / 其他公益 FRP
- 延迟 ≈ 40ms
约束
- ❌ 公司电脑:不能装任何额外客户端(目前连 Tailscale 都不敢继续用)
- ❌ 家庭 Windows:只有公网 IPv6
- ✅ 优先 RDP,其次 Web
- ✅ 日常使用要求流畅
- ✅ 安全性要高,最好有 MFA
- ✅ 可选资源只有:日本服务器 / 公益 FRP
方案对比
| 方案 | 访问方式 | 客户端依赖 | 延迟 | 安全性 | 结论 |
|---|---|---|---|---|---|
| 日本服务器 + Guacamole | Web | 无 | 高 | 高 | ⚠️ 可用,但体验一般 |
| FRP + 家庭 Guacamole | Web | 无 | 中 | 高 | ⚠️ 可用,但体验一般 |
| FRP + SSH 隧道 + RDP | RDP | 无 | 低 | 高 | ✅ 最优解 |
| FRP + RDP + multiOTP | RDP | 无 | 低 | 很高 | ⭐ 可叠加 |
| 公益 FRP 内置 TOTP | RDP | 无 | 低 | 高 | ⚠️ 依赖定制 FRP |
优先解决连接方式和安全边界,而不是功能堆叠
最终选择:公益 FRP + SSH 隧道 + RDP
整体架构
公司电脑(自带 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,防止跳板机沦陷后内网被横向渗透。
公益 FRP + SSH 隧道方案实施
基础设施搭建
跳板机系统选择
- Debian 12 minimal
- 1C / 2G / 32GB 磁盘足够
基础系统加固
apt update && apt upgrade -yapt install -y openssh-server ufw fail2ban curl用户职责划分
为了安全,我们将“管理权限”和“隧道权限”分开。
tunnel:只允许端口转发debian:运维备用账号
# tunnel 用户:仅用于建立隧道,无 Shell 权限adduser tunnelusermod -aG sudo tunnel# debian-cc 用户:管理员,用于维护系统adduser debianusermod -aG sudo debianSSH 安全加固
tunnel 用户(公司 → 跳板机)
在公司电脑生成密钥对,将公钥上传至 Debian 的 /home/tunnel/.ssh/authorized_keys
ssh-keygen -t ed25519 -f id_frp_sshauthorized_keys 中强制限制能力:我们需要配置 SSH,使得公司电脑连接时,只能做端口转发,不能执行命令,且只能转发到家里的 Windows IP。
restrict,port-forwarding,permitopen="192.168.31.120:3389" ssh-ed25519 AAAA...这个 key:
- ❌ 不能 shell
- ❌ 不能转发其他端口
- ✅ 只能指向 Windows RDP,即使黑客拿到了私钥,他也连不上内网的其他设备
SSH 服务端限制
编辑 /etc/ssh/sshd_config,修改 SSH 端口为高位端口(防扫描),并禁用密码登录。
Port 53822 # 高位端口PermitRootLogin no # 禁止 RootPasswordAuthentication no # 禁止密码ChallengeResponseAuthentication noPubkeyAuthentication yes # 只认 KeyAllowUsers 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 incomingufw default allow outgoing
# 2. 允许 FRP 流量进出(SSH端口)ufw allow 53822/tcp
# 3. 精细化出站规则 (Output Chain)# 允许 Debian 访问 Windows 的 RDPufw 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 enableFail2ban
配置 /etc/fail2ban/jail.local 监控 53822 端口,错误尝试 2 次即封禁 24 小时。因为公网暴露 SSH 必然会被扫描,这是最后一道防线。
[sshd]enabled = trueport = 53822maxretry = 2bantime = 24h关于 Windows 安全的建议
虽然 RDP 不暴露公网,但还是建议对目标 Windows 进行加固:
- 启用 NLA (网络级别身份验证)。
- 创建非管理员用户用于远程登录。
- 强密码策略。
- (进阶) 配合 MultiOTP 软件,在 Windows 登录时强制要求 MFA 动态口令,进一步提升安全性。
内网穿透配置 (FRP)
使用低延迟的国内公益 FRP(如樱花 FRP / Nyat 等),将 Debian 的 SSH 端口暴露出去。
安装 FRPC
# 切换到 tunnel 用户安装,避免使用 rootsu - tunnelwget 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 = 7000user = "your_user_id"auth.token = "your_token"
[[proxies]]name = "tunnel_ssh"type = "tcp"localIP = "127.0.0.1"localPort = 53822remotePort = 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 tunnel@frp.example.com-N: 不执行远程命令(仅转发)。-L 13389:IP:3389: 将本地的 13389 端口映射到家中 Windows 的 3389。
连接 RDP
打开 Windows 自带的“远程桌面连接”
mstsc → 127.0.0.1:13389实际体验
- 延迟: 既然走的是国内/周边节点的 FRP,物理延迟极低(约 40ms),打字跟手,拖动窗口无残影。
- 安全: 公司防火墙只看到一个普通的 TCP 连接;所有数据经过 SSH 加密;家里的 Windows 没有任何端口暴露在公网。
- 合规: 没有在公司电脑安装任何未经授权的
.exe或 VPN 客户端。
写在最后
其实这套方案有点过于设计了,对大多数人来说,数据也没那么值钱,没必要整的那么复杂。
或者说折腾本身,才是最大的收获。