





















RockyLinux SSH 跳板转发 3389(Windows 远程桌面)完整方案
两种常用模式:本地端口转发(你本地访问 Linux 跳板端口连 Windows)、远程端口转发(Windows 主动出网,跳板暴露端口),日常内网穿透用第一种。
前置条件
RockyLinux 跳板机:公网 IP / 能被你本地 ssh 连接,开放 22 端口
Windows 机器:和 RockyLinux 内网互通,开启 3389 远程桌面,防火墙放行 3389
本地电脑:Windows/macOS/Linux,自带 ssh 客户端
方案 1:本地端口转发(最常用,推荐)
逻辑:本地开端口 → SSH 隧道连 RockyLinux → 跳板流量转发到内网 Windows:3389
命令(本地终端执行)
# 格式:ssh -L 本地端口:目标WindowsIP:3389 跳板用户名@RockyLinuxIP
# 示例:本地用3390端口访问,跳板ip 1.2.3.4,内网Windows 192.168.1.100
ssh -L 3390:192.168.1.100:3389 root@1.2.3.4
参数说明:
-L 本地端口:WindowsIP:3389:本地监听端口,流量通过跳板转发到目标 3389
3390 可自定义(避开占用端口,不要直接用 3389 防止冲突)
使用远程桌面
隧道保持终端不关闭,打开本地 mstsc 远程桌面:localhost:3390
即可连接内网 Windows 3389。
后台常驻隧道(断开终端不失效)
加 -Nf 参数后台运行:
ssh -NfL 3390:192.168.1.100:3389 root@1.2.3.4
-N 不执行远程命令,只做转发
-f 后台运行
关闭后台隧道
查询 ssh 进程并 kill:
ps aux | grep ssh
kill -9 进程PID
方案 2:远程转发(Windows 在内网,跳板公网暴露端口给别人访问)
逻辑:跳板机开放公网端口 → 流量转发到内网 Windows 3389
# -R 跳板端口:WindowsIP:3389
ssh -NfR 3391:192.168.1.100:3389 root@1.2.3.4
其他人访问 RockyLinux公网IP:3391 即可直连 Windows 桌面。
关键防火墙放行(RockyLinux 必须操作)
RockyLinux 默认 firewalld 拦截自定义端口,放行转发端口(示例 3390/3391)
# 放行端口
firewall-cmd --add-port=3390/tcp --permanent
firewall-cmd --add-port=3391/tcp --permanent
# 重载生效
firewall-cmd --reload
云服务器额外操作:服务商安全组放行对应端口(22、3390、3391)
优化:SSH 配置免密登录(不用输密码)
本地生成密钥传到跳板,避免每次输密码:
# 本地生成密钥(一路回车)
ssh-keygen
# 推送公钥到RockyLinux跳板
ssh-copy-id root@1.2.3.4
常见故障排查
远程桌面连不上
确认 Windows 防火墙放行 3389,开启远程桌面功能
RockyLinux 防火墙 / 云安全组放行转发端口
跳板机能 ping 通 Windows 内网 IP
隧道报错端口占用
更换本地端口(3390→3400 等)
后台隧道断开
增加保活参数防止掉线:
ssh -NfL 3390:192.168.1.100:3389 root@1.2.3.4 -o ServerAliveInterval=30 -o ServerAliveCountMax=3
补充:开机自启隧道(本地 Linux/macOS)
写入 systemd 服务或 crontab;Windows 本地可用 Xshell、FinalShell 图形化持久隧道。
场景 1:跳板机 SSH 服务不是默认 22 端口(连接 RockyLinux 要指定 ssh 端口)
用 -p 参数指定跳板 SSH 端口,放在命令任意位置,推荐放前面
标准语法
ssh -p 跳板SSH端口 -L 本地端口:Windows内网IP:3389 跳板用户@跳板公网IP
示例
跳板 RockyLinux ssh 端口改成 2222,跳板 IP 110.10.10.10,内网 Windows 192.168.5.20:3389,本地映射端口 3390
ssh -p 2222 -L 3390:192.168.5.20:3389 root@110.10.10.10
后台常驻保活完整版:
ssh -Nf -p 2222 -L 3390:192.168.5.20:3389 root@110.10.10.10 -o ServerAliveInterval=30 -o ServerAliveCountMax=3
场景 2:只是修改本地映射端口(跳板 SSH 还是 22)
只改 -L 第一个数字即可,无 -p
# 本地用5000端口访问RDP
ssh -L 5000:192.168.5.20:3389 root@110.10.10.10
场景 3:远程转发 - R(别人访问跳板端口连 Windows),跳板 SSH 非 22
ssh -Nf -p 2222 -R 6000:192.168.5.20:3389 root@110.10.10.10
他人访问 跳板IP:6000 连接 Windows 桌面,RockyLinux 防火墙需要放行 6000/tcp
二、SSH config 免输端口(永久配置推荐)
本地 ~/.ssh/config 写入配置,以后直接 ssh jump 不用打 -p
Host jump
HostName 110.10.10.10
User root
Port 2222
ServerAliveInterval 30
之后转发命令简化:
ssh -NfL 3390:192.168.5.20:3389 jump
三、配套防火墙操作(跳板改了 SSH 端口必做)
RockyLinux 放行自定义 SSH 端口(2222 举例)
firewall-cmd --add-port=2222/tcp --permanent
firewall-cmd --reload
云服务器安全组同步放行:跳板 SSH 端口 + 转发端口(3390/6000 等)
四、使用 RDP 连接
隧道建立后,mstsc 输入:localhost:3390
创建用户的时候可以使用不能登录Linux系统的用户
用 /usr/sbin/nologin 用户做 SSH 端口转发跳板,但必须加 -N 参数,否则一连接就断开;
这种用户不能交互式登录拿 shell,但单纯隧道转发完全不受影响,非常适合做专用跳板账号。
一、核心原理
/usr/sbin/nologin 的作用:用户认证成功后,拒绝分配交互式 shell,直接提示账号不可用并断开连接。
SSH 端口转发分两步:
第一步:身份认证(成功即可)
第二步:申请 shell / 执行命令 / 建立隧道
加 -N 参数 = 只做认证、不请求远程 shell,sshd 不会去调用用户 shell,nologin 就不会触发断开,隧道正常维持。
正确 Windows PowerShell 隧道命令(必须带 -N)
# -N 关键:不请求远程shell,兼容nologin用户
ssh -N -L 13389:目标WindowsIP:3389 tunneluser@RockyLinuxIP
不加 -N:连接成功后系统尝试启动 shell → nologin 拦截 → 连接瞬间关闭,隧道失效。
二、RockyLinux 创建专用 nologin 跳板用户完整步骤
1. 创建无登录 shell 用户
# 创建跳板用户,shell设为nologin,创建家目录(密钥存放用)
useradd -m tunneluser -s /usr/sbin/nologin
# 设置密码(推荐后续改用密钥登录,关闭密码认证)
passwd tunneluser
2. sshd 加固配置(只允许转发、禁止交互操作)
编辑 /etc/ssh/sshd_config,末尾添加:
# 匹配跳板用户单独限制
Match User tunneluser
AllowTcpForwarding local # 仅允许-L本地转发,禁止-R远程穿透
PermitTTY no # 禁止终端交互登录
X11Forwarding no
AllowAgentForwarding no
PermitTunnel no
ForceCommand echo "仅允许端口转发,禁止执行命令"
说明:
AllowTcpForwarding local:只开放你需要的 -L 本地转发,杜绝反向隧道,更安全
PermitTTY no:彻底禁止拿到终端,就算别人漏了 -N 也无法交互式操作跳板机
重载 sshd 生效:
systemctl restart sshd
三、两种客户端使用方式
1. Windows OpenSSH(PowerShell,推荐)
# 后台静默隧道(加-f后台运行,不用一直开窗口)
ssh -N -f -L 13389:192.168.5.10:3389 tunneluser@10.0.0.20
之后 mstsc 连接 127.0.0.1:13389 即可访问第二层 Windows。
2. Xshell / Putty 图形工具
Putty:Connection → SSH 勾选 Don't start a shell or command at all(等价 -N)
Xshell:隧道配置里关闭「远程命令执行」,仅启用本地端口转发
四、常见踩坑点
不加 -N,隧道秒断
报错类似:Access denied: This account is currently not available,就是 nologin 拦截 shell 导致。
全局 AllowTcpForwarding no
即使是 nologin 用户也无法转发,必须用 Match User tunneluser 单独放行 local。
用户没家目录
用密钥登录时 ssh-copy-id 会失败,创建用户必须加 -m。
五、安全优势(为什么推荐 nologin 跳板账号)
账号无法 SSH 登录 RockyLinux 拿命令行,攻击者拿到密码也不能操作跳板服务器;
配合密钥登录 + 禁止密码认证,最小权限,只保留端口转发能力;
仅开放 -L 本地转发,无法利用跳板反向穿透内网其他机器。
补充:极简替代方案(不用 nologin)
如果不想配置限制,也可以用 /bin/false 做 shell,逻辑完全一致,同样需要 -N 参数:
usermod -s /bin/false tunneluser
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。