LINUX上的防火墙功能大家都应该不陌生,但是作为实现作为内核功能的防火墙功能怎么会受用户空间随意控制呢?大家有没有想过这个问题。所以说,简单的一条iptables命令只是用户空间管理内核的一条命令,而真正实现防火功能的还是内核上netfilter上的规则,基于iptables/netfliter才真正完成了这一任务。
于是在内核上就产生四张表,fliter,nat,mangle和raw,其上有五个钩子函数,PREROUTING,INPUT,OUTPUT,FARWARD和POSTROUTING,在这些函数上又有着各种各样的规则,称为“四表五链”,这里为大家做一下简单的回忆,下面进入正题。
在启动防火墙功能的时候,有时候会启动ip_conntrack这个模块,这才是重点,在此之前,不得不提的是,在网络上,为了防止反弹式木马,防火墙基于自身的一个显式扩展功能,是要用到ip_conntrack这个模块的,并能有效的检测网络报文情况。但是,这一模块的启用,就会限制服务器端对报文的响应数目,一般默认32768,在一个服务器端,这样的响应数目显然是不够的,结果呢,就是终止报文的传输,线上业务中断。尽管可以通过vim /proc/sys/net/ipv4/ip_conntrack_max来调整响应的值,但是这个调整毕竟在可控范围之内,并不能满足任何时间段任何数量的请求。那么,让你损失巨大的这条命令究竟是什么呢?就是大家在查看规则的时候,有人不是用我前面的那条命令,而是采用iptables -t nat -L,后果就是,就是即使你没有安装ip_conntrack模块,系统也会自动给你装上,因为只要你使用-t nat,就会激活iptables_nat和ip_nat,这俩个模块又会激活ip_conntrack模块,因为这些模块之间是彼此依赖的。
一个不留心的命令,终止半个小时的业务,损失几十万,就在一念之间。