1.iptables和netfilter
netfilter是一套数据包过滤框架,通过hook的5个钩子函数来处理IP数据包
ip_tables是真正的内核防火墙模块,通过把自己的函数注入到netfilter的框架中来实现
防火墙功能。
iptables有4个表,raw,mangle, nat,filter
有5个链PREROUTING,INPUT,FORWORD,OUTPUT,POSTING,这5条链就是iptables填到netfilter中的5个钩子函数
其中
PREROUTING OUTPUT的链中的规则可以存放到表raw中
FORWARD,INPUT,OUTPUT的链中的规则可以存放到表filter中
PREROUTING,POSTROUTING,OUTPUT链中的规则可以存放到nat表中
PREROUTING,POSTROUTING,OUTPUT,INPUT,FORWARD链中的规则可以放到mangle表中
2.数据包的处理过程
(1)数据包进入IP协议栈先进行IP校验,完成校验以后,数据包被第一个钩子函数PRE_ROUTING处理。
(2)进入路由模块,由其决定该数据包是转发出去还是送给本机。
(3)若该数据包是送给本机的,要经过INPUT处理后传递给本机的上层协议,
若数据包被转发,则它将被钩子函数FORWARD处理,然后还要经钩子函数POST_ROUTING处理后才能传输到网络。
(4)本机进程产生的数据包要先进行OUTPUT处理后,再进行路由选择处理,然后经过钩子函数POST_ROUTING处理后再发向网络。
(5)其中的路由判断是通过数据包的目的地址来判断的。
3.连接跟踪
nat表中还包含了conntrack模块,该模块可以对数据包做的nat变换进行进行缓存,还可以记录连接的状态,对应的状态有如下几个:
INVAILD,表示分组对应的连接是未知的;
ESTABLISHED,表示分组对应的连接已经进行了双向的分组传输,也就是说连接已经建立;
NEW,表示这个分组需要发起一个连接,或者说,分组对应的连接在两个方向上都没有进行过分组传输;
RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输 连接和控制连接之间就是RELATED关系。
而数据包在iptables进行nat转换时,也是先查连接跟踪中的缓存,然后再查nat表。
支持的协议包含TCP、UDP、ICMP、DCCP、SCTP、GRE
每一个连接在连接跟踪的缓存中都有两条记录,一个是原始方向的称为IP_CT_DIR_ORIGINAL
,另外一个是回复方向的称为IP_CT_DIR_REPLY
,这样当此条连接的回复报文过来后就可以很快确认数据包属于哪条连接。
因此,对于主动内网snat一个ip访问出去只需要一条snat规则,回包会通过reply的记录进行翻转变换,或外网dnat访问内网的某个服务时,也只需要一条dnat规则也是这个原因。