在 Ubuntu22 之后的版本中采用了 Systemd Socket Activation 来管理 ssh 端口,在这种模式下,Systemd 负责监听端口。只有当有连接请求到达端口时,Systemd 才会启动 SSH 服务进程来处理。这意味着空闲时 SSH 服务几乎不占内存。传统的修改 ssh 配置文件的方式并不会生效,本文将指导如何将 SSH 默认端口(22)修改为自定义端口(例如 2222)。
1024 到 65535 之间的端口,且避开常用端口(如 80, 443, 8080, 3306)。这是最关键的一步。 在修改 SSH 服务之前,必须先在防火墙放行新端口,否则重启服务后将立刻失联。
# 1. 放行新端口 (使用 limit 限制暴力破解频率)
sudo ufw limit 2222/tcp
# 2. 确认规则已生效
sudo ufw status
# 确保列表中能看到 2222/tcp
请根据您的偏好选择 方案 A 或 方案 B。不要同时混用。
适用于习惯传统运维方式的用户,或旧版 Linux 系统。
禁用 Systemd Socket (针对 Ubuntu 22.04+):
为了确保 sshd_config 生效,必须先禁用 Socket 激活模式。
sudo systemctl stop ssh.socket
sudo systemctl disable ssh.socket
修改配置文件:
sudo nano /etc/ssh/sshd_config
找到 #Port 22,修改为:
Port 2222
重启服务:
sudo systemctl enable ssh.service
sudo systemctl restart ssh
检查监听状态:
sudo ss -tulpn | grep ssh
# 应显示: sshd ... *:2222
适用于 Ubuntu 22.04+,更节省资源,更推荐。
启用 Systemd Socket:
sudo systemctl disable --now ssh.service
sudo systemctl enable --now ssh.socket
创建覆盖配置 (Override): 不要直接修改原文件,创建一个 drop-in 配置文件。
sudo systemctl edit ssh.socket
填入以下内容:
[Socket]
# 第一行必须为空,用于清空默认的 22 端口绑定
ListenStream=
# 第二行写入新端口
ListenStream=2222
(保存并退出:Ctrl+O -> Enter -> Ctrl+X)
应用更改:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
检查监听状态:
sudo ss -tulpn | grep ssh
# 应显示: systemd ... *:2222
(注:此时配置文件 /etc/ssh/sshd_config 中的 Port 设置将被忽略)
必做步骤。 如果不修改这里,Fail2Ban 依然会监控 22 端口,导致新端口的暴力破解无法被拦截。
修改 Jail 配置:
sudo nano /etc/fail2ban/jail.local
更新 [sshd] 部分:
找到 [sshd] 区块,显式指定 port。
[sshd]
enabled = true
# 必须修改为新端口
port = 22333
# 建议:如果使用方案 B,可显式指定 backend (通常自动识别,但指定更稳)
# backend = systemd
重启 Fail2Ban:
sudo systemctl restart fail2ban
验证状态:
sudo fail2ban-client status sshd
# 确保没有报错
保持当前的 SSH 窗口打开不要动。
新开一个终端窗口(或 Termius 新连接)。
尝试使用新端口连接:
ssh -p 2222 root@你的服务器IP
确认新端口一切正常后,关闭旧端口以确保安全。
删除防火墙旧规则:
# 如果之前是 limit ssh (默认22)
sudo ufw delete limit ssh
# 或者
sudo ufw delete allow 22/tcp
更新本地配置 (可选):
修改本地电脑的 ~/.ssh/config,更新 Port 字段,方便以后连接。
Host myvps
HostName ...
Port 2222
文档结束