CentOS 8 防火墙 firewalld 配置 SSH 端口:开放22与自定义2222端口实战 CentOS 8 防火墙 firewalld 配置 SSH 端口开放22与自定义2222端口实战1. 理解 firewalld 与 SSH 端口管理的基础在 CentOS 8/9 系统中firewalld 作为默认的防火墙管理工具提供了动态的防火墙规则管理能力。与传统的 iptables 相比firewalld 引入了区域(zone)和服务(service)的概念使得防火墙配置更加灵活和易于管理。SSHSecure Shell作为远程管理 Linux 服务器的标准协议默认使用 22 端口。但在实际生产环境中出于安全考虑我们可能需要确保默认 22 端口的安全访问添加自定义端口如 2222作为备用访问通道理解临时规则与永久规则的区别与应用场景关键概念解析zone区域firewalld 将网络划分为不同的信任级别区域如 public公共网络、trusted完全信任网络等service服务预定义的规则集合如 ssh 服务对应 22/tcp 端口port端口可以直接指定需要开放的端口号和协议运行时配置 vs 永久配置运行时配置立即生效但重启后丢失永久配置写入配置文件但需要重载才能生效2. 检查当前 firewalld 与 SSH 服务状态在开始配置前我们需要确认系统当前的状态# 检查 firewalld 运行状态 sudo systemctl status firewalld # 如果未运行启动并设置开机自启 sudo systemctl start firewalld sudo systemctl enable firewalld # 查看默认区域 sudo firewall-cmd --get-default-zone # 查看活动区域及接口分配 sudo firewall-cmd --get-active-zones # 检查 SSH 服务状态 sudo systemctl status sshd常见问题排查如果发现 firewalld 无法启动可能是由于与旧版 iptables 冲突sudo systemctl stop iptables sudo systemctl mask iptables sudo systemctl start firewalldSSH 服务未运行时sudo systemctl start sshd sudo systemctl enable sshd3. 配置 firewalld 开放默认 SSH 端口22/tcp3.1 通过服务名称开放 SSHfirewalld 预定义了 ssh 服务对应 22/tcp 端口# 查看 ssh 服务定义 sudo firewall-cmd --info-servicessh # 临时添加 ssh 服务到默认区域立即生效重启后失效 sudo firewall-cmd --add-servicessh # 永久添加 ssh 服务到默认区域需重载生效 sudo firewall-cmd --add-servicessh --permanent sudo firewall-cmd --reload3.2 直接通过端口号开放也可以直接指定端口号进行开放# 临时开放 22/tcp 端口 sudo firewall-cmd --add-port22/tcp # 永久开放 22/tcp 端口 sudo firewall-cmd --add-port22/tcp --permanent sudo firewall-cmd --reload3.3 验证 SSH 端口开放状态# 查看当前区域开放的端口 sudo firewall-cmd --list-ports # 查看当前区域开放的服务 sudo firewall-cmd --list-services # 测试端口连通性从另一台机器 telnet your_server_ip 22 # 或 nc -zv your_server_ip 224. 添加自定义 SSH 端口以 2222 为例4.1 修改 SSH 服务配置文件首先需要修改 SSH 守护进程配置使其监听额外端口sudo vi /etc/ssh/sshd_config找到#Port 22行取消注释并在下方添加新端口Port 22 Port 2222保存后重启 SSH 服务sudo systemctl restart sshd4.2 在 firewalld 中开放自定义端口# 临时开放 2222/tcp sudo firewall-cmd --add-port2222/tcp # 永久开放 2222/tcp sudo firewall-cmd --add-port2222/tcp --permanent sudo firewall-cmd --reload4.3 SELinux 相关配置如启用如果系统启用了 SELinux需要为新端口添加策略# 检查 SELinux 状态 sudo getenforce # 如果为 Enforcing需要添加端口规则 sudo semanage port -a -t ssh_port_t -p tcp 2222 # 验证添加结果 sudo semanage port -l | grep ssh4.4 测试自定义端口连接# 本地测试 ssh -p 2222 localhost # 远程测试 ssh -p 2222 usernameyour_server_ip5. 防火墙规则管理高级技巧5.1 临时规则与永久规则的区别规则类型生效时间持久性适用场景临时规则立即生效重启后失效临时测试、紧急变更永久规则需重载后生效持久保存生产环境稳定配置最佳实践建议先添加临时规则测试确认无误后再转为永久规则。5.2 针对特定源 IP 限制访问# 仅允许特定 IP 访问 2222 端口 sudo firewall-cmd --permanent --zonepublic \ --add-rich-rulerule familyipv4 source address192.168.1.100 port protocoltcp port2222 accept # 拒绝特定 IP 访问 22 端口 sudo firewall-cmd --permanent --zonepublic \ --add-rich-rulerule familyipv4 source address10.0.0.50 port protocoltcp port22 reject sudo firewall-cmd --reload5.3 端口转发配置如果需要将外部某个端口转发到内部 22 端口# 将外部 22222 转发到内部 22 sudo firewall-cmd --permanent --zonepublic \ --add-forward-portport22222:prototcp:toport22:toaddr192.168.1.100 sudo firewall-cmd --reload6. 安全加固建议禁用 root 直接登录sudo vi /etc/ssh/sshd_config修改为PermitRootLogin no使用密钥认证替代密码sudo vi /etc/ssh/sshd_config确保包含PasswordAuthentication no PubkeyAuthentication yes定期更换 SSH 端口建议每 3-6 个月更换一次自定义端口保留 22 端口但限制访问 IPfail2ban 防护sudo dnf install fail2ban sudo systemctl enable --now fail2ban防火墙日志监控# 查看被拒绝的连接 sudo journalctl -u firewalld -f7. 常见问题与解决方案问题 1修改后无法连接 SSH解决方案通过控制台直接登录服务器检查 firewalld 规则sudo firewall-cmd --list-all检查 SSH 服务状态sudo systemctl status sshd临时关闭防火墙测试sudo systemctl stop firewalld问题 2SELinux 导致自定义端口无法使用解决方案# 检查 SELinux 日志 sudo ausearch -m avc -ts recent # 临时解决方案不推荐 sudo setenforce 0 # 永久解决方案 sudo semanage port -a -t ssh_port_t -p tcp 你的端口号问题 3云服务器无法连接额外检查云平台安全组规则实例网络 ACL是否绑定弹性公网 IP8. 配置备份与恢复8.1 备份当前防火墙配置# 备份永久配置 sudo cp /etc/firewalld/zones/public.xml ~/firewalld_public_backup.xml # 备份当前运行时配置 sudo firewall-cmd --runtime-to-permanent sudo cp /etc/firewalld/zones/public.xml ~/firewalld_public_runtime_backup.xml8.2 恢复防火墙配置# 从备份恢复 sudo cp ~/firewalld_public_backup.xml /etc/firewalld/zones/public.xml sudo firewall-cmd --reload8.3 批量管理脚本示例#!/bin/bash # 批量管理 SSH 端口脚本 PORTS(22 2222 22222) ACTION$1 # start/stop/restart case $ACTION in start) for port in ${PORTS[]}; do sudo firewall-cmd --add-port${port}/tcp --permanent done sudo firewall-cmd --reload sudo systemctl start sshd ;; stop) for port in ${PORTS[]}; do sudo firewall-cmd --remove-port${port}/tcp --permanent done sudo firewall-cmd --reload sudo systemctl stop sshd ;; restart) sudo systemctl restart sshd ;; *) echo Usage: $0 {start|stop|restart} exit 1 ;; esac