导读:本期聚焦于辉辉创作的《如何修改Fedora的SSH端口并隐藏SSH服务避免被扫描?》,敬请观看详情。把SSH端口从22改成2222后,暴力破解日志里的尝试地址并没有消失,只是换到了新端口继续撞库。原因在于单纯改端口无法隐藏OpenSSH的响应特征,扫描器仍能通过协议版本字符串和TCP行为识别服务。本文以Fedora为例,说明如何正确修改sshd_config中的监听端口,并同步处理SELinux端口标签与firewalld规则,避免重启后无法连接。进一步的内容包括限制来源IP、禁用密码登录、配置AllowUsers、使用端口敲门临时放行端口,以及通过日志观察异常访问。所有操作使用系统自带工具,不需要安装额外的安全面板。远程操作时建议先保留22端口可用,待新端口登录成功后再关闭默认端口,否则容易把自己锁在服务器外。文中还会解释为什么修改Banner不等于隐藏服务,以及怎样用nmap验证端口是否真正对扫描者不可见。

Fedora 默认启用 OpenSSH 服务并监听 TCP 22 端口。互联网上的自动化扫描器通常会在几分钟内尝试连接 22 端口,并根据返回的 SSH 协议版本字符串判断服务类型。更换到高位端口可以过滤掉一部分只扫常见端口的工具,但更专业的扫描器仍会通过全端口或指定范围扫描发现服务。因此,端口修改必须与 SELinux 端口标签、防火墙规则、来源限制和认证策略配合使用,才能真正降低被识别的风险。

如何修改Fedora的SSH端口并隐藏SSH服务避免被扫描?

一、修改端口前必须理解的两个系统组件

Fedora 默认启用 SELinux,并处于 enforcing 模式。SELinux 对 SSH 服务端口有专门的类型标签 ssh_port_tsshd 只能监听带有该标签的端口。如果把 Port 改成 2222,却没有为新端口添加 SELinux 标签,sshd 重启时会直接失败,系统日志中会出现类似 permission denied 的 AVC 拒绝信息。因此,修改端口不是只改配置文件,还必须同步 SELinux 策略。

另一个组件是 firewalld。Fedora 默认的防火墙区域通常开放了 ssh 服务,该服务对应 TCP 22 端口。新端口如果不显式放行,流量会被防火墙直接丢弃。很多场景下管理员修改了 sshd_config,重启服务也成功了,但远程连接仍然超时,往往就是因为防火墙规则没有同步更新。可以先查看当前状态:

sudo getenforce
sudo firewall-cmd --state
sudo semanage port -l | grep ssh

理解这两个组件的约束之后,再开始动手修改,可以避免把自己锁在服务器外。尤其是远程操作时,建议不要一次性关闭 22 端口,而是先让新旧端口并存,确认新端口能够正常登录后再移除旧端口。

二、修改 SSH 端口的完整步骤

第一步是备份配置文件,并修改监听端口。配置文件位于 /etc/ssh/sshd_config。找到 Port 22 这一行,去掉行首注释并改成目标端口,例如 Port 2222。如果希望进一步减少暴露面,还可以通过 ListenAddress 指定 SSH 只监听内网管理网卡。修改命令可以这样执行:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo sed -i 's/^#Port 22$/Port 2222/' /etc/ssh/sshd_config
sudo sed -i 's/^Port 22$/Port 2222/' /etc/ssh/sshd_config

第二步是为新端口添加 SELinux 标签。如果系统中没有 semanage 命令,需要先安装 policycoreutils-python-utils 软件包。添加命令如下:

sudo semanage port -a -t ssh_port_t -p tcp 2222

如果提示该端口已经存在标签,可以使用 -m 参数替换原有的端口标签。完成后可以用 sudo semanage port -l | grep ssh_port_t 确认新端口已经出现在列表中。

第三步是配置 firewalld。先放行新端口,重新加载防火墙,但暂时不要移除 22 端口。这样即使新端口配置有误,仍然可以通过原来的 22 端口登录服务器进行修复。执行以下命令:

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

接着重启 SSH 服务,并打开一个新的终端,使用新端口测试连接。确认新端口可以正常登录后,再回到服务器移除默认的 ssh 服务,也就是关闭 22 端口:

