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

一、修改端口前必须理解的两个系统组件
Fedora 默认启用 SELinux,并处于 enforcing 模式。SELinux 对 SSH 服务端口有专门的类型标签 ssh_port_t,sshd 只能监听带有该标签的端口。如果把 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