为什么一定要修改 SSH 默认端口?
当你把一台 Linux 服务器放到公网上,可能几个小时后就会发现一件扎心的事:日志里全是 SSH 登录失败的记录。
这是因为互联网上有大量自动化脚本在 7×24 小时扫描全球 IP 的 22 端口。一旦扫到 SSH 服务开放,它们就会用庞大的密码字典进行暴力破解。据公开数据统计,一台刚上线的服务器在默认 22 端口下,一天内可能遭受数千甚至上万次暴力破解尝试。
修改 SSH 默认端口是最简单、成本最低的安全加固手段之一。虽然它不能完全阻止定向攻击,但能挡掉 99% 的自动化扫描机器人——因为这些脚本只扫描 22、2222、22222 这些常见端口。
本文将以 CentOS 7/8 和 Ubuntu 20/22 为例,详细介绍如何安全地修改 SSH 远程端口,并重点处理配置文件修改、防火墙放行、连接测试和关闭旧端口这几个关键步骤,确保整个过程不会把自己锁在门外。
操作前的准备工作
在动手之前,有几件事必须先确认清楚,否则改完端口连不上服务器就尴尬了。
第一,保持当前 SSH 连接不要断开。这是最重要的一条。在整个修改过程中,始终保留一个已连接的终端窗口,这样万一新端口配错了,还能通过旧连接回滚。
第二,确认新端口没有被其他服务占用。可以用以下命令检查:
# 查看所有已监听的 TCP 端口
ss -tlnp
# 或者
netstat -tlnp
建议选择 1024-65535 范围内的不常见端口,比如 38921、52764、47382 这类数字。不要选 2222、8080、3306 等常见端口,避免与其他服务冲突。
第三,备份 SSH 配置文件。养成好习惯,改配置前先备份:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
万一改出问题,一条命令就能恢复:
sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
sudo systemctl restart sshd
第一步:修改 SSH 配置文件
SSH 服务的配置文件统一在 /etc/ssh/sshd_config,不管你用的是 CentOS、Ubuntu 还是 Debian,路径都一样。
用你习惯的编辑器打开它:
# 使用 vim
sudo vim /etc/ssh/sshd_config
# 或者使用 nano(对新手更友好)
sudo nano /etc/ssh/sshd_config
打开后找到 #Port 22 这一行(大约在文件的第 13-17 行附近)。# 号表示这行是注释,SSH 实际使用的是默认的 22 端口。
修改时有一个关键技巧:先保留 22 端口,添加新端口,两者共存。等测试确认新端口没问题了,再删掉 22 端口。这样就不会把自己锁在外面。
具体操作如下:
# 找到这一行
#Port 22
# 修改为(去掉注释,保留 22,同时添加新端口)
Port 22
Port 38921

保存并退出编辑器。vim 用户按 Esc 后输入 :wq 回车,nano 用户按 Ctrl+O 保存后 Ctrl+X 退出。
第二步:放行防火墙端口
SSH 配置改好了,但服务器的防火墙还不知道新端口的存在。如果你直接重启 SSH 服务,新端口可能会被防火墙挡住。所以必须先放行端口,再重启服务。
不同 Linux 发行版使用的防火墙工具不同,下面分别说明。
CentOS 7/8(使用 firewalld):
# 永久放行新端口
sudo firewall-cmd --permanent --add-port=38921/tcp
# 重载防火墙使规则生效
sudo firewall-cmd --reload
# 确认端口已放行
sudo firewall-cmd --list-ports
CentOS 6 或旧版系统(使用 iptables):
# 添加放行规则
sudo iptables -I INPUT -p tcp --dport 38921 -j ACCEPT
# 保存规则
sudo service iptables save
# 或者(部分系统)
sudo iptables-save | sudo tee /etc/iptables.rules
Ubuntu / Debian(使用 ufw):
# 放行新端口
sudo ufw allow 38921/tcp
# 查看防火墙状态
sudo ufw status
第三步:重启 SSH 服务并测试
防火墙已经配置好了,现在重启 SSH 服务让新配置生效:
# CentOS / RHEL / Fedora
sudo systemctl restart sshd
# Ubuntu / Debian
sudo systemctl restart ssh
重启没有报错的话,新端口就已经生效了。可以用以下命令确认:
# 查看 SSH 服务正在监听哪些端口
ss -tlnp | grep sshd
正常情况下你会看到 22 和 38921 两个端口都在监听。
接下来进行关键的连接测试。不要关闭当前终端,新开一个终端窗口尝试用新端口连接:
# 本地电脑执行(替换为你的服务器 IP 和新端口)
ssh -p 38921 root@你的服务器IP

