iptables踩坑记

1:第一坑:众所周知nf_conntrack,下面会有介绍补坑方法。服务器

2:连环坑:并发

要解决第一个坑,须要修改内核参数,如:tcp

net.netfilter.nf_conntrack_tcp_timeout_established = 600    ide

net.netfilter.nf_conntrack_max = 1048576spa

net.nf_conntrack_max = 1048576.net


这几个参数是基于nf_conntrack模块的,若是nf_conntrack在系统中没有被加载,则上面三个选项就恢复成默认值。设计

/etc/init.d/iptables stop这个命令会将nf_conntrack模块移除,运行stop命令后使用sysctl -a 你会发现nf_conntrack的三个选项恢复成了默认值。orm

而后你再一次启动/etc/init.d/iptables start ,而此时nf_conntrack仍是保持默认值。系统大量报错。。。介,介,介,你踩到iptables精心设计的“连环坑”。中间件


修改:blog

NF_MODULES_COMMON=(x_tables nf_nat nf_conntrack) # Used by netfilter v4 and v6

NF_MODULES_COMMON=(x_tables nf_nat) # Used by netfilter v4 and v6

便可。


对于“连环坑”,遇到是有条件的:

便是:系统中不存在ipv6包

由于nf_conntrack_ipv6 是依赖nf_conntrack的,这样iptables脚本使用modprobe -r nf_conntrack 卸载不掉该模块,就不会恢复nf_conntrack默认值


3:自埋坑

在上面“连环坑”中,咱们经过修改/etc/init.d/iptables的脚本配置,stop时候不卸载nf_conntrack模块,解决不会恢复nf_conntrack默认值的问题。今天就遭此一坑。

咱们线上的中间件服务器的访问量很是巨大,使用nf_conntrack_max = 1048576参数后,瞬间跑满。请求没法到达1.31,按照之前的方法我执行/etc/init.d/iptables stop,而由于我修改了脚本stop的时候,不会移除nf_conntrack模块,悲剧了。而此时,咱们手动移除modprobe -r nf_conntrack 报错"模块正在使用"。。。  情急之下我卸载了iptables, 模块依旧存在,因而修改了内核参数:net.nf_conntrack_max = 10485760 刚开始正常,过一会,机器直接重启。。。

如此看来,修改/etc/init.d/iptables 中的NF_MODULES_COMMON选项是不正确的,这样会致使出问题的时候,你执行/etc/init.d/iptables stop都不会好转。咱们必须想别的途径。


咱们分析iptables启动过程:

执行iptables start --->启动nf_conntrack模块 ---> 应用iptables策略。

执行iptables stop --->卸载nf_conntrack模块(sysctl的nf_conntrack 选项恢复默认值)--->中止iptables 进程 


咱们以前的解决方案是:

执行iptables start --->启动nf_conntrack模块 ---> 应用iptables策略。

执行iptables stop --->中止iptables 进程  (不卸载nf_conntrack)



最后的解决方案:

执行iptables stop --->卸载nf_conntrack模块(sysctl的nf_conntrack 选项恢复默认值)--->中止iptables 进程 

执行iptables start --->启动nf_conntrack模块 (加载/etc/sysctl中的配置)---> 应用iptables策略。


方法是:

sed -ri 's/IPTABLES_SYSCTL_LOAD_LIST=.*/IPTABLES_SYSCTL_LOAD_LIST="net.nf_conntrack"/g' /etc/init.d/iptables


最后,奉劝诸位同窗,对于大流量大并发的机器。放弃对nf_conntrack的引用才是正解。当kenel的nf_conntrack参数的值设置不合理当执行/etc/init.d/iptables stop时候直接会致使机器重启,介,我亲身经历过!


方法一:删除链接跟踪模块`lsmod | grep nf_conntrack`,不使用链接状态的跟踪功能。

rmmod nf_conntrack_ipv4 
rmmod nf_conntrack_ipv6 
rmmod xt_state 
rmmod xt_CT 
rmmod xt_conntrack 
rmmod iptable_nat 
rmmod ipt_REDIRECT 
rmmod nf_nat 
rmmod nf_conntrack


# 禁用 nf_conntrack 模块 
blacklist nf_conntrack 
blacklist nf_conntrack_ipv6 
blacklist xt_conntrack 
blacklist nf_conntrack_ftp 
blacklist xt_state 
blacklist iptable_nat 
blacklist ipt_REDIRECT 
blacklist nf_nat 
blacklist nf_conntrack_ipv4


方法二:

使用祼表,添加“不跟踪”标识。


iptables -t raw -A PREROUTING -p tcp -m tcp --dport 8983 -j NOTRACK

iptables -t raw -A OUTPUT -p tcp -m tcp --sport 8983 -j NOTRACK

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 8983 -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED,UNTRACKED -j ACCEPT

或者,直接将全部访问,忽略跟踪:

iptables -t raw -A PREROUTING -p tcp -j NOTRACK

iptables -t raw -A PREROUTING -p udp -j NOTRACK

iptables -t raw -A OUTPUT -p tcp -j NOTRACK

iptables -t raw -A OUTPUT -p udp -j NOTRACK


参考:

http://my.oschina.net/kisops/blog/150995

相关文章
相关标签/搜索