Linux防火墙规则如何写?_Linuxiptables和firewalld配置实例

Linux防火墙规则如何写?_Linuxiptables和firewalld配置实例
最新回答
仲夏柠叶香

2020-10-28 20:06:53

Linux防火墙规则的编写核心在于明确允许和拒绝的流量,推荐使用firewalld工具,其支持动态修改、区域管理和自动持久化,更适合现代Linux环境。以下是iptables和firewalld的配置实例及关键注意事项

一、使用iptables编写规则

iptables通过表、链和规则管理流量,需按顺序操作并注意规则优先级。

  • 设置默认策略(Deny All原则)确保未明确允许的流量被拒绝,但需先允许关键服务(如SSH)或本地操作,避免锁死。

    # 允许已建立的连接和相关流量iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT# 默认拒绝所有传入和转发流量iptables -P INPUT DROPiptables -P FORWARD DROP# 默认允许所有传出流量(根据需求修改)iptables -P OUTPUT ACCEPT
  • 允许特定服务/端口

    SSH(端口22):iptables -A INPUT -p tcp --dport 22 -j ACCEPT

    HTTP(端口80)和HTTPS(端口443):iptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPT

    Loopback接口(本机通信):iptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT

    阻止特定IP地址:iptables -A INPUT -s 192.168.1.100 -j DROP

  • 保存规则iptables规则默认临时生效,需手动保存:

    Debian/Ubuntu:sudo netfilter-persistent save# 或sudo iptables-save > /etc/iptables/rules.v4

    CentOS/RHEL:sudo service iptables save# 或sudo iptables-save > /etc/sysconfig/iptables

二、使用firewalld编写规则

firewalld通过区域(zones)管理流量,支持动态修改和自动持久化,逻辑更清晰。

  • 查看当前状态和区域

    firewall-cmd --state # 查看防火墙状态firewall-cmd --get-active-zones # 查看活动区域firewall-cmd --zone=public --list-all # 查看public区域的详细规则
  • 允许服务或端口推荐使用服务名(如ssh、http)而非端口号,简化配置:

    允许SSH服务:firewall-cmd --zone=public --add-service=ssh --permanentfirewall-cmd --reload # 重新加载规则

    允许HTTP和HTTPS服务:firewall-cmd --zone=public --add-service=http --permanentfirewall-cmd --zone=public --add-service=https --permanentfirewall-cmd --reload

    允许特定端口(如TCP 8080):firewall-cmd --zone=public --add-port=8080/tcp --permanentfirewall-cmd --reload

  • 阻止特定IP或IP范围使用Rich Rules实现复杂控制:

    firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject' --permanentfirewall-cmd --reload
  • 移除规则将add-替换为remove-即可删除规则:

    firewall-cmd --zone=public --remove-service=ssh --permanentfirewall-cmd --reload
三、firewalld的优势与适用场景
  • 动态修改:无需中断现有连接,适合生产环境。
  • 区域管理:通过public、internal等区域划分信任级别,简化规则逻辑。
  • 自动持久化:减少人为操作失误,规则重启后仍生效。

对比iptables

  • iptables操作线性,规则顺序至关重要,修改需刷新整个规则集,易出错。
  • firewalld通过抽象层管理规则,更适合服务器和桌面系统,尤其是需要频繁修改的场景。
四、常见配置陷阱与解决方案
  1. 锁死服务器

    原因:先设置默认拒绝策略(如iptables -P INPUT DROP),但未允许SSH端口。

    解决:先允许关键服务(如SSH),再设置拒绝策略,或在本地控制台操作。

  2. 规则顺序错误

    原因:iptables按顺序匹配规则,若拒绝规则在前,允许规则可能失效。

    解决:将具体允许规则放在通用拒绝规则之前。

  3. 混淆永久与非永久规则

    原因:firewalld不加--permanent时,规则重启后失效。

    解决:测试时先不加--permanent,确认无误后添加并--reload。

  4. 过度依赖默认配置

    原因:firewalld默认区域(如public)可能开放不必要端口。

    解决:采用“白名单”策略,仅允许业务必需流量,并限制源IP。

五、测试与验证防火墙规则
  1. 分步测试:逐步应用规则,每添加一部分就测试功能,避免一次性部署复杂规则集。

  2. 多客户端测试:从不同网络环境(如办公网络、家庭网络)访问服务,验证规则是否按预期生效。

  3. 使用网络诊断工具

    ping:测试基本连通性。

    telnet/nc:测试特定端口是否开放(如telnet your_server_ip 22)。

    nmap:扫描服务器开放端口(如nmap -sT your_server_ip)。

    ss/netstat:查看服务器本地监听端口和连接状态。

  4. 检查防火墙日志:配置日志记录被拒绝或接受的连接,分析日志调试规则。

  5. 回滚计划:修改前备份旧规则,或准备“紧急放行”脚本(如通过KVM/IPMI登录后清空规则iptables -F)。

总结

  • 优先使用firewalld,其动态管理和区域概念简化配置,适合现代Linux环境。
  • 编写规则时遵循“默认拒绝,明确允许”原则,注意规则顺序和持久化。
  • 通过分步测试、多环境验证和日志分析确保规则有效性,避免生产事故。