如果能正常登录,说明新端口配置成功。如果连不上,不要慌,用原来的终端窗口排查问题,旧端口 22 还在。
第四步:关闭默认 22 端口
确认新端口完全正常后,就可以关闭旧的 22 端口了。这一步千万别跳过测试直接做。
编辑 SSH 配置文件:
sudo vim /etc/ssh/sshd_config
找到 Port 22 那一行,在前面加 # 注释掉,或者直接删除,只保留新端口:
#Port 22
Port 38921
保存后重启 SSH 服务:
sudo systemctl restart sshd
同时别忘了关闭防火墙中的 22 端口:
# firewalld
sudo firewall-cmd --permanent --remove-port=22/tcp
sudo firewall-cmd --reload
# ufw
sudo ufw delete allow 22/tcp
# iptables
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
sudo service iptables save
旧 22 端口确认不再使用后,就可以从防火墙规则中移除对应放行项,避免继续暴露默认 SSH 入口。
连接失败的排查指南
如果修改端口后连不上服务器,按以下顺序排查:
1. 检查防火墙是否放行了新端口:
# firewalld
sudo firewall-cmd --list-ports
# ufw
sudo ufw status
# iptables
sudo iptables -L -n | grep 38921
2. 检查 SSH 服务是否正常运行:
sudo systemctl status sshd
# 或
sudo systemctl status ssh
3. 检查 SSH 配置文件语法是否有误:
sudo sshd -t
这个命令会检查配置文件语法,没有任何输出说明配置正确。如果有报错,根据提示修改即可。
4. 查看日志定位问题:
# CentOS / RHEL
sudo tail -f /var/log/secure
# Ubuntu / Debian
sudo tail -f /var/log/auth.log
终极方案:如果以上都排查不出问题,使用云厂商提供的 VNC / WebShell 远程连接功能登录服务器,直接在控制台上操作。
进阶安全建议
修改端口只是 SSH 安全的第一步,以下措施可以进一步提升安全性:
1. 禁止 root 用户远程登录
创建一个普通用户用于日常 SSH 登录,需要 root 权限时再用 sudo。编辑 /etc/ssh/sshd_config:
PermitRootLogin no
2. 使用 SSH 密钥登录,禁用密码登录
PubkeyAuthentication yes
PasswordAuthentication no
这样即使端口被扫到,没有私钥也无法登录。
3. 安装 Fail2Ban 自动封禁恶意 IP
Fail2Ban 会监控 SSH 登录日志,对多次登录失败的 IP 自动执行封禁操作:
# CentOS
sudo yum install epel-release -y
sudo yum install fail2ban -y
# Ubuntu
sudo apt install fail2ban -y
创建配置文件 /etc/fail2ban/jail.d/sshd.local:
[sshd]
enabled = true
port = 38921
maxretry = 3
findtime = 600
bantime = 3600
logpath = /var/log/secure
启动并设为开机自启:
sudo systemctl enable --now fail2ban
这样在 10 分钟内登录失败 3 次的 IP 会被自动封禁 1 小时。
4. 修改 SSH 登录横幅(Banner)
在 /etc/ssh/sshd_config 中设置 Banner 可以在登录时显示警告信息,对低级攻击者有威慑作用:
Banner /etc/ssh/banner
常见问题
Q:修改端口后宝塔面板连不上了怎么办?
A:SSH 端口修改不影响宝塔面板的 Web 端口(默认 8888),但如果你用 SSH 客户端连接宝塔的终端,需要更新为新的端口号。同时在宝塔面板的「安全」设置中也要放行新端口。
Q:端口选多少合适?有什么推荐范围?
A:建议在 49152-65535(动态/私有端口范围)中选择,比如 53821、59274 这类数字。避免使用 2222、22222、443、3306 等常见端口。端口号码没有安全性差异,关键是”不常见”。
Q:修改端口能完全防止暴力破解吗?
A:不能。修改端口只能挡住自动化扫描,挡不住端口扫描 + 字典破解的组合攻击。建议配合 SSH 密钥认证 + Fail2Ban + 禁止 root 登录一起使用,形成多层防御。
Q:SFTP / SCP 会不会受影响?
A:SFTP 和 SCP 都走 SSH 协议,端口修改后需要同步指定新端口。连接命令示例:
scp -P 38921 file.txt root@服务器IP:/目标路径
sftp -P 38921 root@服务器IP
注意 scp 和 sftp 的端口参数是大写 -P,而 ssh 是小写 -p。
总结
修改 SSH 默认端口虽然只是一个简单的配置变更,但它是服务器安全防护链中的重要一环。整个流程可以总结为六个字:改端口、放防火、关旧口。
核心操作回顾:
- 备份配置文件
/etc/ssh/sshd_config - 添加新端口(保留旧端口作为备份)
- 在系统防火墙(firewalld/ufw/iptables)中放行新端口
- 重启 SSH 服务,新开终端测试新端口连接
- 确认无误后关闭旧 22 端口
安全是一个持续的过程,修改端口只是起点。建议在此基础上进一步配置 SSH 密钥认证、安装 Fail2Ban、禁用 root 远程登录,把服务器安全做到位。
到位。











