深入理解 iptables
iptables
是Linux
上重要的防火墙程序,它既是一个用户态的程序,也是一个内核的模块,通过向Linux内核netfilter框架注入钩子函数,以及自定义的规则,实现包过滤,修改,地址转换,日志记录等功能。在k8s
生态中,作为kube-proxy
的默认后端,实现流量在集群之内的的路由和转发,写这篇文章的最初原有也是想了解k8s
是如何将访问到节点上的流量,路由到自定义的Service
以及最终的pod
内部。
netfilter
在了解iptables
之前,先认识下netfilter,它是Linux内核子系统,允许实现各种与网络相关的操作,它是网络相关操作领域的基础设施,基于此可以实现任何大多数网络包的诉求:
- 包过滤,这可能是大多数场景下的诉求,也是
iptables
最多的使用场景,可以用来限制某些特征的包进入到本机,例如,指定ip范围,某类协议的; - NAT,负责转换网络数据包的源IP和目的IP;
- 数据包修改,地址转换只是数据包修改的一种,还可以修改数据包的TOS(
Type Of Service
,服务类型)、TTL
指以及为数据包设置Mark
标记等;
Netfilter框架在Linux内核中提供了一堆钩子,当网络数据包通过内核中的协议栈时,它会遍历这些钩子。Netfilter允许使用这些钩子编写模块并注册回调函数,当钩子被触发时,回调函数将被调用。这些钩子被用在包处理的以下5个阶段:
NF_INET_PRE_ROUTING
:当数据包从网卡上收到还有路由之前,这类钩子函数就会被触发,然后内核判断这个数据包是否是发往当前主机的,根据条件,将触发以下两个钩子;NF_INET_LOCAL_IN
:当数据包决定路由到本机上的时候,就会触发这类钩子;NF_INET_FORWARD
:当数据包决定要继续转发的时候,这类钩子会被触发;NF_INET_LOCAL_OUT
:这类钩子函数会在本机生成数据包,发出去之前被调用;NF_INET_POST_ROUTING
:这类钩子函数主要用于从本机发出去的数据包,但是在发到网卡之前;