Linux 修改 SSH 远程端口,告别默认 22 端口的暴力破解

为什么一定要修改 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
修改 SSH 配置文件中的端口设置
在 sshd_config 中保留 22 端口并新增自定义端口

保存并退出编辑器。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
使用新端口测试 SSH 登录
使用新端口验证 SSH 是否可以正常登录

如果能正常登录,说明新端口配置成功。如果连不上,不要慌,用原来的终端窗口排查问题,旧端口 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

注意 scpsftp 的端口参数是大写 -P,而 ssh 是小写 -p

总结

修改 SSH 默认端口虽然只是一个简单的配置变更,但它是服务器安全防护链中的重要一环。整个流程可以总结为六个字:改端口、放防火、关旧口

核心操作回顾:

  1. 备份配置文件 /etc/ssh/sshd_config
  2. 添加新端口(保留旧端口作为备份)
  3. 在系统防火墙(firewalld/ufw/iptables)中放行新端口
  4. 重启 SSH 服务,新开终端测试新端口连接
  5. 确认无误后关闭旧 22 端口

安全是一个持续的过程,修改端口只是起点。建议在此基础上进一步配置 SSH 密钥认证、安装 Fail2Ban、禁用 root 远程登录,把服务器安全做到位。

到位。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享