sudo systemctl restart sshd
ssh -p 2222 youruser@server-ip
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload

验证时可以使用 ss -tlnp | grep sshd 查看 SSH 是否只监听新端口。如果服务器有多个网卡,还可以进一步确认监听地址是否符合预期。

三、隐藏 SSH 服务的进阶配置

修改端口只是减少扫描命中率的第一步。真正的隐藏需要让端口对未授权来源不响应,或即使被发现也无法进一步利用。优先级最高的是限制来源 IP。可以使用 firewalld 富规则,只允许指定管理地址访问新端口,其余来源直接丢弃。例如只允许 203.0.113.10 这个地址连接 SSH:

sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.10 port port=2222 protocol=tcp accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 port port=2222 protocol=tcp drop'
sudo firewall-cmd --reload

这样配置后,即使扫描器发现 2222 端口开放,来自非白名单地址的连接也会被静默丢弃,不会返回明确拒绝信息。对于需要动态 IP 访问的场景,可以改用 VPN 或跳板机,再配合来源限制,避免直接暴露 SSH 服务。

认证层面的隐藏同样重要。建议关闭密码登录,只允许密钥认证,并限制允许登录的用户。在 sshd_config 中加入以下配置:

PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
AllowUsers admin
MaxAuthTries 3

这会显著降低暴力破解的成功率,即使攻击者知道了端口和服务类型,也无法轻易通过密码撞库进入系统。修改后需要重启 sshd 服务,并确保自己的公钥已经写入目标用户的 ~/.ssh/authorized_keys 中,否则可能会因为密码登录被禁用而无法认证。

更进一步的隐藏手段是端口敲门。端口敲门的基本思路是:防火墙默认丢弃所有到 SSH 端口的包,只有客户端按指定顺序访问一组端口后,防火墙才临时放行 SSH 端口。这样在未敲门时,扫描器看到的是 filtered 状态,而不是 open。Fedora 可以安装 knock 工具来实现:

sudo dnf install knock

安装后编辑 /etc/knockd.conf,参考配置如下:

[options]
UseSyslog

[openSSH]
sequence = 7000,8000,9000
seq_timeout = 10
command = /usr/bin/firewall-cmd --add-port=2222/tcp
tcpflags = syn

[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 10
command = /usr/bin/firewall-cmd --remove-port=2222/tcp
tcpflags = syn

启用 knockd 后,需要先使用客户端工具或手工发送指定序列的 SYN 包,SSH 端口才会开放。端口敲门会增加操作复杂度,适合对隐蔽性要求较高的管理场景。对于普通服务器,优先做好来源限制和密钥认证通常已经足够。

四、验证、回滚与常见误区

配置完成后需要从外部进行验证。可以在另一台机器上使用 nmap 扫描目标端口:

nmap -p 2222 -sV your-server-ip

如果配置了来源限制,来自非白名单地址扫描结果应显示 filtered 或 closed,而不是 open。若看到 open,说明防火墙规则没有生效,需要检查富规则顺序和默认区域。还可以查看 SSH 日志,观察是否仍有来自陌生地址的连接尝试:

sudo journalctl -u sshd -f

常见误区包括:只修改 sshd_config 而不更新 SELinux 标签导致服务无法启动;只添加新端口而不关闭旧端口,导致隐藏效果大打折扣;认为改成高位端口就不会被扫描,但专业扫描工具会进行全端口探测;以及试图通过修改 Banner 来伪装服务,却不了解 SSH 协议版本字符串仍然会暴露 OpenSSH 身份。真正可靠的隐藏不是依赖单一的端口变化,而是让服务对非授权来源不响应。

如果配置出现问题,回滚步骤是:使用本地控制台或仍可用的管理通道登录,恢复备份配置:

sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
sudo systemctl restart sshd

然后重新放行默认端口,删除新端口的 SELinux 标签和防火墙规则,再逐步排查配置错误。保持一个已经建立连接的终端窗口作为应急通道,是远程修改 SSH 配置时最稳妥的做法。

Fedora SSH端口修改SSH隐藏防火墙配置修改时间:2026-08-29 23:26:29

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。