Linux VPS 运维入门:SSH 登录、密钥与安全修改端口
刚拿到 Linux VPS,先把 SSH 登录和恢复入口处理好。数据库密码、邮件出站等操作依赖具体软件与防火墙,不适合塞进一组“所有系统通用”的命令,文末另有对应教程。
第一次连接服务器
macOS、Linux 和当前 Windows 都可以直接在终端运行 ssh:
# 默认 22 端口
ssh root@203.0.113.10
# 使用其他端口
ssh -p 60022 root@203.0.113.10
输入密码时,终端不会显示字符或星号,这是正常现象。首次连接还会显示主机指纹;如果服务商控制台提供了指纹,先核对再确认。已经连接过的服务器突然出现指纹变化,应先排除重装和中间人攻击,不要直接删除提示继续登录。
图形工具也能用,但不是必需。Windows 用户可使用系统自带终端;确实需要 PuTTY 时,只从 PuTTY 官网下载当前版本。
改用 SSH 密钥
密钥登录比重复输入密码更适合日常运维。先在自己的电脑生成 Ed25519 密钥;已经有可用密钥时跳过这一步。
ssh-keygen -t ed25519 -C "work-laptop"
把公钥写入服务器账户:
ssh-copy-id root@203.0.113.10
# 非默认端口
ssh-copy-id -p 60022 root@203.0.113.10
用户名不一定是 root,请替换成实际账户。执行后另开一个终端验证密钥能登录,再考虑关闭密码登录。更完整的普通用户、sudo 与 SSH 加固顺序见服务器初始安全配置。
如果精简系统没有 ssh-copy-id,可以在服务器上手动创建 ~/.ssh/authorized_keys,并确认 .ssh 文件夹权限为 700、文件权限为 600。不要把私钥上传到服务器,也不要通过聊天工具发送私钥。
修改 SSH 端口前的准备
改端口能减少扫描日志和绕开少数网络限制,但不能代替密钥、源 IP 限制和及时更新。动手前先确认:
- 服务商控制台或带外终端仍能登录;
- 当前 SSH 会话保持打开;
- 主机防火墙和云平台防火墙都允许新端口。
在 /etc/ssh/sshd_config 或发行版启用的 sshd_config.d 路径下设置端口,例如:
Port 60022
Ubuntu 默认会先读取 /etc/ssh/sshd_config.d/*.conf。同一选项出现多次时,前面读到的值可能先起作用,因此改完要看实际生效结果,单看某一行配置容易误判。
sudo sshd -t
sudo sshd -T | grep '^port '
第一条没有输出才表示语法检查通过。第二条应显示计划使用的端口。
放行新端口并重启服务
使用 UFW 的 Ubuntu、Debian:
sudo ufw allow 60022/tcp
sudo systemctl restart ssh.service
使用 firewalld 的 RHEL、Rocky Linux、AlmaLinux:
sudo firewall-cmd --permanent --add-port=60022/tcp
sudo firewall-cmd --reload
sudo systemctl restart sshd.service
启用 SELinux 的系统还要登记端口。若端口已存在,用 -m 修改;不存在则用 -a 添加。
sudo semanage port -a -t ssh_port_t -p tcp 60022
不要马上断开原会话。另开终端运行 ssh -p 60022 用户名@服务器IP,确认能登录后,再移除旧端口规则。云平台安全组与系统防火墙是两层配置,任意一层漏放都会失败。
SSH 连不上时从哪一层查
“能 ping 通”只说明 ICMP 可能可达,不能证明 SSH 端口和服务正常。按下面顺序检查,通常比反复改配置更快:
# 服务是否运行
sudo systemctl status ssh.service # Ubuntu / Debian
sudo systemctl status sshd.service # RHEL 系
# 主机实际监听哪些端口
sudo ss -lntp | grep ssh
# 最近的服务日志
sudo journalctl -u ssh.service -n 50 --no-pager
sudo journalctl -u sshd.service -n 50 --no-pager
然后核对主机防火墙、云平台防火墙和本地网络。如果已经无法通过 SSH 进入,只能从服务商控制台恢复;这也是修改端口前必须保留恢复入口的原因。
其他常见操作
文中的 SSH 配置与服务名已按 Ubuntu OpenSSH 文档复核。其他发行版若修改了软件包或服务名,以系统当前文档和 systemctl list-unit-files 的结果为准。