表与链

遍历表和链

数据包是以什么顺序、如何遍历不同的链和表的。一些组件是iptables 与内核共用的,比如,数据包路由的判断。数据包为什么被路由,一个好的例子是 DNAT 和 SNAT,不要忘了 TOS 的作用。

当一个报文进入防火墙时候,首先触发硬件,接着被传递给内核中的合适设备。在这个报文到最终目的之前,它会在内核中会经历一系列步骤,

目的为本机的报文(就是我们自己的机器)

step(步骤)table(表)chain(链)comment(注释)
1在线路上
2到了接口上(例如 eth0)
3rawPREROUTING这个链在连接跟踪之前处理报文,它能够设置一条连接不被连接跟踪处理。
4这儿是连接跟踪处理的点
5manglePREROUTING这个链主要用来修改报文,例如修改TOS等等。
6natPREROUTING这个链主要用来处理 DNAT,我们应该避免在这条链里面做过滤,因为可能有一些报文会漏掉。
7路由决定,例如决定报文是上本机还是转发或者其他地方。
8mangleINPUT到了这点,mangle 表的 INPUT 链被使用,在把这个报文实际送给本机前,路由之后,我们需要再次修改报文
9filterINPUT在这儿我们对所有送往本级的报文进行过滤,要注意所有收到的并且目的地址为本机的报文都会经过这个链,而不管哪个接口进来的或者它往哪儿去。
10本地进程或者应用程序,例如服务器或者客户端程序

现在数据包是由 INPUT 链过,而不是 FORWARD 链。这样更符合逻辑。

源地址是本地主机发出报文

step(步骤)table(表)chain(链)comment(注释)
1本地进程或者应用程序(例如服务器或者客户端程序)
2路由选择,用哪个源地址以及从哪个接口上出去,当然还有其他一些必要的信息。
3rawOUTPUT这儿是你能够在连接跟踪生效前处理报文的点,这儿你可以标记某个连接不被连接跟踪处理。
4这儿就是本地发出报文进行连接跟踪处理的地儿
5mangleOUTPUT这儿是我们修改报文的地方,在这儿做报文过滤是不被推荐的,因为它可能有副作用
6natOUTPUT对于本级发送的报文做目的 NAT(DNAT)
7路由决定,因为前面的 mangle 和 nat 表可能修改了 报文的路由信息。
8filterOUTPUT对发送报文做过滤的地方
9manglePOSTROUTING这条链可能被两种报文遍历,一种是转发的报文,另外就是本级产生的报文。
10natPOSTROUTING在这儿我们做源 NAT(SNAT),我们建议你不要在这儿做报文过滤,因为有副作用。即使你设置了默认策略,一些报文也有可能溜过去。
11在接口上发出(例如 eth0)
12到了线路上(例如 internet)

报文的目的地址是另外一个网络

step(步骤)table(表)chain(链)comment(注释)
1在线路上(例如 internet)
2到了接口(例如 eth0)
3rawPREROUTING可以设置不想被连接跟踪系统处理的连接。
4非本地报文的连接跟踪系统处理,还在后面的状态匹配里面详细解释。
5manglePREROUTING主要用来修改报文,例如改变 TOS 等等。
6natPREROUTING主要完成 DNAT,SNAT 后面处理。在这条链上面不要做报文过滤。
7路由决定,例如转发报文还是上送本机。
8mangleFORWARD包继续被发送至 mangle 表的 FORWARD 链,这是非常 特殊的情况才会用到的。在这里,包被 mangle(还 记得 mangle 的意思吗)。这次 mangle 发生在最初 的路由判断之后,在最后一次更改包的目的之前 (译者注:就是下面的 FORWARD 链所做的,因其过 滤功能,可能会改变一些包的目的地,如丢弃 包)。--摘录自 1.09 版本的中文翻译。
9filterFORWARDThe packet gets routed onto the FORWARD 包被继续转发至 filter 表的 FORWARD 链,只有转发 报文才会到这儿,因此这儿我们做所有报文的过 滤。在你自己制定规则的时候,请考虑这一点。
10manglePOSTROUTING这个链也是针对一些特殊类型的包(译者注:参考第 6 步,我们可以发现,在转发包时,mangle 表的两个链都用在特殊的应用上)。这一步 mangle 是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上。--摘录自 1.09 版本的中文翻译。
11natPOSTROUTING这个链只能作为 SNAT 作用,千万不要做报文过滤,伪装(Masquerading)也是在这儿工作的。
12到了报文的出接口(例如 eth1)
13有一次到了线路上(例如本地网络)

请一定注意这儿没有为某一个接口或者与之类似的链,FORWARD 链会被本机的所有转发报文遍历。

mangle表

这个表主要用来进行报文修改,你可以自由的修改报文的 TOS 之类的。 在这个表里面,千万不要做过滤/NAT/伪装这类的事情。

  • 只能在 mangle 表里面使用
    • TOS: TOS target 主要用来修改报文的 TOS 字段,这个字段可以设置一个网络的报文如何被路由这样的策略。需要注意的是这个实现并不完善,网络里面的很多路由器都不处理这个字段。换句话讲,不要设置发完网络报文的 TOS 字段, 除非你准备用 iprouter2 来做路由。
    • TTL: TTLtarget 可以用来设置所有的报文都有一个系统的 TTL 这类的操作,一 个很重要的理由就是我们可以欺骗 ISP。一些 ISP 不愿意看到用户几台计算机 共享同一个连接,那些 ISP 会查找一台单独的计算机是否使用不同的 TTL,并且以此作为判断连接是否被共享的标志。
    • MARK: MARK target 可以给报文设置一些其他应用程序可识别的标记,例如iprouter2 程序。这样它就能够给予标记完成路由。利用这个标记我们也可以做带宽限制或者基于类的入队。
    • SECMARK: SECMARK target 主要用在针对报文设置安全标记,这个标记可以被 selinux 或者其他安全系统使用。SCEMARK 和 CONNSECMARK 一起合用可以针对连 接设置标记。
    • CONNSECMARK: CONNSECMARK target 用来把一个连接的标记拷贝给单个报文或者相反,然 后这些标记被 selinux 或者其他安全子模块使用。

nat表

  • 这个表只能用来完成 NAT 功能,换句话讲,它只能用来完成源/目的地址的转换。需要注意的是,只有第一个报文会经过这个表,这个连接的其他报文会自动完成转换。这个表的 target 有:
    • DNAT: DNAT target 主要用在我们只有一个公网 IP,然后我们需要把用户访问数据重定向到不同的服务器。换句话讲我们改变了报文的目的地址,然后重路由 到实际主机。
    • SNAT: SNAT target 改变包的源地址,这在很大程度上可以隐藏你的本地网络或 者 DMZ 等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址 替换本地网络地址。有了这个操作,防火墙就能自动地对包做 SNAT 和 De- SNAT(就是反向的 SNAT),以使 LAN 能连接到 Internet。如果使用类似 192.168.0.0/24 这样的地址,是不会从 Internet 得到任何回应的。因为 IANA 定义这些网络(还有其他的)为私有的,只能用于 LAN 内部
    • MASQUERADE: MASQUERADE target 的作用和 SNAT 完全一样,只是计算机的负荷稍微多一 点。因为对每个匹配的包,MASQUERADE 都要查找可用的 IP 地址,而不象 SNAT 用的 IP 地址是配置好的。当然,这也有好处,就是我们可以使用通过 PPP、 PPPOE、SLIP 等拨号得到的地址,这些地址可是由 ISP 的 DHCP 随机分配的。
    • REDIRECT:

raw表

  • RAW表的一个主要用途就是为了一件事情,那就是对报文设置一个标志,让 这个报文不被连接跟踪系统所跟踪。我们通过NOTRACK target来实现这个功 能。一个连接在NOTRACK里面被处理,接着连接跟踪系统就不会再处理这个报 文。不增加一个表是解决不了前面的问题的,因为我们其他表都是在连接跟踪 处理完之后再处理报文,
  • 这个表只有 PREROUTING 和 OUTPUT 两个链,只是因为这两个地方是他们 hit 连接跟踪的唯一地方。
  • 要让这个表能够工作,iptables_raw 模块需要被加载,加入我 们显式的制定-t raw 标志,只要这个模块可用,它就会被自动 加载。

filter表

  • 主要是用来报文过滤的,根据包的内容对包做 DROP 或 ACCEPT 的。

用户自定义链

  • 一个报文在处理的时候能够通过 jump 规则跳转到本表的另外一个链,但是需要指出的是这个新的链表必须是用户自定义的,不能是任何内建的链表。这个规则的查询是逐条的,自上向下的。遍历结束的条件是被一个 target 终止或 者内建的链表结束。
  • 用户自定义的链没有默认策略,只有内建的才可以配置默认策 略。在用户自定义的链最空有一个空白的规则,它的动作的 return 返回到主链。
  • 用户自定义链的每个条规则都必须逐一的被检查,直到有一个规则匹配这 个报文,接着调用这个规则的 target 处理这个报文,处理的结果当然可能结束 或者继续,另外还有一种可能就是达到了规则链的末尾。加入到达了规则链的 末尾,那么报文就会被送回父链,父链可能是用户自定义链,也有可能是内嵌 的链。

转载于:https://my.oschina.net/xyh592/blog/3097635

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值