Iptables是有状态机制的防火墙,通过conntrack模块跟踪记录每个连接的状态,通过它可制定严密的防火墙规则。
可用状态机制:
NEW #新连接数据包
ESTABLISHED #已连接数据包
RELATED #和出有送的数据包
INVALID #无效数据包
conntrack默认最大跟踪65536个连接,查看当前系统设置最大连接数:
cat /proc/sys/net/ipv4/ip_conntrack_max
#新版方法
cat /proc/sys/net/netfilter/nf_conntrack_max
查看当前跟踪连接数:
cat /proc/net/ip_conntrack|wc -l
#新版方法
cat /proc/net/nf_conntrack | wc -l
当服务器连接多于最大连接数时会出现kernel: ip_conntrack: table full, dropping packet的错误。
解决方法,修改conntrack最大跟踪连接数:
vim /etc/sysctl.conf #添加以下内容
net.ipv4.ip_conntrack_max = 102400
#以下为新版方法
net.netfilter.nf_conntrack_max=102400
net.nf_conntrack_max=102400
立即生效:
sysctl -p
为防止重启Iptables后变为默认,还需修改模块参数:
vim /etc/modprobe.conf #添加以下内容
options ip_conntrack hashsize=12800 #值为102400/8
一劳永逸的方法,设置Iptables禁止对连接数较大的服务进行跟踪:
iptables -A INPUT -m state --state UNTRACKED,ESTABLISHED,RELATED -j ACCEPT
iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp --sport 80 -j NOTRACK