Linux防火墙如何定制个性化策略
导读:Linux防火墙个性化策略定制指南 一、方案选型与总体思路 面向生产环境,优先使用动态管理工具 firewalld(基于 Netfilter,支持运行时调整、区域隔离与富规则),或直接使用 iptables/nftables 获得更底层的...
Linux防火墙个性化策略定制指南
一、方案选型与总体思路
- 面向生产环境,优先使用动态管理工具 firewalld(基于 Netfilter,支持运行时调整、区域隔离与富规则),或直接使用 iptables/nftables 获得更底层的控制力。
- 关键概念:
- 区域 Zone:按信任级别划分(如 public、trusted、work、dmz),每个网卡仅能绑定一个区域,一个区域可绑定多个网卡;可按源地址将流量划入不同区域实现精细化策略。
- 表与链:iptables 的 filter/nat/mangle 表与 INPUT/OUTPUT/FORWARD 链;规则按顺序匹配,命中即停止,默认策略与规则顺序至关重要。
- 富规则 Rich Rule:在 firewalld 中表达复杂匹配(源/目的、端口、协议、日志、限速、动作等)的推荐方式。
二、firewalld快速定制范式
- 基础结构与区域绑定
- 查看与设置默认区域、绑定网卡/源地址到区域,按“最小权限”只开放必要服务:
firewall-cmd --get-default-zone firewall-cmd --set-default-zone=public --permanent firewall-cmd --zone=external --change-interface=eth1 --permanent firewall-cmd --permanent --add-source=203.0.113.10/32 --zone=trusted firewall-cmd --reload
- 查看与设置默认区域、绑定网卡/源地址到区域,按“最小权限”只开放必要服务:
- 服务与端口
- 放行常用服务与端口,区分临时与永久生效:
firewall-cmd --add-service=ssh firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload
- 放行常用服务与端口,区分临时与永久生效:
- 富规则常见用法
- 仅允许指定网段访问 MySQL,并对 SSH 做频率限制:
firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="3306" protocol="tcp" accept' firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" limit value="5/m" accept' firewall-cmd --reload
- 仅允许指定网段访问 MySQL,并对 SSH 做频率限制:
- NAT 与端口转发
- 出口 SNAT(IP 伪装)与入站端口转发:
firewall-cmd --permanent --add-masquerade firewall-cmd --permanent \ --add-rich-rule='rule family=ipv4 destination port port=80 protocol=tcp redirect port=8080' firewall-cmd --reload
- 出口 SNAT(IP 伪装)与入站端口转发:
- 日志与排错
- 启用拒绝日志、查看拒绝记录与实时日志:
firewall-cmd --set-log-denied=all journalctl -u firewalld -f firewall-cmd --list-all --zone=public
- 启用拒绝日志、查看拒绝记录与实时日志:
- 性能与后端
- 在 /etc/firewalld/firewalld.conf 中启用 firewall_backend=nftables,并使用批量操作提升性能(individual_calls=no)。
三、iptables与nftables底层定制范式
- 规则顺序与默认策略
- 先放行回环、已建立连接,再按需开放端口,最后设置默认丢弃;避免误锁:
iptables -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- 先放行回环、已建立连接,再按需开放端口,最后设置默认丢弃;避免误锁:
- 仅放行特定来源访问某端口
- “先封后放”更易维护:
iptables -I INPUT -p tcp --dport 9889 -j DROP iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 9889 -j ACCEPT iptables -I INPUT -s 203.0.113.10/32 -p tcp --dport 9889 -j ACCEPT
- “先封后放”更易维护:
- 自定义链提升可维护性
- 将同类规则归集到自定义链,便于集中调整:
iptables -N SSH_FILTER iptables -A SSH_FILTER -s 192.168.1.100 -j ACCEPT iptables -A SSH_FILTER -j DROP iptables -A INPUT -p tcp --dport 22 -j SSH_FILTER
- 将同类规则归集到自定义链,便于集中调整:
- 持久化与回滚
- 保存与恢复(不同发行版路径不同):
# Debian/Ubuntu sudo apt install iptables-persistent sudo netfilter-persistent save # CentOS/RHEL service iptables save # 或 iptables-save > /etc/sysconfig/iptables
- 保存与恢复(不同发行版路径不同):
- nftables 方向
- 思路与 iptables 一致,语法不同;适合新项目或需要更强表达力/性能的场景。
四、常见场景模板与命令清单
| 场景 | firewalld 命令 | iptables 命令 |
|---|---|---|
| 仅公司网段访问 22/TCP(其余来源拒绝) | 将默认区域设为 public 且不放开 ssh;把公司网段加入 trusted;或移除 ssh 服务并用富规则仅放行公司网段 | 先 DROP 22,再对 22 插入公司网段 ACCEPT 规则 |
| 端口转发:80→8080 | 开启 masquerade;用富规则 redirect 80→8080 | 在 nat/PREROUTING 做 DNAT,配合 filter/FORWARD 放行 |
| 限制 SSH 暴力连接 | 富规则:limit value="5/m" accept |
使用 recent 模块或基于日志/外部工具联动限速 |
| 记录被拒绝流量 | --set-log-denied=all 并查看 journalctl -u firewalld |
在 INPUT 链对 DROP/REJECT 前插入 LOG 目标 |
- 参考命令示例(firewalld 公司网段放行 SSH):
firewall-cmd --permanent --remove-service=ssh firewall-cmd --permanent \ --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="22" protocol="tcp" accept' firewall-cmd --reload - 参考命令示例(iptables 仅放行特定来源访问某端口):
iptables -I INPUT -p tcp --dport 9889 -j DROP iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 9889 -j ACCEPT iptables -I INPUT -s 203.0.113.10/32 -p tcp --dport 9889 -j ACCEPT - 参考命令示例(端口转发 80→8080):
firewall-cmd --permanent --add-masquerade firewall-cmd --permanent \ --add-rich-rule='rule family=ipv4 destination port port=80 protocol=tcp redirect port=8080' firewall-cmd --reload
五、安全与运维最佳实践
- 始终遵循最小权限原则:默认拒绝入站,按需开放;按业务划分 Zone,按源地址精细化授权。
- 变更采用“试运行 + 持久化 + 回滚预案”:firewalld 区分运行时与永久规则,变更后用
--reload生效;iptables 变更前先备份并准备回滚脚本。 - 保持连接不断:优先使用
firewall-cmd --reload而非完全重载;必要时才用--complete-reload(会断开现有连接)。 - 开启拒绝日志并集中审计:
--set-log-denied=all,配合journalctl -u firewalld与集中日志系统。 - 性能与可维护性:在 firewalld.conf 启用 nftables 后端与批量操作;iptables 使用自定义链分类管理,减少重复与漏配。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux防火墙如何定制个性化策略
本文地址: https://pptw.com/jishu/779854.html
