Envoy的流量劫持使用的是iptables,便对这方面知识作了一个整理,方便后续查看,算是一个读书笔记吧。
一、iptables四张表
表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
表名 | 描述 |
---|---|
nat | nat 表主要用于网络地址转换。经过“NAT”处理的数据包会更改其 IP 地址。流中的数据包仅遍历此表一次。我们假设允许流的第一个数据包,同一流中的其余数据包会自动进行“NAT”或伪装等,并将受到与第一个数据包相同的操作。换句话说,这些将不会再次通过该表,但仍将被视为流中的第一个数据包。这是您不应在此表中进行任何过滤的主要原因,PREROUTING 链用于在数据包进入防火墙后立即对其进行更改。OUTPUT 链用于更改本地生成的数据包,然后再做出路由决定。最后, POSTROUTING 链,用于在数据包即将离开防火墙时更改数据包。 |
mangle | 该表主要用于处理数据包。除其他外,我们可以更改不同数据包的内容及其标头。这方面的示例是更改 TTL、TOS 或 MARK。请注意,MARK 并不是对数据包的真正更改,而是在内核空间中设置了数据包的标记值。其他规则或程序可能会在防火墙中进一步使用此标记来过滤或执行高级路由;tc 就是一个例子。该表由五个内置链组成,即 PREROUTING、POSTROUTING、OUTPUT、INPUT 和 FORWARD 链。PREROUTING 用于在数据包进入防火墙时和在它们命中路由决策之前更改数据包。POSTROUTING 用于在做出所有路由决定后立即处理数据包。OUTPUT 用于在进入路由决策后更改本地生成的数据包。INPUT 用于在数据包被路由到本地计算机本身之后,但在用户空间应用程序实际看到数据之前更改数据包。FORWARD 用于在数据包命中第一个路由决策之后、但在它们实际命中最后一个路由决策之前对数据包进行处理。请注意, mangle 不能用于任何类型的网络地址转换或伪装,nat 表是为这些类型的操作制作的。 |
filter | 过滤表应专门用于过滤数据包。例如,我们可以毫无问题地 DROP、LOG、ACCEPT 或 REJECT 数据包,就像在其他表中一样。该表内置了三个链,第一个名为 FORWARD,用于所有非本地生成的数据包,这些数据包的目的地不是我们的本地主机。INPUT 用于所有发往本地主机的数据包,而 OUTPUT 最终用于所有本地生成的数据包。 |
raw | 原始表及其链在 netfilter 中的任何其他表之前使用。引入它是为了使用 NOTRACK 目标。该表相当新,只有在编译后才可用于 2.6 内核及更高版本。原始表包含两条链。PREROUTING 和 OUTPUT 链,它们将在数据包到达任何其他 netfilter 子系统之前处理数据包。PREROUTING 链可用于所有传入该机器或转发的数据包,而 OUTPUT 链可用于在本地生成的数据包到达任何其他 netfilter 子系统之前更改它们。 |
表处理的先后顺序:
Raw——mangle——nat——filter
二、五条链
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。
当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
代码语言:javascript复制INPUT:进来的数据包应用此规则链中的策略
OUTPUT:外出的数据包应用此规则链中的策略
FORWARD:转发数据包时应用此规则链中的策略
PREROUTING:对数据包作路由选择前应用此链中的规则
(备注:所有的数据包进来的时侯都先由这个链处理)
POSTROUTING:对数据包作路由选择后应用此链中的规则
三、数据流量图:
- 入口数据
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),
之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙
本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),
那么内核将其传给INPUT链进行处理(决定是否允许通过等),
通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
2.转发数据:
代码语言:javascript复制来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,
之后会进行路由选择,如果数据包的目标地址是其它外部地址
(比如局域网用户通过网 关访问QQ站点的数据包),
则内核将其传递给FORWARD链进行处理(是否转发或拦截),
然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。
3.出口数据:
代码语言:javascript复制防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),
首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(
是否修改数据包的地址等)进行处理。
四、iptables的命令
命令主要参考这个:https://cloud.tencent.com/developer/article/1861735
参看资料: https://www.jianshu.com/p/ee4ee15d3658
https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#TRAVERSINGOFTABLES
https://tinychen.com/20200414-iptables-principle-introduction/#2-1-iptables流程图
https://cloud.tencent.com/developer/article/1861735