Debian系统关闭iptables的conntrack跟踪
博客专区 > anglix 的博客 > 博客详情
Debian系统关闭iptables的conntrack跟踪
anglix 发表于2年前
Debian系统关闭iptables的conntrack跟踪
  • 发表于 2年前
  • 阅读 345
  • 收藏 1
  • 点赞 1
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 众所周知,Debian系统并没有提供关闭iptables的方法。然后一不小心开了iptables的conntrack功能,压力大点就出现“nf_conntrack: table full, dropping packet”。然后就无法访问啦

测试脚本

#!/bin/bash
# /opt/iptables-switch.sh status | disable | enable
ipt_mod_conf="/etc/modprobe.d/iptables.conf"
ipt_mod_list="ip_vs iptable_nat nf_nat_ipv4 ipt_MASQUERADE nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack iptable_filter ip_tables xt_tcpudp xt_multiport xt_length xt_addrtype x_tables"
nf_max=$(sysctl -e -n net.nf_conntrack_max)
nf_cur=$(sysctl -e -n net.netfilter.nf_conntrack_count)
ipt_hsize=$(grep 'MemTotal' /proc/meminfo | awk '{printf("%d",$2/16)}')
fuck_ipt_mod(){
echo '# disable iptables conntrack modules' > ${ipt_mod_conf}
for ipt_mod in ${ipt_mod_list}; do
	echo "blacklist ${ipt_mod}" >> ${ipt_mod_conf}
    modprobe -r ${ipt_mod}
done
}
clean_ipt_rule(){
iptables -F
iptables -Z
iptables -X
for ipt_table in $(cat /proc/net/ip_tables_names 2>/dev/null); do
    iptables -t ${ipt_table} -F
    iptables -t ${ipt_table} -Z
    iptables -t ${ipt_table} -X
done
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
}
ipt_enable(){
echo "options nf_conntrack hashsize=${ipt_hsize}" > ${ipt_mod_conf} # /sys/module/nf_conntrack/parameters/hashsize
for ipt_mod in ${ipt_mod_list}; do
	modprobe -q -r ${ipt_mod} && modprobe -a ${ipt_mod}
done
dmesg --reltime | grep nf_conntrack | tail -2 2>/dev/null
sysctl -e -w net.nf_conntrack_max=4194304
sysctl -e -w net.ipv4.netfilter.ip_conntrack_max=4194304
sysctl -e -w net.netfilter.nf_conntrack_max=4194304
sysctl -e -w net.netfilter.nf_conntrack_tcp_timeout_established=1200
sysctl -e -w net.netfilter.nf_conntrack_tcp_timeout_close_wait=60
sysctl -e -w net.netfilter.nf_conntrack_tcp_timeout_fin_wait=120
sysctl -e -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=120
}
case "$1" in
status)
    if [[ -z ${nf_max} ]]; then
        echo 'nf_conntrack disabled.'
    else
        echo "nf_conntrack used: ${nf_cur}/${nf_max}."
    fi
    ;;
disable)
    clean_ipt_rule
    fuck_ipt_mod
    $0 status
    ;;
enable)
    ipt_enable
    $0 status
;;
*)
    echo "Usage: $0 {status|disable|enable}"
    exit 2
    ;;
esac
exit 0

开启防火墙

  • 启用防火墙,并监控 nf_conntrack 状态:
/opt/iptables.sh enable
watch -n 1 -d '/opt/iptables.sh status'

施加压力

  • 找台机器给 ssh 加压:
watch -n 0.1 -d 'curl -s demo.higkoo.com:22'

查看防火墙状态

故障重现

  • 由于测试压力小,手动调小 nf_conntrack_max
sysctl -w net.netfilter.nf_conntrack_max=20
  • 然后故障就重现了: 防火墙满了
  • 不用的话就 disable 防火墙,脚本中的 enable 会开启并做 iptables 优化
sudo /opt/iptables.sh status
sudo /opt/iptables.sh enable
sudo /opt/iptables.sh disable

脚本测试 > 啥也别说了,都写在脚本里了。

共有 人打赏支持
anglix
粉丝 31
博文 35
码字总数 17615
×
anglix
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: