netfilter&iptables探讨(3)——iptables的功能与实现

《netfilter&iptables探讨(1)——基本原理》中,我们介绍了iptables的基本原理以及它和netfilter的关系。本文将更具体的介绍iptables支持的主要功能和实现方式。

问题

  1. iptables中的表有几类?有什么区别?分别用于什么场景?
  2. 同一个表会在不同的链上被匹配,那么不同链上匹配的表规则是一样的吗?4表到底是4个表还是4类表?
  3. 表中的规则支持哪些匹配模式和匹配后的操作?
  4. 在同一个链/hook点上的多个表是如何匹配的?匹配的顺序是确定的吗?
  5. 表中的多条规则是如何匹配的?

iptables

在之前的文章中我们介绍了iptables只是netfilter机制的一个应用。但与其他netfilter应用不同的是,iptables是与netfilter同步设计的,它也是netfilter最重要、应用最广泛的一个应用。事实上,在内核中,iptables的部分实现是直接集成到协议栈实现中的,只要打开CONFIG_NETFILTER内核选项,协议栈的核心数据结构netns_ipv4/netns_ipv6中就会包括iptables的表结构iptable_filter等。因此,也可以把iptables当成是广义的netfilter的一部分。

iptables的功能逻辑很简单,维护了4个规则表,每个规则表都在若干个netfilter的hook点上注册了匹配函数。在这些匹配函数中,会让当前报文逐个匹配规则表中的规则,如果匹配上了规则中指定的条件,则按规则指定的处理方法来处理报文。

iptables的链

iptables规则按两个维度组织:链(chain)和表(table)。每条规则都要属于一个特定的链和一个特定的表。链决定了规则在协议栈的什么位置被匹配,或者说是哪些报文会被规则匹配。表决定了规则的用途和支持的操作类型。因此,规则所属的链、表和规则自身的匹配条件、匹配操作,共同定义了一条规则的作用。在某次匹配逻辑中访问的具体的规则列表,是由链和表都相同的规则组成的,和iptables中的表这个概念不是同一个东西。

iptables中的链有两种:内置的(built-in)和用户自定义的(user-defined)。内置的链有5个,分别是PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。结合之前对netfilter的介绍,我们知道这5个链其实就是在netfilter的5个hook点上会去匹配的规则。iptables规则的匹配入口实际上也只有这5个hook点/链,用户自定义的链只能由内置链上的规则匹配后跳转匹配,也就是一个报文匹配了内置链上的一个规则后,这个规则让报文再去匹配某个自定义链上的规则。如果自定义链上的规则未被匹配,会返回上一级链的规则表继续匹配。

iptables的表

iptables支持了4种规则表,分别是raw、mangle、nat、filter。每种规则被设计用来支持不同的网络功能,因此支持匹配的hook点位置也不同。每种规则都有自己的hook处理函数,因此当同一个hook点(链)上有多类规则表需要匹配时,会根据hook函数的优先级来决定表的匹配顺序,优先级取值越小的hook函数越早被执行。各个表的情况如下:

用途优先级
raw在其他表规则处理前匹配,可以对最原始(raw)的报文进行处理。一般用来处理一些不希望被其他规则(例如nat/conntrack)处理的报文。

PREROUTING

OUTPUT

-300
mangle用于对报文做一些首部修改或标记。例如可以修改特定报文的TTL等IP首部字段。或者对报文进行标记,这个标记不改变报文内容,但是在内核数据结构中做了记录,可以在其他表规则或内核其他处理逻辑中使用。

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

-150
nat用于NAT网络地址转换。

PREROUTING

INPUT

OUTPUT

POSTROUTING

-100(DST)

 100(SRC)

filter默认表。一般用于过滤特定的报文。

INPUT

FORWARD

OUTPUT

0

再借用一下之前的图:

可以看到,每个链上会匹配的规则表类型是不同的,每种表只会在部分链上被匹配。链上有多种规则表时,匹配的顺序为raw=>mangle=>nat(DST)=>filter=>nat(SRC)。

nat的逻辑比较复杂,不同方向的优先级是不一样的。每个hook点的处理逻辑也分为两部分,实现在两个hookfn中。整个nat有8个hookfn。nat规则的匹配还和conntrack(连接追踪)有紧密的联系,只有每个连接的首包才会匹配nat规则,其他包都会匹配conntrack表。nat相关的具体实现不在这里展开,以后再专门分析。

同一种表在不同链上匹配的规则是不同的,例如一条filter表规则如果指定了OUTPUT链,那么在匹配INPUT链的filter表时是不会匹配到这条规则的。

同一个表中的规则是按照顺序依次匹配的,添加规则时可以指定规则在表中的顺序。

iptables规则匹配模式

iptables规则中可以采用多种报文特征和协议字段来匹配报文,包括:

  • -s:源ip、源ip段。例如:-s 192.168.122.122;-s 192.168.0.0/16;! -s 192.168.1.1
  • -d:目的ip、目的ip段
  • -p:协议类型。例如:-p tcp;-p icmp
  • -i:报文输入网卡。例如:-i eth0
  • -o:报文输出网卡:例如:-o eth0

