iptables 源码分析 - 内核源码-Chinaunix

【iptables交流贴】iptables执行的流程分析 - 内核源码-Chinaunix

iptables 命令

规则 rules

用于定义 IP 数据包的识别和处理规则,每条 Rule 都包含了 “匹配" 和 “动作" 这 2 个元素。其中,动作包括有:修改或跳转。跳转可以用于处理接受该数据包、拒绝该数据包,也可以跳转到其他 Chain 中继续进行匹配,或者从当前 Chain 中返回到调用者 Chain。

每条 Rule 都由下列 2 个元素组成:

  1. 若干个匹配条件(Xmatch):与 IP 数据包进行匹配,具有以下匹配条件类型:
    1. **Interface(接口,**e.g. eth0、eth1)
    2. Protocol(协议类型,e.g. ICMPTCPUDP
    3. Source IP / Destination IP
    4. Source Port / Destination Port
  2. 一个执行动作(Action):数据包匹配所有条件后所需要执行的动作。具有以下动作类型:
    1. ACCEPT:运行通过。
    2. DROP:直接丢弃。
    3. REJECT:拒绝通过。
    4. SNAT:源地址转换。
    5. DNAT:目标地址转换。
    6. LOG:记录日志信息。
    7. QUEUE:将数据包移交到用户空间。
    8. RETURN:防火墙停止执行当前链中的后续规则,并返回到调用链。
    9. REDIRECT:端口重定向。
    10. iptablMARK:做防火墙标记。

链 chains

链(Chains)的本质是一个有序的 Rules 列表。在复杂的网络环境中,用户可以通过配置 Rules 在 Chain 中的顺序来灵活实现多种效果。

也因为 Chain 中 Rules 的次序非常关键,执行 Rules 时,会按照从上往下的顺序进行。所以越严格的 Rule,就越应该放在越靠前,而 Default Rule 则总是在最后生效。

此外,Netfilter 提供了 5 条内建的 Chains,用户也可以新建自定义的 Chains。

  1. INPUT:发往本机的数据包通过此链,并执行此链上关于 INPUT 的 Rules,例如:DDoS 攻击防御规则。
  2. OUTPUT:从本机发出的数据包通过此链,并执行此链上关于 OUTPUT 的 Rules。
  3. PORWARD:由本机转发的数据包通过此链,并执行此链上关于 PORWARD 的 Rules。例如:作为 IP 路由器。
  4. PREROUTING:在处理 IP 路由规则前(Pre-Routing)通过此链,并执行此链上关于 Pre-Routing 的 Rules。例如:DNAT。
  5. POSTOUTING:在处理 IP 路由规则后(Post-Routing)通过此链,并执行此链上关于 Post-Routing 的 Rules。例如:SNAT。

表 tables

表(Table)是面向应用场景的管理方式,每张表被赋予了不同的应用场景,所以也内含了不同的 Chains 和 Rules。

用户在实际使用 Netfilter 时,往往是通过 Table 作为操作入口,然后对 Chains 和 Rules 进行定义。

Netfilter 内建了以下五张表:

  1. filter 表(默认):提供数据包的过滤功能,例如:用于防火墙规则。
  2. nat :提供了 NAT、NAPT 功能,例如:用于网关路由器。
  3. mangle 表:提供了数据包修改功能,例如:更改 IP Header 的 TOS、DSCP、ECN 位。
  4. raw :用来提前标记报文不需要执行一些流程,例如:不需要建立会话。
Usage: iptables -[ACD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

Commands:
Either long or short options are allowed.
  --append  -A chain    Append to chain
  --check   -C chain