理解 iptables 的表与链
理解 iptables
的表与链
iptables
是 Linux 中用于配置防火墙规则的工具,其核心功能是通过表和链来处理数据包。以下是关于 iptables
表与链的详细说明,以及如何利用这些规则实现特定的网络行为。
1. 四种表及其优先级
iptables
的表按照优先级从高到低依次为:
- raw 表:优先级最高,主要用于处理连接跟踪(如标记某些数据包不被连接跟踪)。
- mangle 表:用于修改数据包的内容或元数据(如 TTL、TOS 等)。
- nat 表:用于网络地址转换(如 SNAT 和 DNAT)。
- filter 表:用于过滤数据包(如允许或拒绝流量)。
2. 各表中的链
filter 表
主要负责数据包的过滤功能,包含以下链:
- INPUT 链:过滤所有目标地址是本机的数据包。
- FORWARD 链:过滤所有经过本机转发的数据包。
- OUTPUT 链:过滤所有由本机产生的数据包。
nat 表
主要负责网络地址转换,包含以下链:
- PREROUTING 链:在路由决策之前,改变数据包的目标地址(DNAT)。
- POSTROUTING 链:在路由决策之后,改变数据包的源地址(SNAT)。
- OUTPUT 链:本地产生的数据包,在路由决策之前,可以改变目标地址。
mangle 表
主要用于修改数据包的内容或元数据,包含以下链:
- PREROUTING 链:在数据包进入时修改。
- INPUT 链:在数据包到达本机时修改。
- FORWARD 链:在数据包转发时修改。
- OUTPUT 链:在本地产生数据包时修改。
- POSTROUTING 链:在数据包离开本机时修改。
raw 表
主要用于标记数据包是否需要连接跟踪,包含以下链:
- PREROUTING 链:在数据包进入时处理。
- OUTPUT 链:在本地产生数据包时处理。
3. 数据包处理流程
以下是数据包经过 iptables
的完整处理流程:
-
数据包进入时:
- 首先进入 mangle 表的 PREROUTING 链,可以在此修改数据包头内容。
- 接着进入 nat 表的 PREROUTING 链,可以在此进行 DNAT(目标地址转换)。
-
路由判断:
- 根据路由表判断数据包是发往本机还是需要转发。
-
如果是发往本机:
- 进入 filter 表的 INPUT 链,根据规则过滤限制进入本机的数据包。
- 数据包进入本机后,可能会触发本地应用程序的响应。
- 本地生成的响应数据包进入 filter 表的 OUTPUT 链,根据规则过滤限制发送出去的数据包。
-
如果是转发:
- 进入 filter 表的 FORWARD 链,根据规则过滤限制转发的数据包。
-
数据包离开时:
- 最后进入 mangle 表的 POSTROUTING 链,可以在此修改数据包内容。
- 接着进入 nat 表的 POSTROUTING 链,可以在此进行 SNAT(源地址转换)。
4. 示例规则解析
以下两条规则展示了如何使用 iptables
实现“拒绝所有端口连接,但允许 SSH(22 章口)连接”的功能:
规则 1:拒绝所有端口连接
iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -j DROP
-t filter
:指定操作的是filter
表。-A INPUT
:将规则追加到INPUT
链。-s 0.0.0.0/0.0.0.0
:匹配来自任何源地址的数据包。-d X.X.X.X
:匹配目标地址为X.X.X.X
的数据包。-j DROP
:丢弃匹配的数据包。
规则 2:允许 SSH(22 端口)连接
iptables -I INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -p tcp --dport 22 -j ACCEPT
-I INPUT
:将规则插入到INPUT
链的最前面(优先级高于之前的规则)。-p tcp
:匹配 TCP 协议的数据包。--dport 22
:匹配目标端口为 22 的数据包。-j ACCEPT
:接受匹配的数据包。
5. 规则执行顺序的重要性
iptables
的规则是按顺序匹配的,因此规则的插入顺序非常重要。例如:
- 如果先添加了
DROP
规则,则所有数据包都会被丢弃,后续的ACCEPT
规则将不会生效。 - 因此,通常会优先插入允许特定流量的规则(如
ACCEPT
),然后再添加通用的拒绝规则(如DROP
)。
6. 总结
通过理解 iptables
的表与链,我们可以灵活地配置防火墙规则,从而实现各种网络需求。上述示例展示了如何通过 filter
表的 INPUT
链实现“拒绝所有端口连接,但允许 SSH(22 端口)连接”的功能。这种规则在服务器安全管理中非常常见,能够有效保护系统免受未经授权的访问。