温馨提示×

Linux防火墙如何自定义规则

小樊
33
2025-11-08 20:51:57
栏目: 智能运维

Linux防火墙自定义规则指南(iptables与firewalld)
Linux系统中,iptables(传统工具,适用于所有发行版)和firewalld(现代动态工具,适用于CentOS/RHEL/Fedora等)是两种主流防火墙管理工具,均支持通过自定义规则实现精准的流量控制。以下是具体操作方法:

一、iptables自定义规则

iptables通过“规则链(Chain)”和“规则(Rule)”实现流量过滤,核心命令结构为iptables [-t 表名] 选项 [匹配条件] -j 动作

1. 基础自定义规则示例

  • 允许特定端口访问(如SSH,端口22)
    sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    -A INPUT表示追加到INPUT链,-p tcp指定TCP协议,--dport 22匹配目标端口,-j ACCEPT允许流量)
  • 拒绝特定IP访问(如192.168.1.100)
    sudo iptables -A INPUT -s 192.168.1.100 -j DROP
    -s 192.168.1.100匹配源IP,-j DROP静默丢弃流量)
  • 允许IP段访问端口范围(如192.168.1.0/24访问3000-3100端口)
    sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 3000:3100 -j ACCEPT
    --dport 3000:3100匹配端口范围)
  • 设置默认策略(拒绝所有未明确允许的流量)
    sudo iptables -P INPUT DROP
    -P INPUT DROP将INPUT链默认策略设为DROP,需提前允许必要流量,避免锁死系统)

2. 自定义链管理

当默认链规则过多时,可通过自定义链优化管理:

  • 创建自定义链(如MY_CHAIN)
    sudo iptables -N MY_CHAIN
  • 向自定义链添加规则(如允许10.0.0.0/8访问80端口)
    sudo iptables -A MY_CHAIN -s 10.0.0.0/8 -p tcp --dport 80 -j ACCEPT
  • 将自定义链挂载到默认链(如INPUT链)
    sudo iptables -A INPUT -j MY_CHAIN
    (所有进入INPUT链的流量会先经过MY_CHAIN处理)
  • 删除自定义链(需先清空规则)
    sudo iptables -F MY_CHAIN && sudo iptables -X MY_CHAIN

3. 持久化规则

iptables规则默认重启后失效,需通过以下命令保存:

  • Debian/Ubuntu:sudo iptables-save > /etc/iptables/rules.v4
  • CentOS/RHEL:sudo service iptables save
  • 或使用iptables-persistent工具(sudo apt install iptables-persistent)自动保存。

二、firewalld自定义规则

firewalld采用“区域(Zone)”和“服务(Service)”模型,支持动态更新,无需重启即可生效。

1. 基础自定义规则示例

  • 开放特定端口(如8080/tcp)
    sudo firewall-cmd --permanent --add-port=8080/tcp
    --permanent表示永久生效,需配合--reload应用)
  • 允许特定IP访问(如192.168.1.100访问所有端口)
    sudo firewall-cmd --permanent --add-source=192.168.1.100
  • 拒绝特定服务(如FTP)
    sudo firewall-cmd --permanent --remove-service=ftp

2. 富规则(Rich Rules)

富规则支持更复杂的匹配条件(如IP段、端口范围、协议),语法为:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" [条件] [动作]'

  • 允许IP段访问端口范围
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3000-3100" accept'
  • 拒绝特定IP访问特定端口
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" reject'
  • 允许ICMP(ping)请求
    sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" icmp-type name="echo-request" accept'

3. 自定义服务

若需开放非标准服务(如自定义端口12345),可创建自定义服务文件:

  • 创建文件/etc/firewalld/services/myservice.xml,内容如下:
    <?xml version="1.0" encoding="utf-8"?>
    <service>
      <short>MyCustomService</short>
      <description>My custom service on port 12345</description>
      <port protocol="tcp" port="12345"/>
    </service>
    
  • 重新加载firewalld使服务生效:
    sudo firewall-cmd --reload
  • 开放该服务:
    sudo firewall-cmd --permanent --add-service=myservice

4. 持久化与重载

  • 所有--permanent规则需通过sudo firewall-cmd --reload应用;
  • 临时规则(不加--permanent)立即生效,但重启后失效。

三、注意事项

  1. 谨慎操作默认策略:避免将INPUT链默认策略设为DROP后,未允许SSH等必要流量,导致无法远程登录。
  2. 测试规则有效性:修改规则前,建议在本地终端开启新会话,防止误操作锁死系统。
  3. 备份现有规则:修改前通过sudo iptables-save > ~/iptables_backup.txt(iptables)或sudo cp /etc/firewalld/zones/(firewalld)备份,便于恢复。
  4. 优先级问题:iptables规则按添加顺序匹配,先匹配的规则优先;firewalld富规则优先级高于普通规则。

通过以上方法,可根据实际需求灵活定制Linux防火墙规则,实现精准的流量管控。

0