Iptables作为linux的一个服务,可以提供数据包过滤、网络地址转换(nat)、数据包内容修改等功能。但是其实准确的来说,这些功能并不是iptables本身实现的,而位于linux内核中的netfilter才是防火墙真正的安全框架,iptables可以理解成一个命令行工具。
本篇就来讲一讲iptables,也为了后面理解kubernetes网络做铺垫。
基础概念首先要了解iptables的两个概念:链和表。
链:iptables中的规则称为链,多条规则通过链表的数据结构进行连接。
表:表则是相同功能规则的集合,例如数据包过滤功能的规则在filter表中,提供网络地址转换功能的规则在nat表中。除了常用的filter和nat表,iptables还提供了mangle表,提供拆解报文,修改并重新封装报文的功能。raw表,用来关闭nat表上启用的连接追踪机制。
理解了链和表的概念,那规则到底何时触发呢,下面这张图请牢牢记住
可以看到iptables提供了五个钩子函数,prerouting、input、forward、output、postrouting,数据包在不同的生命周期会匹配对应时机的钩子函数中的规则。
根据流程图可以看出各个钩子函数的执行时机:
PREROUTING 在数据包流入后,路由判断之前触发,存在于raw表,mangle表,nat表中。
INPUT 在数据包经路由判断流入本机上层协议栈之前触发,存在于mangle表,filter表,nat表中。
FORWARD 在数据包经路由判断需转发后触发,存在于mangle表,filter表中。
OUTPUT 在本机上层协议栈发出的数据包经过路由判断之后触发,存在于raw表mangle表,nat表,filter表中。
POSTROUTING 在数据包即将离开本机时触发,存在于mangle表,nat表中。
也可以从图中看出各表中规则执行的先后顺序 raw –> mangle –> nat –> filter
规则查看了解了基本概念,下面通过实战进行学习。 输入查看命令
iptables -t filter -L
使用-t选项,指定要操作的表,使用-L选项,查看-t选项对应的表的规则。所以,上述命令列出了filter表的所有规则。
你可以尝试去掉-t filter,iptables默认使用filter表。
输出的参数解释如下:
target:规则匹配成功后需要采取的措施,包括放行(accept)、拒绝(reject)和丢弃(drop)。
prot:表示规则对应的协议。
opt:表示规则对应的选项。
in、out表示流入流出的网卡。
source:表示规则对应的源地址,可以是一个IP,也可以是一个网段。
destination表示规则对应的目的地址,可以是一个IP,也可以是一个网段。
类似的,我们查看一下nat表,
iptables -t nat -vL
这次多加一个-v参数,就多了两列输出:
pkts:对应规则匹配到的包数。
bytes:对应匹配到的包大小总和。
另一个经常使用参数是-n,表示不对IP地址进行名称反解,直接显示IP地址。例如
iptables -t nat -nvL
可以看到,nat表中的规则中的anywhere变成了0.0.0.0/0
新增规则继续实验,准备两台测试机,例如 192.168.249.11 和 192.168.249.12
清空iptables规则的命令如下,清空两台测试机的规则。
iptables -F
我们通过第二台12机器ping第一台11,发现可以ping通。
在第一台11上执行如下命令添加规则,将来自于192.168.249.12的数据包全部丢掉。
iptables -tfilter -A INPUT -s 192.168.249.12 -j DROP
再次从12 ping 11,发现已无相应,说明规则已生效。
我们再添加一条规则,
iptables -tfilter -I INPUT -s 192.168.249.12 -j ACCEPT
可以发现插入的命令从大a变成了大i,a代表append,表示从链表的结尾插入,i代表insert,表示从链表的开头插入。
再次ping实验,发现又可以ping通了。这说明链表是从前往后进行规则匹配,如果前面的规则对数据包进行了放行(accept),就不再匹配后面的规则。
删除规则直接将插入命令的-A或-I换成-D,delete即可删掉相应的规则。例如
iptables -tfilter -D INPUT -s 192.168.249.12 -j ACCEPT
另一种方式可以先查看规则的num, 然后按num删除
iptables --line -nvLiptables -D INPUT 1
修改规则需要指明修改之后规则的全部属性,容易出错,所以一般不对规则进行修改,而是先删除旧规则再添加新规则。
保存规则保存规则到文件中
iptables-save > ~/iptables
从文件中导入规则
iptables-restore < ~/iptables
总结iptables 规则的增删改查需要考虑以下四个方面
1.表类型,根据表类型确定数据包被如何处理
2.钩子函数类型,根据钩子函数确定规则匹配的时机
3.匹配的参数,即流入流出网络接口、协议类型、来源目的地址、来源目的端口
4.匹配后的动作,放行、丢弃还是拒绝
参考
https://www.zsythink.net/archives/1199