Iptables 的基本原理
Netfilter 是 Linux 内核提供的一套完善的数据包处理框架,通过一整套的钩子(hook)管理机制,可以实现数据包过滤、网络地址转换以及基于协议类型的连接跟踪等功能,Iptables 是基于 Netfilter 的数据包过滤系统,通过自己设定的规则以及处理动作对数据报文进行检测和处理。
Iptables 分为内核模块和用户态两部分,用户空间的 Iptables 位于/sbin/目录下,是用于设置规则的命令行工具,通过命令行制定相应的规则,指定内核模块进行相应的数据访问控制。链、表和规则是 Iptables 内核处理中非常重要的几个概念。
链
链也可以称为钩子,是指 Iptables 过滤的时机。Iptables 当前有 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTE 5 种链,其中 PREROUTING 用于在路由选择前处理数据包,POSTROUTE 用于在路由选择后处理数据包,INPUT 用于处理发送到本机的数据包,OUTPUT 负责处理本机发送出去的数据包,FORWARD 负责对转发数据包进行处理。
针对不同的数据流,有如下 3 种典型的链处理时机。
1)发送给本机的数据包:当数据包从物理层和数据链路层传输过来,如果数据包是访问 Linux 主机本身,则经过 PREROUTING 和 INPUT 钩子函数,到达传输层和应用层。
2)转发数据包:数据包从物理层和数据链路层传输过来,如果数据包需要转发,则经过 PREROUTING、FORWARD 和 POSTROUTE 3 个钩子函数。
3)发送数据包:当数据包从 Linux 主机本身向外发送数据包,要经过 OUTPUT 和 POSTROUTE 两个钩子函数。
表
表是负责完成某个过滤功能的模块,Iptables 当前有 Filter 表、NAT 表、mangle 表和 raw 表 4 个,它们在内核中对应 4 个不同的模块,这几个模块对应的功能和包含的钩子函数如下。
1)Filter 表:Filter 表是 Iptables 默认的过滤功能,确定是否放行数据包,包含 INPUT、FORWAD 和 OUTPUT 3 个钩子函数。
2)NAT 表:NAT 表负责修改数据包的源 IPPORT 和目的 IPPORT,包含 PREROUTING、OUTPUT 和 POSTROUTE 这几个钩子函数。
3)mangle 表:mangle 表用于对连接进行跟踪,包含 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTE 5 个钩子函数。
4)raw 表:raw 表用于关闭 NAT 表上开启的连接跟踪功能,包含 PREROUTING、OUTPUT 2 个钩子函数。
综合来说,Iptables、表、链和规则之间是层层包含的关系,Iptables 可以包含多个表,每个表包含多个链,每个链包含多个用于过滤的规则。
Iptables 在 Istio 中的使用
Iptables 负责对 Envoy 的入口和出口流量进行拦截。针对入口流量拦截,假设所有的流量均需要定向到 Envoy 代理,8090 是 Envoy 的监听端口,Iptables 规则如下:
针对出口流量拦截,也是类似的思路,Iptables 规则如下:
通过 Iptables 拦截转发后,目标端口被改写了,可以通过 SO_ORIGINAL_DST TCP 套接字获取原始的 ipport。
版权声明: 本文为 InfoQ 作者【阿泽🧸】的原创文章。
原文链接:【http://xie.infoq.cn/article/e23f0db1a976b58d1edf2c823】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论