Linux VPS 常用运维操作:SSH 登录、密钥免密、改端口、重置 MySQL 密码、封禁邮件端口

· Linux教程

拿到一台 Linux VPS 之后,最常做的几件事是:用 SSH 连上去、配好密钥免密登录、必要时改掉默认端口、偶尔重置数据库密码、以及关掉邮件端口避免被机房投诉。 本文把这几项整理成一份可直接复制执行的手册,命令区分了 systemd 与旧版 init 系统、以及不同 MySQL 版本的写法。

如何通过 SSH 连接到 Linux 服务器?

各平台的常用工具:

系统推荐方式
macOS / Linux系统自带终端,直接用 ssh 命令
Windows 10 及以上自带 OpenSSH,在 PowerShell 或终端里直接用 ssh 命令
Windows(图形化)PuTTYXshellMobaXterm
AndroidJuiceSSH、Termux
iOSTermius、Blink Shell

最简单的方式是命令行,Windows 10 之后已不再需要额外装客户端:

# 默认 22 端口
ssh root@123.123.123.123

# 指定端口
ssh -p 60022 root@123.123.123.123

输入密码时屏幕不会显示任何字符(连星号都没有),这是正常的,输完直接回车即可。

首次连接会提示确认服务器指纹,输入 yes 回车。

用 PuTTY 连接(图形化)

putty.org 下载最新版本。注意不要使用来路不明的老版本安装包——PuTTY 早期版本存在已知安全漏洞。

填入服务器 IP 与端口,点 Open 即可:

putty 填写主机地址

putty 连接设置

putty 登录界面

putty 输入用户名

再次提醒:输入密码时不显示任何字符。

putty 输入密码

putty 登录成功

如何配置 SSH 密钥免密登录?

配置之后,两台机器之间就可以免密执行 sshscp 以及各类基于 SSH 的自动化脚本,不必再反复输入密码——这也是比密码登录更安全的做法。

Linux 信任关系

推荐做法,本地如果还没有密钥先生成一对:

# 已有 ~/.ssh/id_ed25519.pub 可跳过
ssh-keygen -t ed25519 -C "你的备注"

然后一条命令推送到目标服务器:

ssh-copy-id root@123.123.123.123

# 非默认端口
ssh-copy-id -p 60022 root@123.123.123.123

ssh-copy-id 会自动处理 .ssh 目录创建和权限设置,是最省事的方式。

如果系统里没有 ssh-copy-id(部分精简镜像),可以用这条等价命令:

ssh root@123.123.123.123 'test -d .ssh || mkdir -m 0700 .ssh ; cat >> .ssh/authorized_keys && chmod 0600 .ssh/authorized_keys' < ~/.ssh/id_ed25519.pub

需要双向免密,就在对方机器上同样操作一次,IP 换成本机地址。用户名不是 root 时,替换命令里的 root 即可。

配置成功后建议进一步关闭密码登录,具体见服务器基础安全配置

能 ping 通但 SSH 连不上,怎么办?

这种情况通常不是机器挂了。常见原因有三类:

  1. SSH 端口被封锁——IP 能通但特定端口不通,换个端口往往就恢复了。
  2. SSH 服务未运行或防火墙拦截。
  3. 服务器负载过高导致无法建立新连接。

针对第一类,修改 SSH 端口即可。前提是你还能登进去——如果已经完全连不上,需要通过控制台的 VNC / Lish 等带外方式登录,或者从另一台能连通的服务器中转。

编辑配置文件:

vi /etc/ssh/sshd_config

找到 Port 22 这一行,改成你想要的端口号(建议 1024–65535 之间)。如果该行以 # 开头,要把 # 去掉,否则不生效。

Port 60022

保存后重启服务:

# systemd 系统(CentOS 7+ / Debian 8+ / Ubuntu 16.04+,目前绝大多数)
systemctl restart sshd

# 旧版 init 系统
/etc/init.d/sshd restart

两个容易踩的坑:

强烈建议:改完端口后不要关闭当前会话,另开一个终端用新端口测试连接成功,再退出原会话。否则一旦配置有误,你会把自己锁在外面。

忘记 MySQL root 密码,如何重置?

不同版本的 MySQL 语法差异很大,用错版本的命令会直接报错。先确认版本:

mysql --version

第一步(所有版本通用),以跳过权限验证的方式启动:

# 停止服务
systemctl stop mysqld     # 或 systemctl stop mysql

# 跳过权限表启动
mysqld_safe --skip-grant-tables --skip-networking &

# 免密进入
mysql -u root

第二步,按版本执行对应语句:

-- MySQL 8.0
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

-- MySQL 5.7
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
-- 若上句不可用,退回:
-- UPDATE mysql.user SET authentication_string=PASSWORD('新密码') WHERE User='root';

-- MySQL 5.6 及更早
UPDATE mysql.user SET Password=PASSWORD('新密码') WHERE User='root';
FLUSH PRIVILEGES;

注意:SET PASSWORD=PASSWORD('...') 这种旧写法在 MySQL 5.7 已被标记废弃,在 8.0 中已彻底移除,网上大量老教程仍在使用,照抄会报语法错误。

第三步,退出并正常重启:

quit
# 结束临时进程
killall mysqld_safe mysqld 2>/dev/null

systemctl start mysqld    # 或 systemctl start mysql

用新密码验证:mysql -u root -p

如何封禁邮件端口,避免机房投诉?

服务器被滥用发送垃圾邮件,是收到机房 abuse 投诉最常见的原因之一,可能来自被入侵的程序,也可能是业务本身不需要却开着。如果你的业务完全不需要发邮件,直接封掉相关端口是最省心的做法。

涉及的端口:25(SMTP)、110(POP3)、465/587(加密 SMTP 提交)、993/995(加密 IMAP/POP3)。

iptables(传统方式):

iptables -A OUTPUT -p tcp -m multiport --dport 25,110,465,587,993,995 -j DROP
iptables -A OUTPUT -p udp -m multiport --dport 25,110,465,587,993,995 -j DROP

规则默认重启即失效,需要持久化:

# Debian / Ubuntu
apt install iptables-persistent -y && netfilter-persistent save

# CentOS 6 等旧系统
service iptables save

firewalld(CentOS 7+ / Rocky / Alma 默认):

firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp -m multiport --dport 25,110,465,587,993,995 -j DROP
firewall-cmd --reload

只封 OUTPUT(出站)即可达到”禁止本机对外发信”的目的。原先流传的写法同时封了 INPUT,那会连带影响本机接收邮件相关服务,如果服务器上跑着邮件服务需要留意。

服务器安全的整体配置建议参考服务器基础安全配置Linode VPS 初始安全配置

相关教程