除了上述的基本匹配条件外,iptables还可以通过扩展模块来支持更多的匹配条件。使用这些扩展匹配条件时,需要首先用-m指定所属扩展模块的名称。部分常用扩展条件:

  • --sport:源端口(段),属于tcp或udp模块。例如:-m tcp --sport 22;-m udp --sport 100:200。如果规则已经用-p指定了协议类型,可以忽略与-p相同的-m参数。
  • --dport:目的端口(段)。如果需要指定多个不连续端口,需要multiport模块。例如:-p tcp -m multiport --dport 21,23,25
  • --tcp-flags:tcp标志位,属于tcp模块。例如:-p tcp --tcp-flags ALL SYN,ACK;-p tcp --syn

其他常用的扩展模块还有iprange(用于匹配ip地址段)、string(用于匹配报文内容字符串)、time(匹配时间)、connlimit(限制并发连接数)、limit(限制报文数)等。这些扩展模块都是在内核中实现的,使用时需要在内核中加载对应的内核模块。

除了在各个表中配置的规则外,每个链还会有一个兜底的默认策略,即报文没有匹配任何规则时,应该接收(ACCEPT)还是丢弃(DROP)。

一条规则中可以包含多个匹配条件,条件间默认是“与”的关系,即所有条件都满足时规则才被匹配。

iptables规则处理动作

如果报文匹配了一条iptables规则,就会被按照这条规则指定的动作处理。与规则匹配模式一样,规则支持的处理动作也分为基本动作和扩展动作,扩展动作也需要依赖扩展模块,但不需要指定模块名。

常用的报文处理动作包括:

  • ACCEPT:报文被接收,可以被协议栈继续处理。被ACCEPT的报文不再匹配当前规则表的其他规则,但还要继续匹配当前链上的其他表中的规则。
  • DROP:报文被丢弃,不再被协议栈继续处理
  • QUEUE:将报文加入队列交给用户态处理REJECT:报文被拒绝。拒绝是指不但将报文丢弃,还会回应一个icmp报文给发送端,通知目标不可访问。可以通过--reject-with选项指定回应的icmp报文类型,例如--reject-with icmp-host-unreachable,默认类型为icmp-port-unreachable。只在INPUT/FORWARD/OUTPUT链上有效。
  • RETURN:停止匹配当前链的规则,返回上一级链继续匹配下一条规则。如果当前链是用户自定义链,则返回到调用这个链的上一级链;如果当前链已经是内置链,则直接匹配链的兜底策略。RETURN也是自定义链的兜底策略,也就是说如果自定义链中的规则没能匹配报文,会回到上级链的规则表中继续匹配。
  • LOG:将报文信息记录到系统日志
  • REDIRECT:将报文转发给本机,具体操作是把报文的目的ip改成本机的IP。可以通过--to-ports修改目的端口,因此这个动作也经常用来做本地端口映射。这个动作只在nat表的PREROUTING/OUTPUT链规则上有效。
  • DNAT:目的地址转换,只在nat表的PREROUTING/OUTPUT链规则上有效。
  • SNAT:源地址转换,只在nat表的POSTROUTING链上有效
  • MASQUERADE:动态源地址转换,即根据网络配置自动选择源地址IP。只在nat表的POSTROUTING链上有效
  • NOTRACK:报文不被连接追踪(connection track)处理。只在raw表有效。
  • MARK:对报文打标,只在mangle表中有效。
  • 自定义链名:跳转到自定义链中继续匹配规则

iptables支持的扩展动作还有很多,可以参考iptables(8) - Linux man page的Target Extensions部分。

iptables命令基本用法

这里引用《8张图带你了解iptables的前世今生》中的一张图来说明iptables命令的基本参数,略作了修改。

 上图中列出了主要的iptables规则配置命令参数。其中使用-t参数指定规则表,-j指定规则动作,用前面介绍的-s/-d等参数来指定规则匹配模式。这里再介绍一下规则表操作命令相关参数。

  • -A:增加一条规则在表尾
  • -D:删除一条规则,可以用规则序号或规则具体配置来指定删除的规则
  • -I:插入一条规则在指定序号位置。默认插入在表头。
  • -R:替换指定序号位置的规则
  • -L:打印输出指定链上的所有规则,如果不指定链,则输出这个表在所有链的规则
  • -F:清空链上的所有规则,如果不指定链,则清空这个表在所有链的规则
  • -P:配置指定链的默认兜底策略,只有内置链可以配置

小结

本文介绍了iptables的基本概念、功能和用法。最后来看一下之前的几个问题:

  1. iptables中的表有4种,被设计用于实现不同的网络功能。因此每种表能被匹配的链是不同的,因为只有在特定链位置上才能实现这些功能。也因此不同的表上能执行的规则动作是不同的,一些动作只能在特定的表/链上才能使用。
  2. 同一类表在不同链上的规则是不同的,4表从内核中的实现数据结构来看确实是一个连续的数组,但从逻辑上看每个表在不同链上的规则是不同的,在特定链上只会匹配规则表数组中属于这个链的一段。因此可以说4表是4类表,而不是4个表。
  3. iptables规则支持的报文匹配模式有很多种,且可以扩展。支持的规则动作也很多,不同的表上可以执行的动作不同。
  4. 同一个链上的多个表是按表的优先级来依次匹配的,顺序基本上是raw=>mangle=>nat=>filter。
  5. 表中的规则是有顺序和序号的,匹配到特定链上的特定表时,会依次顺序匹配其中的规则。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值