一、前言
在开始Kubernetes的网络之前我们先来学习Netfilter,Netfilter可能了解的人比较少,但是iptables用过 Linux的都应该知道。本文主要介绍Netfilter与iptables的原理。
二、什么是Netfilter
Netfilter顾名思义就是网络过滤器,其主要功能就是对进出内核协议栈的数据包进行过滤或者修改,iptables 就是建立在Netfilter之上。Netfilter就是Linux内核里挡在网卡和用户态进程之间的一道防火墙。
这幅示意图中,IP包一进一出,有几个关键的检查点,它们正是Netfilter设置防火墙的地方。Netfilter通过向内核协议栈中不同的位置注册钩子函数来对数据包进行过滤或者修改操作,这些位置称为挂载点,主要有 5 个:PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT 和 POST_ROUTING,如下图所示:
PRE_ROUTING: IP包进入IP层后,还没有对数据包进行路由判定前;
LOCAL_IN: 进入主机,对IP包进行路由判定后,如果IP 包是发送给本地的,在进入传输层之前对IP包进行过滤;
LOCAL_OUT: IP包通过传输层进入用户空间,交给用户进程处理。而处理完成后,用户进程会通过本机发出返回的 IP 包,在没有对输出的IP包进行路由判定前进行过滤;
FORWARD: IP包进行路由判定后,如果IP包不是发送给本地的,在转发IP包出去前进行过滤;
POST_ROUTING: 对于输出的IP包,在对IP包进行路由判定后进行过滤;
在图中可以看出决定IP包走向就是路由,按照路由的判定可以分为两条路线:
- 第一个路由通过查找输入数据包 IP头部的IP地址,判断是否为本机的IP地址是否一致,如果与本机的 IP地址一致,说明数据是发送给本机的,否则说明数据包是发送给其他主机,只是经过本机中转;
- 第二个路由判定根据输出数据包 IP头部的IP地址 从路由表中查找对应的路由信息,然后根据路由信息获取下一主机的 IP地址,然后进行数据传输;
通过向挂载点注册钩子函数,就能够对处于不同阶段的数据包进行过滤或者修改操作。由于钩子函数能够注册多个,因此挂载点通过链表链接,所以挂载点又被称为链,因此LOCAL_IN挂载点又称为INPUT链、LOCAL_OUT 挂载点又称为 OUTPUT链、FORWARD挂载点又称为 PORWARD链、PRE_ROUTING挂载点又称为 PREROUTING链、POST_ROUTING挂载点又称为 POSTOUTING链。
三、什么是iptables
iptables是建立在 Netfilter 之上的数据包过滤器,通过向 Netfilter 的挂载点上注册钩子函数来实现对数据包过滤的,从iptables这个名字上可以看出一定具有表的概念,iptables通过把这些规则表挂载在 Netfilter 的不同链上,对进出内核协议栈的数据包进行过滤或者修改操作。
iptables包括四种表:
Filter表
Filter表用于过滤数据包,是iptables的默认表,因此如果你配置规则时没有指定表,那么就默认使用Filter表,Filter表可以作用于INPUT链、OUTPUT链、PORWARD链;
NAT表
NAT表用于对数据包的网络地址转换(IP、端口),分别可以挂载到PREROUTING链、POSTOUTING链、OUTPUT链;
Mangle表
Mangle主要用来修改IP数据包头,比如修改TTL值,同时也用于给数据包添加一些标记,从而便于后续其它模块对数据包进行处理,可以作用在所有链上;
ROW表
Raw表用于判定数据包是否被状态跟踪处理,可以作用于PREROUTING链、OUTPUT链;
image.png
数据包从网络中进入到内核协议栈的过程中,要执行的 iptables 规则,如果在执行某条 iptables 规则失败后,会直接把数据包丢弃,不会继续执行下面的规则。
四、添加iptables规则
使用 iptables 命令添加规则,iptables可以分为四部分:
iptables -t表 -A链 匹配规则 动作
匹配条件
匹配条件分为基本匹配条件与扩展匹配条件,基本匹配条件包括源IP地址和目标IP地址等,扩展匹配条件包括源端口和目标端口等;
处理动作
处理动作是指当匹配条件成功后要进行的一系列操作过程,动作也可以分为 基本动作 和 扩展动作,常用的动作如下:
ACCEPT:允许数据包通过;
DROP:直接丢弃数据包,不给任何回应信息;
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息;
SNAT:源IP地址转换;
DNAT:目标IP地址转换;
REDIRECT:在本机做端口映射;
-t <表>:指定要操纵的表; -A <链>:向规则链中添加条目; -D <链>:从规则链中删除条目; -I <链>:向规则链中插入条目; -R <链>:替换规则链中的条目; -L:显示规则链中已有的条目; -F:清楚规则链中已有的条目; -Z:清空规则链中的数据包计算器和字节计数器; -N:创建新的用户自定义规则链; -P:定义规则链中的默认目标; -h:显示帮助信息; -p:指定要匹配的数据包协议类型; -s:指定要匹配的数据包源ip地址; -j <动作>:指定要进行的动作行为; -i <网络接口>:指定数据包进入本机的网络接口; -o <网络接口>:指定数据包要离开本机所使用的网络接口。 --dport <端口>:匹配目标端口号。 --sport <端口>:匹配来源端口号。