利用firewall-cmd实现SSH访问的精细化IP段管控

张开发
2026/4/17 5:07:12 15 分钟阅读

分享文章

利用firewall-cmd实现SSH访问的精细化IP段管控
1. 为什么需要精细化SSH访问控制每次服务器被暴力破解攻击时看着日志里密密麻麻的失败登录尝试我都恨不得把SSH端口直接关掉。但现实是运维团队需要远程管理开发人员偶尔也要排查问题。这时候基于IP段的精细化访问控制就成了救命稻草。传统的做法是直接开放整个SSH端口或者简单限制几个固定IP。前者等于把大门敞开后者在人员流动或出差时就变得非常麻烦。去年我们公司就发生过因为某位运维同事居家办公临时添加了他的家庭IP结果忘记删除导致的安全隐患。firewall-cmd的rich-rule功能让我找到了平衡点。比如可以把北京办公室的IP段203.0.113.0/24、上海研发中心的IP段198.51.100.0/22分别加入白名单。这样既不用为每个员工单独配置又能避免开放整个SSH端口带来的风险。2. 基础环境准备与配置检查2.1 确认firewalld运行状态在开始之前先确保你的系统已经安装并运行着firewalld。我遇到过不少新手直接照着教程敲命令最后发现服务根本没启动的尴尬情况。用这个命令检查systemctl status firewalld如果看到active (running)就说明服务正常。如果没安装在CentOS/RHEL上可以这样安装yum install firewalld -y systemctl enable --now firewalld2.2 备份当前防火墙规则修改防火墙规则前一定要备份这是我用血泪教训换来的经验。有次误操作导致自己也被锁在服务器外面最后只能去机房接显示器操作。备份命令很简单firewall-cmd --list-all firewall_backup_$(date %Y%m%d).txt这个命令会把当前所有规则保存到带日期的文件里。建议同时备份默认区域配置文件cp /etc/firewalld/zones/public.xml /etc/firewalld/zones/public.xml.bak3. 三种IP限制模式实战3.1 单IP授权模式适合给特定管理员或固定设备使用。比如只允许运维主管的办公电脑IP192.168.1.100访问# 先移除默认开放的SSH服务 firewall-cmd --permanent --remove-servicessh # 添加精细规则 firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.1.100 port protocoltcp port22 accept # 重新加载配置 firewall-cmd --reload验证规则是否生效firewall-cmd --list-rich-rules这个模式最大的问题是容错性差。如果IP发生变化比如从WiFi切换到有线网络就会立即失去连接。我建议至少配置两个IP比如办公室固定IP笔记本电脑当前IP。3.2 连续IP范围授权当需要授权给一个小型团队且他们的IP地址连续时特别有用。比如允许测试团队IP从192.168.1.50到192.168.1.60访问firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.1.50-192.168.1.60 port protocoltcp port22 accept这种写法的好处是不需要计算子网掩码直接指定起止IP即可。但要注意范围不要太大否则就失去了精细化管理的意义。3.3 CIDR网段授权这是企业环境中最常用的方式。比如允许整个技术部子网192.168.2.0/24访问firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.2.0/24 port protocoltcp port22 acceptCIDR notation的妙处在于可以灵活控制范围大小。/24表示前24位固定即255.255.255.0/16表示前16位固定255.255.0.0。我们公司就是按部门划分网段的技术部用192.168.2.x市场部用192.168.3.x这样配置规则时特别清晰。4. 动态IP环境解决方案4.1 结合DDNS的动态规则更新对于在家办公的员工IP可能经常变化。这时候可以结合DDNS服务比如花生壳和脚本自动化更新。假设员工使用hostname: staff001.ddns.net#!/bin/bash NEW_IP$(dig short staff001.ddns.net) OLD_RULE$(firewall-cmd --list-rich-rules | grep staff001) # 删除旧规则 if [ -n $OLD_RULE ]; then firewall-cmd --permanent --remove-rich-rule$OLD_RULE fi # 添加新规则 firewall-cmd --permanent --add-rich-rulerule familyipv4 source address$NEW_IP port protocoltcp port22 accept firewall-cmd --reload把这个脚本加入cron每小时执行一次即可。我在团队内部推广这个方法后VPN使用量直接下降了70%因为大家发现SSH访问已经足够安全便捷。4.2 临时访问令牌机制对于第三方合作人员临时访问的情况可以设计一个临时令牌系统。基本思路是生成一个6小时有效期的规则到期自动删除通过邮件或IM发送给请求者实现脚本示例#!/bin/bash REQUESTER_IP203.0.113.45 EXPIRY$(date -d 6 hours %s) # 添加临时规则 firewall-cmd --permanent --add-rich-rulerule familyipv4 source address$REQUESTER_IP port protocoltcp port22 accept # 创建定时删除任务 echo firewall-cmd --permanent --remove-rich-rulerule family\ipv4\ source address\$REQUESTER_IP\ port protocol\tcp\ port\22\ accept | at $(date -d 6 hours %H:%M)5. 高级管理与故障排查5.1 规则优先级管理当规则越来越多时可能会出现冲突。比如既想屏蔽某个IP段又想允许其中的某个特定IP。这时候规则的顺序就很重要# 先拒绝整个网段 firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.4.0/24 reject # 再允许特定IP这条规则优先级更高 firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.4.100 accept可以通过--list-rich-rules查看当前规则顺序。如果发现规则顺序不对可以先全部删除再按正确顺序添加。5.2 常见问题排查问题1规则添加了但不生效检查是否加了--permanent参数但忘记--reload确认默认区域firewall-cmd --get-default-zone是否正确查看完整日志journalctl -u firewalld -f问题2把自己锁在外面提前配置好带外管理iDRAC/iLO保留一个备用管理端口比如2222给应急使用设置cronjob每5分钟检查一次主规则如果被删就自动恢复问题3规则太多导致性能下降尽量合并CIDR块把多个/24合并为/23考虑改用zone来管理不同来源定期清理过期规则6. 企业级最佳实践在管理超过200台服务器的金融行业客户项目中我们总结出这套流程分级管理将服务器分为核心、重要、普通三个级别核心级只允许跳板机IP访问时间维度办公时间9:00-18:00开放更大范围的IP非工作时间限制为运维办公室IP审批流程所有规则变更需要通过工单系统审批并自动同步到CMDB自动同步使用Ansible定期同步所有服务器的防火墙规则确保一致性审计日志所有firewall-cmd操作记录到SIEM系统与员工账号关联实现时间维度控制的示例# 工作日9:00-18:00允许大网段访问 firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.0.0/16 port protocoltcp port22 accept --time9:00-18:00 --weekdayMon,Tue,Wed,Thu,Fri # 其他时间只允许运维网段 firewall-cmd --permanent --add-rich-rulerule familyipv4 source address10.1.1.0/24 port protocoltcp port22 accept这套方案实施后客户服务器的SSH暴力破解尝试下降了98%同时运维效率提高了40%因为再也不用处理各种临时访问请求了。

更多文章