| 项目 | 说明 |
|---|---|
| 适用系统 | Ubuntu 24.04 LTS |
| SSH 服务 | OpenSSH Server(系统默认安装) |
| 原端口 | 22 |
| 新端口 | 36000(示例,可根据需要自定义) |
| 修改方式 | 常规方法:修改/etc/ssh/sshd_config+ 重启服务 |
| 备选方案 | systemd 覆写(常规方法失效时使用) |
一、背景说明
修改 SSH 默认端口(22)是服务器安全加固的常见措施,可以有效:
- 减少暴力破解攻击(扫描脚本默认只扫 22 端口)
- 降低日志中的无效登录尝试数量
- 提升服务器的整体安全性
二、前提条件
在开始修改前,请确保:
- 你拥有服务器的root 权限或
sudo权限。 - 当前 SSH 连接保持开启(非常重要!)。
- 你已准备好备用连接方式(如云控制台 VNC),以防修改失误导致无法登录。
三、常规修改方法(推荐优先使用)
适用场景:大多数情况,仅修改配置文件即可生效。
3.1 检查当前 SSH 端口
sudoss-tlnp|grepssh默认输出:
LISTEN 0 4096 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=xxx,fd=3)) LISTEN 0 4096 [::]:22 [::]:* users:(("sshd",pid=xxx,fd=4))3.2 修改 SSH 配置文件
sudovim/etc/ssh/sshd_config找到#Port 22这一行,修改为:
Port 36000 # 禁止root远程登录 PermitRootLogin no # 关闭密码登录(有密钥再开) PasswordAuthentication no # 禁用空密码 PermitEmptyPasswords no # 最大认证尝试次数防暴力破解 MaxAuthTries 3注意:
- 如果文件中有多个
Port行,只保留一个,避免冲突。- 行首不能有
#(注释符)。
快速命令(如果你更习惯用命令操作):
# 删除所有已有的 Port 行sudosed-i'/^Port/d'/etc/ssh/sshd_config# 添加新端口echo"Port 36000"|sudotee-a/etc/ssh/sshd_config3.3 测试配置文件语法
sudosshd-t- 无输出:配置正确,可以继续。
- 有错误输出:根据提示修复后再重启。
3.4 重启 SSH 服务
sudosystemctl restartssh3.5 验证新端口监听
sudoss-tlnp|grepssh预期输出:
LISTEN 0 4096 0.0.0.0:36000 0.0.0.0:* users:(("sshd",pid=xxx,fd=3)) LISTEN 0 4096 [::]:36000 [::]:* users:(("sshd",pid=xxx,fd=4))3.6 验证配置加载
sudosshd-T|grep-E"^port|^listenaddress"预期输出:
port 36000 listenaddress [::]:36000 listenaddress 0.0.0.0:36000四、systemd 覆写方案(备选方案)
4.1 什么时候使用?
当常规方法修改后,出现以下情况时,需要使用 systemd 覆写:
| 检查项 | 正常结果 | 异常结果(需使用覆写方案) |
|---|---|---|
sudo sshd -T | grep port | port 36000 | port 22(配置未加载) |
sudo ss -tlnp | grep ssh | 0.0.0.0:36000 | 0.0.0.0:22(仍监听旧端口) |
sudo systemctl status ssh | active (running) | 正常,但端口未变 |
典型场景:
- 配置文件中的
Port已正确修改,但重启后仍监听旧端口。 sshd -T显示新端口,但ss显示旧端口。- systemd 缓存或残留进程导致常规方法失效。
4.2 systemd 覆写操作步骤
步骤 1:创建 systemd 覆写文件
sudosystemctl editssh在弹出的编辑器中粘贴以下内容:
[Service] ExecStart= ExecStart=/usr/sbin/sshd -D -p 36000参数说明:
| 配置项 | 说明 |
|---|---|
ExecStart=(空行) | 清空默认的启动命令 |
ExecStart=/usr/sbin/sshd -D -p 36000 | 指定新启动命令,-p 36000强制绑定端口 |
保存并退出(Ctrl+O,Ctrl+X)。
步骤 2:重载 systemd 配置
sudosystemctl daemon-reload步骤 3:重启 SSH 服务
sudosystemctl restartssh步骤 4:验证端口监听
sudoss-tlnp|grepssh预期输出显示0.0.0.0:36000。
步骤 5:确认覆写文件已创建
ls-la/etc/systemd/system/ssh.service.d/应看到override.conf文件。
4.3 何时删除 systemd 覆写?
当以下情况发生时,可以删除覆写文件,恢复到常规配置模式:
- 你确认常规方法已正常工作(即
sshd_config中的Port已生效)。 - 你想恢复到标准的启动方式,避免 systemd 覆写干扰后续配置变更。
删除方法:
sudorm-f/etc/systemd/system/ssh.service.d/override.confsudosystemctl daemon-reloadsudosystemctl restartssh五、防火墙配置
5.1 Ubuntu UFW 防火墙
# 放行新端口sudoufw allow36000/tcp# 重载防火墙sudoufw reload# 查看已放行端口sudoufw status|grep36000建议:在确认新端口可用前,不要删除 22 端口的放行规则。
5.2 云服务商安全组
如果服务器在云上(阿里云、腾讯云、AWS、华为云等),需在控制台安全组中添加入站规则:
| 参数 | 值 |
|---|---|
| 协议 | TCP |
| 端口 | 36000 |
| 来源 | 0.0.0.0/0(或指定 IP 段) |
六、测试新端口连接
这是最关键的一步!请务必按以下顺序操作:
6.1 保持当前 SSH 窗口打开
不要关闭当前已连接的 SSH 窗口,否则如果新端口配置失败,你将失去对服务器的访问。
6.2 另开一个新终端测试
ssh-p36000用户名@服务器IP如果使用密钥登录:
ssh-p36000-i~/.ssh/id_rsa 用户名@服务器IP成功标志:输入密码后正常登录,看到 shell 提示符。
6.3 如果新端口连接失败
立即在当前窗口中检查并修复:
# 检查服务状态sudosystemctl statusssh# 检查端口监听sudoss-tlnp|grepssh# 查看日志sudojournalctl-ussh-n20七、确认成功后清理旧端口(可选)
确认可以通过新端口正常登录后,你可以选择移除 22 端口的防火墙规则。
sudoufw delete allow22/tcpsudoufw reload⚠️安全建议:生产环境建议先保留 22 端口 1~2 天,确认新端口完全稳定后再关闭,避免因配置遗漏导致失联。
八、回滚方案(应急)
8.1 回滚常规配置
如果新端口无法连接,且当前 SSH 窗口仍保持打开,立即执行以下命令恢复:
# 恢复配置文件中的 Port 22sudosed-i'/^Port/d'/etc/ssh/sshd_configecho"Port 22"|sudotee-a/etc/ssh/sshd_config# 测试配置sudosshd-t# 重启 SSH 服务sudosystemctl restartssh# 验证sudoss-tlnp|grepssh8.2 回滚 systemd 覆写(如果使用过)
sudorm-f/etc/systemd/system/ssh.service.d/override.confsudosystemctl daemon-reloadsudosystemctl restartssh然后用旧方式连接:
ssh用户名@服务器IP九、两种方法对比与选择
| 对比项 | 常规方法 | systemd 覆写方案 |
|---|---|---|
| 操作复杂度 | 低(仅修改一个配置文件) | 中(需创建 systemd 覆写) |
| 适用场景 | 大多数情况 | 常规方法失效时 |
| 维护性 | 好(配置集中在sshd_config) | 一般(配置分散在两处) |
| 优先级 | 优先使用 | 备用方案 |
| 何时使用 | 首次修改 SSH 端口 | sshd -T和ss显示不一致时 |
选择建议:
- 首次修改:直接使用常规方法。
- 常规方法失败:出现
sshd -T显示新端口但ss显示旧端口时,使用 systemd 覆写。 - 恢复常规:使用覆写成功后,可考虑删除覆写文件,恢复正常模式。
十、完整命令汇总
常规方法
# 1. 修改配置sudosed-i'/^Port/d'/etc/ssh/sshd_configecho"Port 36000"|sudotee-a/etc/ssh/sshd_config# 2. 测试配置sudosshd-t# 3. 重启服务sudosystemctl restartssh# 4. 查看监听sudoss-tlnp|grepssh# 5. 防火墙放行sudoufw allow36000/tcpsudoufw reload# 6. 测试连接(另开终端)ssh-p36000用户名@服务器IPsystemd 覆写方案(备选)
# 1. 创建覆写文件sudosystemctl editssh# 粘贴:# [Service]# ExecStart=# ExecStart=/usr/sbin/sshd -D -p 36000# 2. 重载并重启sudosystemctl daemon-reloadsudosystemctl restartssh# 3. 验证sudoss-tlnp|grepssh十一、常见问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
Connection refused | 防火墙/安全组未放行新端口 | 检查 UFW 和云安全组规则 |
ssh -T显示port 22而非新端口 | 配置文件未正确保存 | 检查/etc/ssh/sshd_config中是否有Port 36000且未被注释 |
ss显示 22 而非 36000 | systemd 缓存或残留进程 | 使用 systemd 覆写方案 |
| 重启 SSH 后无法连接 | 配置错误导致服务启动失败 | 使用云控制台 VNC 登录,执行回滚方案 |
| 端口被其他服务占用 | 与其他服务端口冲突 | 更换端口号,或sudo ss -tlnp | grep 36000查看占用进程 |
十二、安装信息汇总
| 项目 | 值 |
|---|---|
| SSH 版本 | OpenSSH Server |
| 原端口 | 22 |
| 新端口 | 36000(示例) |
| 配置文件 | /etc/ssh/sshd_config |
| systemd 覆写路径 | /etc/systemd/system/ssh.service.d/override.conf |
| 测试配置 | sudo sshd -t |
| 服务管理 | sudo systemctl restart ssh |
| 测试连接 | ssh -p 36000 user@IP |
| 防火墙规则 | sudo ufw allow 36000/tcp |
文档版本:3.0
适用系统:Ubuntu 24.04 LTS
最后更新:2026-07-16