zoukankan      html  css  js  c++  java
  • nf_conntrack之解决方案

    1.现象

    在/var/log/message中出现以下信息

    Dec  8 11:22:29 product08 kernel: nf_conntrack: table full, dropping packet.
    Dec  8 11:22:29 product08 kernel: nf_conntrack: table full, dropping packet.

    2.nf_conntrack是什么?

    nf_conntrack(在老版本的 Linux 内核中叫 ip_conntrack)是一个内核模块,用于跟踪一个连接的状态的。连接状态跟踪可以供其他模块使用,最常见的两个使用场景是 iptables 的 nat 的 state 模块。
    iptables 的 nat 通过规则来修改目的/源地址,但光修改地址不行,我们还需要能让回来的包能路由到最初的来源主机。这就需要借助 nf_conntrack 来找到原来那个连接的记录才行。
    而 state 模块则是直接使用 nf_conntrack 里记录的连接的状态来匹配用户定义的相关规则。例如下面这条 INPUT 规则用于放行 80 端口上的状态为 NEW 的连接上的包。

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

    3.解决方案

    (1)先关掉iptables

    /etc/init.d/iptables stop

    (2)查看当前的连接数:

    # grep nf_conntrack /proc/slabinfo

    (3)查出目前 nf_conntrack 的排名:

    $ cat /proc/net/nf_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10

    (4)优化参数

    状态跟踪表的最大行数的设定,理论最大值 CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)
    以64G的64位操作系统为例,CONNTRACK_MAX = 64*1024*1024*1024/16384/2 = 2097152

    即时生效请执行:
    sysctl –w net.netfilter.nf_conntrack_max = 524288 (16G)

    其哈希表大小通常为总表的1/8,最大为1/2。CONNTRACK_BUCKETS = CONNTRACK_MAX / 8
    同样64G的64位操作系统,哈希最佳范围是 262144 ~ 1048576 。

    运行状态中通过 sysctl net.netfilter.nf_conntrack_buckets 进行查看,通过文件 /sys/module/nf_conntrack/parameters/hashsize 进行设置
    或者新建 /etc/modprobe.d/iptables.conf ,重新加载模块才生效:
    options nf_conntrack hashsize = 262144

    还有些相关的系统参数`sysctl -a | grep nf_conntrack`可以调优(/etc/sysctl.conf ):
    net.netfilter.nf_conntrack_max = 1048576
    net.netfilter.ip_conntrack_tcp_timeout_established = 3600
    net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
    net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
    net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120

    (5)iptables放行

    iptables -t raw -A PREROUTING -p tcp -m multiport --dports 80,15000 -j NOTRACK
    iptables -t raw -A PREROUTING -p tcp -m multiport --sports 80,15000 -j NOTRACK
    iptables -t raw -A OUTPUT -p tcp -m multiport --dports 80,15000 -j NOTRACK
    iptables -t raw -A OUTPUT -p tcp -m multiport --sports 80,15000 -j NOTRACK

  • 相关阅读:
    Android的AndroidManifest.xml文件的详解
    Android新建项目手动添加Layout布局
    elasticsearch-搜索-评分(四)
    linux监控命令-磁盘监控
    linux监控命令-pidstat
    linux监控命令-free
    linux监控命令-vmstat
    redis-缓存设计-队列(普通队列、优先级队列、延迟队列)
    redis-缓存设计-信号量设计
    redis-缓存设计-搜索前缀匹配
  • 原文地址:https://www.cnblogs.com/tongxiaoda/p/7418699.html
Copyright © 2011-2022 走看看