结论: 服务器远程连接的搭建分三层——Linux 用 OpenSSH(sshd_config 配置 + 密钥登录),Windows 用 RDP(远程桌面,默认 3389),图形桌面场景加 VNC;多台服务器时应部署跳板机(堡垒机)作为统一入口。安全基线是:禁用 root 直接登录、禁用密码登录改用 SSH 密钥、改非默认端口、限制来源 IP、设置会话超时、开启审计日志。
引言:远程连接不只是"连得上"
装完服务器第一件事就是远程连接,多数人做到 ssh root@IP 能登录就结束了。但对生产环境来说,远程连接是整台服务器唯一的入口,也是攻击者最集中的目标。一次配置不当——比如开着密码登录的 root 账户暴露在公网——平均几小时内就会遭遇暴力破解。
更进一步,当服务器从一台变成十台,问题就变成:密钥怎么分发、谁在什么时间做了什么操作、某人离职后怎么收回权限、如何防止误操作。这些都要靠远程访问体系的设计来解决,而不是靠一条 ssh 命令。
本篇围绕"访问体系"展开:SSH 服务端配置 → 密钥与多用户 → Windows RDP → VNC → 跳板机/堡垒机 → 会话与安全策略 → 故障排查。
一、sshd_config 关键配置:SSH 服务端怎么配
SSH 服务端配置文件是 /etc/ssh/sshd_config,改完必须 systemctl reload sshd(Ubuntu 上服务名为 ssh)。
一份生产环境推荐的核心配置:
# /etc/ssh/sshd_config 关键项
Port 2222 # 改非默认端口,减少扫描噪音(可选但推荐)
#AddressFamily inet # 只监听 IPv4,若无需 IPv6
ListenAddress 0.0.0.0 # 监听地址;多网卡可只监听内网 IP
# ---- 认证 ----
PermitRootLogin no # 禁止 root 直接登录(最关键的加固项)
PasswordAuthentication no # 禁用密码登录,强制密钥
PubkeyAuthentication yes # 启用密钥认证
PermitEmptyPasswords no # 禁止空密码
MaxAuthTries 3 # 单次连接最大认证尝试次数
LoginGraceTime 30 # 登录超时 30 秒
AllowUsers opsuser deploy # 白名单:只允许这些用户(也可用 AllowGroups)
#DenyUsers guest # 黑名单
# ---- 会话 ----
ClientAliveInterval 300 # 300 秒发一次保活探测
ClientAliveCountMax 2 # 连续 2 次无响应则断开(≈10 分钟超时)
TCPKeepAlive yes
MaxSessions 5 # 单连接最大会话数
MaxStartups 10:30:60 # 并发未认证连接限制,防连接耗尽
# ---- 其他安全项 ----
X11Forwarding no # 禁用 X11 转发
AllowAgentForwarding no # 禁用 agent 转发(防跳板机被利用)
AllowTcpForwarding no # 按需开启,做端口转发时需要 yes
PermitTunnel no
StrictModes yes # 检查密钥文件权限
# ---- 日志 ----
SyslogFacility AUTH
LogLevel VERBOSE # VERBOSE 会记录密钥指纹,便于审计
# ---- 密钥算法(截至 2026 年建议)----
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
KexAlgorithms curve25519-sha256,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com改完校验与生效:
# 语法校验(改配置前必做!配错会锁死自己)
sudo sshd -t
# 无输出即通过;有错会提示具体行号
# 平滑重载(不会断开现有连接)
sudo systemctl reload sshd # RHEL 系
sudo systemctl reload ssh # Ubuntu/Debian 服务名是 ssh
# 查看 sshd 实际生效的全部配置(含默认值)
sudo sshd -T | grep -E "permitrootlogin|passwordauth|port|maxauthtries"要点:sshd -t 是关键保险——配置写错时 sshd 会拒绝启动或按旧配置运行,但 reload 后如果 sshd 起不来,你就再也连不进去了。改配置前先开着一条已登录的会话不要退出,reload 后新开窗口测试成功再关旧连接。
二、密钥登录与多用户管理
密钥认证(Public Key Authentication)的原理:客户端持有私钥,服务器存放公钥,登录时用私钥签名证明身份,无需传输密码。它从根本上免疫暴力破解。
# 第 1 步:在客户端生成密钥对(推荐 ed25519,截至 2026 年为首选算法)
ssh-keygen -t ed25519 -C "ops@company" -f ~/.ssh/id_ed25519_company
# 如需兼容老设备:ssh-keygen -t rsa -b 4096
# 第 2 步:把公钥传到服务器(推荐 ssh-copy-id,会自动设置正确权限)
ssh-copy-id -i ~/.ssh/id_ed25519_company.pub -p 2222 opsuser@server_ip
# 无 ssh-copy-id 时手工方式:
cat ~/.ssh/id_ed25519_company.pub | ssh -p 2222 opsuser@server_ip \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
# 第 3 步:测试密钥登录成功后再禁用密码登录
ssh -i ~/.ssh/id_ed25519_company -p 2222 opsuser@server_ip多用户与权限分离的做法:
# 创建不同职责的用户,用 sudo 控制权限
sudo adduser deploy # 部署账号
sudo adduser readonly # 只读/审计账号
sudo usermod -aG sudo opsuser # 运维账号给 sudo
# 为每个用户单独放公钥(各自 ~/.ssh/authorized_keys)
# 强制某用户只能执行指定命令(authorized_keys 前缀)
# /home/deploy/.ssh/authorized_keys 内容示例:
command="/usr/local/bin/deploy.sh",no-port-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAA... deploy@ci
# 免密 sudo(仅限可信账号,编辑 /etc/sudoers.d/deploy)
echo "deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp" | sudo tee /etc/sudoers.d/deploy
sudo visudo -c # 校验 sudoers 语法,务必执行客户端 ~/.ssh/config 简化连接(强烈推荐,便于管理多台服务器):
# ~/.ssh/config
Host prod-web
HostName 203.0.113.10
Port 2222
User opsuser
IdentityFile ~/.ssh/id_ed25519_company
ServerAliveInterval 60
Host prod-db
HostName 10.0.0.20
Port 2222
User opsuser
IdentityFile ~/.ssh/id_ed25519_company
ProxyJump prod-web # 通过 prod-web 跳转(跳板机用法)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
HashKnownHosts yes配置后只需 ssh prod-web 即可连接,也可以直接 ssh prod-db 自动经由跳板机跳转。
用户与密钥管理要点清单:
- 一人一密钥,不要把同一个私钥发给多人——离职时无法精确回收。
- 定期审计
~/.ssh/authorized_keys,清理离职人员公钥(这是最容易被忽视的安全债务)。 - 私钥必须设置 passphrase,并妥善保管;泄露私钥等同于泄露服务器。
- 用
AuditD或堡垒机记录操作,满足审计要求。
三、Windows RDP 配置与端口修改
RDP(Remote Desktop Protocol,远程桌面协议)默认使用 TCP 3389,Windows Server 默认启用(需先开启"允许远程连接")。
服务端开启步骤:
- 服务器管理器 → 本地服务器 → 启用"远程桌面";或在"系统属性 → 远程"中勾选。
- 防火墙放行 3389(高级安全防火墙中启用"远程桌面"入站规则组)。
- 云服务器还需在安全组放行 3389(强烈建议限制来源 IP,3389 是勒索软件的重点扫描目标)。
修改默认端口(改注册表,需重启生效):
# PowerShell 管理员身份运行
$port = 33890
# 修改注册表
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' `
-Name 'PortNumber' -Value $port -Type DWord
# 同步修改防火墙规则(旧规则端口不会自动跟随)
New-NetFirewallRule -DisplayName "RDP-$port" -Direction Inbound `
-Protocol TCP -LocalPort $port -Action Allow -Profile Any
# 重启远程桌面服务(或重启服务器)
Restart-Service TermService -Force
# 验证监听端口
netstat -ano | findstr $portRDP 安全加固要点:
- 启用网络级别身份验证(NLA):要求先认证再建立会话,能挡掉大量自动化攻击。
- 限制来源 IP(防火墙规则加
-RemoteAddress)。 - 设置账户锁定策略(账户锁定阈值 5 次),防止在线爆破。
- 强制强密码策略(
secpol.msc中设置密码长度 ≥12 位、复杂度要求)。 - 若必须公网暴露,建议先拨 VPN 或走 SSH 隧道再 RDP,不要直接暴露 3389。
- 通过 SSH 隧道安全访问 RDP(Linux 跳板机上执行):
ssh -L 13389:内网WindowsIP:3389 user@jumpserver -N -f,然后本机连接127.0.0.1:13389。
四、VNC:Linux 图形桌面的远程方案
VNC(Virtual Network Computing)用于远程访问 Linux/Windows 的图形桌面,默认端口 5900 + 显示号(:1 对应 5901)。服务器场景多数不需要图形界面,只有在跑需要 GUI 的软件(如某些自动化测试、ERP 客户端)时才用。
# 安装(Ubuntu 24.04 + Xfce 桌面示例)
sudo apt install -y xfce4 xfce4-goodies tigervnc-standalone-server tigervnc-common
# 设置 VNC 密码(保存在 ~/.vnc/passwd)
vncpasswd
# 配置启动脚本 ~/.vnc/xstartup
cat > ~/.vnc/xstartup <<'EOF'
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4
EOF
chmod +x ~/.vnc/xstartup
# 启动 VNC 服务(:1 表示显示号 1,端口 5901)
vncserver :1 -geometry 1280x800 -depth 24 -localhost yes
# 查看与关闭
vncserver -list
vncserver -kill :1systemd 托管 VNC:
# /etc/systemd/system/vncserver@.service
[Unit]
Description= TigerVNC Server for display %i
After=network.target
[Service]
Type=forking
User=opsuser
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver %i -geometry 1280x800 -depth 24 -localhost yes
ExecStop=/usr/bin/vncserver -kill %i
Restart=on-failure
[Install]
WantedBy=multi-user.target安全警告:VNC 协议本身加密强度有限,且认证密码通常只有 8 位有效字符。绝对不要把 VNC 端口直接暴露到公网。正确做法:启动时加 -localhost yes(只监听 127.0.0.1),然后通过 SSH 隧道访问:
# 客户端建立隧道:本地 5901 → 服务器 127.0.0.1:5901
ssh -L 5901:127.0.0.1:5901 -p 2222 opsuser@server_ip -N -f
# 然后 VNC 客户端连接 127.0.0.1:5901,流量全程走 SSH 加密五、跳板机与堡垒机:多台服务器的统一入口
当服务器数量超过 3~5 台,就应该引入跳板机(Jump Server)/ 堡垒机(Bastion Host)。它们的区别在于:跳板机是"只有它能从公网访问,其他服务器只在内网"的网络跳板;堡垒机在此基础上增加了身份认证、权限控制、操作审计和会话录制。
架构模型:
运维人员 ──SSH──> 堡垒机(公网,双网卡)──内网──> Web服务器 / 数据库 / 缓存
│
└─> 审计日志 / 会话录制用 OpenSSH 实现简易跳板机(无需额外软件):
# 在堡垒机上创建统一登录入口,禁止直接登录后端服务器
# 1. 后端服务器的 sshd_config 只监听内网 IP
# ListenAddress 10.0.0.20
# 2. 后端服务器防火墙只允许来自堡垒机 IP 的 22 端口
sudo ufw allow from 10.0.0.5 to any port 22 proto tcp
# 3. 客户端用 ProxyJump 一跳直达
ssh -J opsuser@bastion_ip opsuser@10.0.0.20
# 或写进 ~/.ssh/config(见前文 ProxyJump prod-web 示例)堡垒机关键能力对照:
| 能力 | 简易跳板机(OpenSSH) | 专业堡垒机 |
|---|---|---|
| 统一入口 | ✅ | ✅ |
| 密钥集中管理 | 部分(需手工分发) | ✅ 自动下发与回收 |
| 细粒度授权 | 有限(AllowUsers) | ✅ 按人/按机器/按命令 |
| 操作审计 | 仅系统日志 | ✅ 命令级审计 + 会话录像 |
| 会话回放 | ❌ | ✅ |
| 双因素认证(2FA) | 需自行集成 | ✅ 内置 |
| 成本 | 0 | 开源(JumpServer、Teleport)或商业方案 |
开源堡垒机选型(截至 2026 年活跃项目):JumpServer(国产、功能完整、有社区版)、Teleport(Gravitational,支持 SSH/K8s/数据库、云原生友好)、Apache Guacamole(无客户端,浏览器直连 RDP/VNC/SSH)。
六、会话超时与安全策略
会话管理常被忽略,但它直接关系到"人走了、会话还开着"这类风险。
| 策略项 | 配置位置 | 建议值 | 作用 |
|---|---|---|---|
| SSH 空闲超时 | sshd_config 的 ClientAliveInterval/CountMax | 300 / 2 | 约 10 分钟无响应断开 |
| Shell 空闲超时 | /etc/profile.d/timeout.sh 中 export TMOUT=900 | 900 秒 | 15 分钟无操作自动退出 |
| sudo 超时 | /etc/sudoers 的 timestamp_timeout | 5 分钟 | 重新输入密码 |
| 登录失败锁定 | faillog / pam_tally2 / faillock | 5 次锁定 15 分钟 | 防暴力破解 |
| 密码有效期 | /etc/login.defs 的 PASS_MAX_DAYS | 90 天 | 定期更换 |
| 历史命令审计 | /etc/profile.d/audit.sh 记录到 syslog | — | 事后追溯 |
| 并发登录限制 | /etc/security/limits.conf 的 maxlogins | 按需 | 防止会话滥用 |
配置示例:
# 全局 shell 空闲超时(15 分钟)
echo 'export TMOUT=900; readonly TMOUT' | sudo tee /etc/profile.d/timeout.sh
# 登录失败锁定(Debian/Ubuntu 用 pam_faillock)
# 在 /etc/pam.d/common-auth 中添加:
# auth required pam_faillock.so preauth silent deny=5 unlock_time=900
# auth required pam_faillock.so authfail deny=5 unlock_time=900
# 查看与解锁
faillog -u opsuser
sudo faillog -u opsuser -r
# 命令审计:把 history 实时写入 syslog
cat <<'EOF' | sudo tee /etc/profile.d/audit.sh
export PROMPT_COMMAND='RETRN_VAL=$?; logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"'
readonly PROMPT_COMMAND
EOF
# fail2ban 防 SSH 暴力破解
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
企业QQ咨询




