服务器远程连接怎么设置

结论: 服务器远程连接的搭建分三层——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)。

一份生产环境推荐的核心配置:

bash
# /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

改完校验与生效:

bash
# 语法校验(改配置前必做!配错会锁死自己)
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)的原理:客户端持有私钥,服务器存放公钥,登录时用私钥签名证明身份,无需传输密码。它从根本上免疫暴力破解。

bash
# 第 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

多用户与权限分离的做法:

bash
# 创建不同职责的用户,用 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
# ~/.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 默认启用(需先开启"允许远程连接")。

服务端开启步骤:

  1. 服务器管理器 → 本地服务器 → 启用"远程桌面";或在"系统属性 → 远程"中勾选。
  2. 防火墙放行 3389(高级安全防火墙中启用"远程桌面"入站规则组)。
  3. 云服务器还需在安全组放行 3389(强烈建议限制来源 IP,3389 是勒索软件的重点扫描目标)。

修改默认端口(改注册表,需重启生效):

powershell
# 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 $port

RDP 安全加固要点:

  • 启用网络级别身份验证(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 客户端)时才用。

bash
# 安装(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 :1

systemd 托管 VNC:

ini
# /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 隧道访问:

bash
# 客户端建立隧道:本地 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)。它们的区别在于:跳板机是"只有它能从公网访问,其他服务器只在内网"的网络跳板;堡垒机在此基础上增加了身份认证、权限控制、操作审计和会话录制。

架构模型:

text
运维人员 ──SSH──> 堡垒机(公网,双网卡)──内网──> Web服务器 / 数据库 / 缓存
                    │
                    └─> 审计日志 / 会话录制

用 OpenSSH 实现简易跳板机(无需额外软件):

bash
# 在堡垒机上创建统一登录入口,禁止直接登录后端服务器
# 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/CountMax300 / 2约 10 分钟无响应断开
Shell 空闲超时/etc/profile.d/timeout.sh 中 export TMOUT=900900 秒15 分钟无操作自动退出
sudo 超时/etc/sudoers 的 timestamp_timeout5 分钟重新输入密码
登录失败锁定faillog / pam_tally2 / faillock5 次锁定 15 分钟防暴力破解
密码有效期/etc/login.defs 的 PASS_MAX_DAYS90 天定期更换
历史命令审计/etc/profile.d/audit.sh 记录到 syslog—事后追溯
并发登录限制/etc/security/limits.conf 的 maxlogins按需防止会话滥用

配置示例:

bash
# 全局 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