定义
iptables 是一个用于配置 Linux 内核中的网络包过滤规则的用户空间工具。它是 Linux 操作系统中实现防火墙功能的主要工具之一,基于 Netfilter 框架(Linux包过滤组件)工作。通过 iptables,系统管理员可以定义规则来控制网络流量的进出。
包过滤防火墙的原理:检测数据包的 IP 五元组字段信息,然后根据规则执行允许/拒绝/丢弃等动作。
主要功能
- 包过滤:iptables 可以根据源 IP 地址、目的 IP 地址、端口号、协议类型等条件过滤网络数据包。
- 网络地址转换(NAT):iptables 支持网络地址转换功能,包括源地址转换(SNAT)和目的地址转换(DNAT),用于实现网络地址的重写。
- 状态检测:iptables 支持状态检测(Stateful Inspection),可以根据连接状态(如新建连接、已建立连接等)来过滤数据包。
- 日志记录:iptables 可以记录匹配特定规则的数据包日志,便于系统管理员进行网络监控和故障排查。
基本概念
表(Table)链(Chain)
iptables 中有多个表,表就像是容器,每个表包含多个链,链是规则的集合。常见的表和链包括:
1、filter:默认表,用于数据包过滤:
- INPUT:处理进入本地系统(iptalbes的当前计算机)的数据包。
- OUTPUT:处理从本地系统发出的数据包。
- FORWARD:处理转发的数据包。
2、nat:用于网络地址(源/目的)转换:
- OUTPUT
- PREROUTING:在数据包路由前处理。
- POSTROUTING:在数据包路由后处理。
3、mangle:用于修改数据包(包重构),如修改 ttl 值等。
- PREROUTING
- POSTROUTING
- INPUT
- OUTPUT
- FORWARD
4、raw:用于配置数据包的处理方式(数据跟踪),符合raw表所对应规则的数据包将会跳过一些检查,用以提高效率。
- PREROUTING
- OUTPUT
规则(Rule)
每个链包含多个规则,每条规则定义了匹配条件和相应的动作。常见的动作包括:
- ACCEPT:允许数据包通过。
- DROP:丢弃数据包。
- REJECT:拒绝数据包并发送 ICMP 错误消息。
- LOG:记录数据包日志。
Filter 表详解
Filter 表是最常用的规则表,下面参考它的数据处理流程图:
命令操作
基本语法:iptables (选项) (参数)
选项集合
-t, --table table 对指定的表 table 进行操作。如果不指定此选项,默认的是 filter 表。
通用匹配:源地址目标地址的匹配:
-p:指定要匹配的数据包协议类型;
-s, --source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
-i, --in-interface [!] <网络接口name> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
-o, --out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。
查看管理命令:
-L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。
规则管理命令:
-A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
-I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
-R num:Replays替换/修改第几条规则
链管理命令(这都是立即生效的):
-P, --policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的。
-F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-N, --new-chain chain 用指定的名字创建一个新的链。
-X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响。
-Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。
-j, --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。
-h:显示帮助信息;
参数集合
参数 | 作用 |
---|---|
-P | 设置默认策略:iptables -P INPUT (DROP |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I | num 在规则链的头部加入新规则 |
-D | num 删除某一条规则 |
-s | 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外 |
-d | 匹配目标地址 |
-i | 网卡名称 匹配从这块网卡流入的数据 |
-o | 网卡名称 匹配从这块网卡流出的数据 |
-p | 匹配协议,如tcp,udp,icmp |
–dport num | 匹配目标端口号 |
–sport num | 匹配来源端口号 |
配置示例
没有指定表(-t [table]),默认就是 filter 表。
配置白名单:
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口
开启相应端口服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口,因为web对外都是这个端口
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来
iptables 和 firewalld 的一点区别
设计理念
iptables:
- iptables 是一个基于命令行的工具,直接与 Netfilter 框架交互。
- 规则是静态的,需要手动添加、删除和修改。
- 配置文件通常是脚本文件,规则的更改需要重新加载整个规则集。
firewalld:
firewalld 是一个动态防火墙管理工具,提供了更高级别的抽象和更灵活的配置方式。使用 D-Bus 接口进行配置,支持动态更改规则而无需重新加载整个规则集。
提供了区域(zone)和服务(service)的概念,简化了复杂网络环境下的防火墙配置。
区域和服务
iptables:
- 没有区域和服务的概念,所有规则都是全局的。
- 需要手动管理和分类规则,可能会导致配置复杂性增加。
firewalld:
- 引入了区域(zone)的概念,每个区域可以有不同的规则集,适用于不同的网络环境(如家庭、工作、公共等)。
- 支持服务(service)的概念,可以通过服务名称来管理规则,而不是直接使用端口号和协议。
- 提供了预定义的区域和服务,简化了防火墙配置。