结论: 远程连接 Linux 服务器用 SSH:ssh -p 22 user@公网IP;连接 Windows 服务器用远程桌面(RDP):mstsc 连 3389 端口;控制台无法触达时用 VNC 或 IPMI/iDRAC 带外管理。生产环境必须用 SSH 密钥登录并禁用密码验证,同时把 22 端口来源限制为固定 IP,否则会被自动化脚本持续爆破。
远程连接是服务器运维的起点,也是每台机器生命周期里用得最频繁的动作。看似只有一条 ssh 命令,但实际工作中会遇到各种变化:端口不是默认的 22、一台电脑要管几十台服务器、公司网络限制了出网端口、服务器装的是 Windows、或者系统卡死连 SSH 都进不去。
本文按"能连上 → 连得方便 → 连得安全 → 连不上怎么办"四个层次展开。所有命令均以 Ubuntu 24.04 LTS / Debian 12 / Rocky Linux 9 为准,并给出 CentOS 7 与 Windows Server 2022 的对照写法。截至 2026 年,OpenSSH 主流版本为 9.x,已默认禁用 SSH-1 协议与部分弱加密算法。
远程连接的四种方式怎么选
结论:日常运维用 SSH(Linux)或 RDP(Windows);网络层完全不通、系统崩溃或需要看启动画面时,用云控制台的 VNC 或硬件带外管理(IPMI)。 选择的关键在于"操作系统是否还活着"——SSH 依赖系统内的 sshd 服务,而 IPMI 走的是独立管理网卡,即使关机也能用。
| 方式 | 默认端口 | 适用系统 | 是否需要系统启动 | 典型场景 |
|---|---|---|---|---|
| SSH | 22 | Linux / macOS / BSD | 是 | 日常命令运维、文件传输 |
| RDP | 3389 | Windows Server | 是 | Windows 图形界面操作 |
| VNC(控制台) | 云厂商分配 | 全平台 | 是 | SSH 连不上时的应急入口 |
| IPMI / iDRAC / iLO | 623(IPMI) | 物理服务器 | 否 | 装系统、看 BIOS、强制重启 |
| SFTP / SCP | 22 | Linux | 是 | 上传下载文件 |
SSH 是什么
SSH(Secure Shell,安全外壳协议)是一种加密的网络传输协议,默认监听 TCP 22 端口。它把你在本地敲的每一个字符加密后传给服务器,再把返回结果加密传回来。之所以选择 22 端口以外的自定义端口能挡掉大量扫描,是因为绝大多数自动化攻击只扫默认端口,但这属于"隐蔽式安全",不能替代真正的加固。
Linux 服务器:SSH 连接完整流程
结论:Linux 服务器远程连接的标准流程是"本地生成密钥对 → 公钥上传服务器 → 用私钥免密登录"。 相比密码,密钥长度达到 256 位的 ED25519 几乎不可能被暴力破解,且可以实现完全无人值守的自动化脚本连接。
第一步:本地生成 SSH 密钥对
# 生成 ED25519 密钥(推荐,比 RSA 更快更短更安全)
ssh-keygen -t ed25519 -C "ops@example.com"
# 若目标服务器较老不支持 ED25519,退而求其次用 RSA 4096
ssh-keygen -t rsa -b 4096 -C "ops@example.com"
# 查看生成的密钥文件
ls -l ~/.ssh/
# id_ed25519 私钥,绝不外传,权限必须 600
# id_ed25519.pub 公钥,可以公开,装到服务器上Windows 用户如果没有 OpenSSH,可以在 PowerShell 中执行同样的命令(Windows 10 1809 及以上内置 OpenSSH 客户端):
# Windows PowerShell 生成密钥
ssh-keygen -t ed25519 -C "ops@example.com"
# 用 Xshell 的话:工具 → 用户密钥管理者 → 生成 → 密钥类型 Ed25519
# 生成后把公钥内容复制到服务器的 ~/.ssh/authorized_keys第二步:把公钥放到服务器上
# 方式一(推荐):ssh-copy-id 自动完成,需临时允许密码登录
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 22 root@<你的公网IP>
# 方式二:已有密钥登录 root 时,手工追加公钥
cat ~/.ssh/id_ed25519.pub | ssh -p 22 root@<你的公网IP> \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
# 方式三:云控制台创建时绑定密钥对,或控制台"绑定密钥"功能第三步:配置 ~/.ssh/config 简化登录
这是提升效率最明显的一步。配置后不必再记 IP、端口、用户名和密钥路径:
cat > ~/.ssh/config <<'EOF'
# 生产 Web 服务器
Host web01
HostName 203.0.113.10
Port 22
User opsuser
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3
# 跳板机 + 内网目标机的穿透写法
Host jump
HostName 203.0.113.20
Port 2222
User jumpser
IdentityFile ~/.ssh/id_ed25519
Host inner-db
HostName 10.0.0.15
Port 22
User opsuser
ProxyJump jump
IdentityFile ~/.ssh/id_ed25519
# 对所有主机生效的通用配置
Host *
StrictHostKeyChecking ask
ConnectTimeout 10
EOF
chmod 600 ~/.ssh/config
# 之后连接只需一条短命令
ssh web01
ssh inner-db # 自动经过 jump 跳板机第四步:文件传输 scp 与 sftp
# 上传本地文件到服务器
scp -P 22 ./deploy.tar.gz opsuser@web01:/data/releases/
# 从服务器下载整个目录(-r 递归,-C 压缩)
scp -r -C opsuser@web01:/var/log/nginx/ ./nginx-logs/
# 交互式 SFTP 会话
sftp opsuser@web01
# 进入后可使用的命令:ls / cd / get / put / mkdir / rm / exit
# 两台远程主机之间对拷(-3 表示经由本地中转)
scp -3 opsuser@web01:/data/a.sql opsuser@web02:/data/Windows 服务器:远程桌面(RDP)连接
结论:Windows Server 远程连接用 RDP 协议,本地执行 mstsc 打开远程桌面连接,输入 IP 后登录即可。 注意 Windows Server 默认只允许同一时间 2 个管理会话(非 RDS 授权情况下),第三个人连入会挤掉前一个用户。
先用 PowerShell 在服务器端启用并放行:
# 启用远程桌面
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' `
-Name "fDenyTSConnections" -Value 0
# 放行防火墙(等价于放行 3389 端口)
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
# 确认监听状态
netstat -ano | findstr :3389
# 查询当前远程会话
query session客户端连接方式:
- Windows 本机:Win + R → 输入
mstsc→ 计算机填IP:端口(端口非 3389 时写作IP:3390)。 - macOS:App Store 安装 "Windows App"(原 Microsoft Remote Desktop)。
- Linux:安装
remmina或rdesktop,sudo apt install -y remmina remmina-plugin-rdp。 - 手机端:RD Client(iOS / Android 均可用)。
安全提醒:3389 端口是勒索软件入侵的主要入口之一。生产环境务必限制来源 IP,或部署 VPN / 堡垒机后再开放,绝不要对 0.0.0.0/0 全开。
让远程连接更安全:必做的 6 项加固
结论:连得上之后第一件大事是收紧入口——禁用密码登录、禁止 root 直登、改端口、限制来源 IP、装 fail2ban、用堡垒机收敛权限。 这六项能把绝大多数自动化攻击挡在外面。
修改 sshd 服务端配置
# 修改前先备份,改错还能救回来
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
# 关键安全项写入独立配置文件(conf.d 优先级高于主配置)
sudo tee /etc/ssh/sshd_config.d/99-hardening.conf > /dev/null <<'EOF'
# 禁用 root 直接 SSH 登录
PermitRootLogin no
# 彻底关闭密码认证,只允许密钥
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
# 禁止空密码
PermitEmptyPasswords no
# 登录宽限时间与最大尝试次数
LoginGraceTime 30
MaxAuthTries 3
# 空闲 10 分钟自动断开(10 分钟 × 3 次心跳)
ClientAliveInterval 600
ClientAliveCountMax 3
# 限定允许 SSH 登录的用户白名单
AllowUsers opsuser deploy
EOF
# 检查语法是否有错
sudo sshd -t
# 无误后重启服务(Ubuntu / Debian)
sudo systemctl restart ssh
# Rocky Linux 9 / CentOS 7 服务名是 sshd
# sudo systemctl restart sshd重启前千万不要断开当前连接,另开一个终端窗口测试新配置能否登录,确认无误再关闭旧会话。这是避免把自己锁在门外的关键习惯。
用 fail2ban 自动封禁爆破 IP
# Ubuntu 24.04 / Debian 12
sudo apt install -y fail2ban
# Rocky Linux 9 需先启用 EPEL 源
sudo dnf install -y epel-release && sudo dnf install -y fail2ban
# 配置 sshd 监狱
sudo tee /etc/fail2ban/jail.local > /dev/null <<'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
findtime = 600
EOF
sudo systemctl enable --now fail2ban
# 查看当前被封禁的 IP 列表
sudo fail2ban-client status sshdSSH 端口转发:把任意 TCP 流量装进加密隧道
结论:SSH 不只是"登录服务器"的工具,-L / -R / -D 三个参数能建立加密隧道,用来安全访问内网数据库、临时对外暴露本地服务,或充当加密代理。
# 本地端口转发:把远端内网 3306 映射到本机 13306(安全访问内网数据库)
ssh -L 13306:10.0.0.15:3306 -N -f opsuser@web01
mysql -h 127.0.0.1 -P 13306 -u root -p
# 远程端口转发:把本机的 3000 暴露到跳板机 8080(临时演示或回调)
ssh -R 8080:127.0.0.1:3000 -N -f jumpser@jump
# 动态转发:在本机开一个 SOCKS5 代理
ssh -D 1080 -N -f opsuser@web01
curl --socks5-hostname 127.0.0.1:1080 https://example.com三种转发的记忆口诀是"谁监听、谁受益":-L(Local)在本地监听,用于从本地访问只有服务器能触达的内网服务,是使用频率最高的一种;-R(Remote)在远端监听,用于把本机服务临时暴露给服务器侧;-D(Dynamic)在本地开一个 SOCKS5 代理,浏览器或命令行配置后即可经由服务器出口访问外网。参数 -N 表示不执行远程命令,-f 表示转入后台,两者通常一起用。
需要注意两点:一是隧道依附于登录会话,会话断开隧道即消失,需要长期通道时用 autossh 或写成 systemd 服务,生产环境更推荐用 VPN 或专线替代;二是数据库、Redis、Elasticsearch 这类服务不要为了方便改成监听 0.0.0.0,用 -L 转发既安全又无需改动服务本身的配置,是排查内网服务时最干净的临时方案。
常见误区 / 排错提示
- 私钥或 authorized_keys 权限太宽松:OpenSSH 会因安全性拒绝使用,服务器日志显示
Permissions 0644 for ... are too open。修正命令:chmod 600 ~/.ssh/id_ed25519与chmod 600 ~/.ssh/authorized_keys、chmod 700 ~/.ssh。 - 直接在生产机上改完 sshd_config 就断开:配置写错会导致彻底失联。正确做法是
sudo sshd -t校验语法、保留现有会话、新开窗口测试通过后再退出。 - 改了端口却忘了改防火墙和安全组:Linux 改 SSH 端口后,需在 ufw/firewalld 与云平台安全组同时放行新端口,还要考虑 SELinux:
sudo semanage port -a -t ssh_port_t -p tcp 2222(Rocky Linux)。 - 把私钥发给同事或上传 GitHub:私钥一旦泄露,等于服务器大门钥匙外流。必须用密码保护私钥、一人一钥,离职立即从
authorized_keys移除对应公钥。 - 以为 ping 不通就是服务器挂了:很多机器出于安全考虑禁用了 ICMP,SSH 仍然可用。判断存活应用
nc -zv IP 22或telnet IP 22测试具体端口,而不是只 ping。
常见问题(FAQ)
SSH 默认端口可以改吗?改成多少合适?
可以,编辑 /etc/ssh/sshd_config.d/ 下的配置文件设置 Port 2222(建议 1024~65535 之间避开常见服务)。改端口能挡掉约 90% 以上的随机扫描,但属于"隐蔽式安全",必须配合禁用密码登录使用。改完后记得同步放行防火墙与安全组,否则会把自己关在外面。
Xshell、FinalShell 和 Putty 哪个好用?
Putty 轻量免费但功能简陋,适合临时应急;Xshell 功能全面(隧道、多会话、脚本),个人版免费但商业需授权;FinalShell 国产、带实时资源监控与文件管理面板,新手体验最好。macOS/Linux 用户直接用系统内置终端配合 ~/.ssh/config 即可,效率高于任何图形工具。
忘记密码或私钥丢了还能登录服务器吗?
能。Linux 服务器可以通过云控制台的 VNC 进入单用户模式重置密码;Windows Server 可在控制台用"重置实例密码"功能。物理机则需要用 IPMI 挂载急救盘修改。如果既无 VNC 也无 IPMI,最后手段是关机后把系统盘挂载到另一台机器上修改 /etc/shadow。
多台服务器要怎么管理才高效?
三个层次递进:一是用 ~/.ssh/config 配别名和 ProxyJump 跳板机;二是用 Ansible 做批量命令执行与配置下发,一条命令操作上百台;三是部署堡垒机(JumpServer、Teleport 等)统一做权限管控与操作审计。超过 10 台服务器就该上第二层了。
连接经常自动断开怎么解决?
原因是中间网络设备清理了空闲 NAT 会话。两种解决思路:客户端在 ~/.ssh/config 中设置 ServerAliveInterval 60 每 60 秒发心跳;或服务端在 sshd 配置中设置 ClientAliveInterval 60 与 ClientAliveCountMax 3。配置后基本不会再出现"挂着挂着就断开"的情况。
可以用手机远程管理服务器吗?
可以。iOS 推荐 Termius、iSH,Android 推荐 JuiceSSH、Termux,均支持密钥登录与端口转发。Windows 服务器则用官方 RD Client,触屏操作体验尚可。需要注意手机端存储私钥存在泄露风险,建议启用生物识别锁,并只为手机分配低权限账号。
企业QQ咨询




