西西河

主题:【求助】关于网站大量 Error 001 应对 -- 铁手

共:💬49 🌺143 新:
分页树展主题 · 全看 上页 下页
          • 家园 比较多数量的 FIN_WAIT1

            和TIME_WAIT,相对而言,ESTABLISHED的数量并不多。

            • 家园 协议解释——看看是否有帮助

              看看你那几千个连接的Ip是不是都在Time_wait或FIN_WAIT1上

              这个状态多出现在慢速的连接上,服务器主动关闭连接发送完FIN标志后就处在FIN_WAIT1状态,直到收到客户端的ACK,之后收到客户端发来的FIN,并送出ACK后进入TIME_WAIT状态。处于TIME_WAIT状态的时间是最大包生存时间(MSL for Maximum Segment Lifetime)的两倍。因此一般是2分钟到4分钟时间。

              如果连接速度慢那么处在FIN_WAIT1的时间就比较长,搞不好还收不到——如果客户端断掉,或者客户端程序/NAT路由器没有正确处理TCP优雅关闭问题,那么服务器会试图多次重新传送FIN,直到超过重传次数。这个时间甚至可能比TIME_WAIT还长。

              影响这两个时间的参数大致有:

              MSL——看什么系统可能是30秒也可能是120秒

              TCP重试次数,有两个,一个是决定多少次报错,另一个是决定多少次关闭

              还有一个是FIN_WAIT2的时间,这个是服务器收到客户端对自己FIN的ACK后进入等待客户端FIN的时间。对于WEB服务器来说这个可以很短(10秒就足够了,因为HTTP客户端肯定不会再发数据过来)

              调整这些参数可以缩短上述状态的时间,从而快速释放连接。但是需要注意这些参数同时影响正常的通信

              • 家园 出问题那个,绝大部分在WAIT1,一部分在TIME

                这个应该也是一个问题,但是感觉上还不致命。致命的可能是

                /proc/sys/net/ipv4/netfilter/ip_conntrack_count

                越来越大,超过

                /proc/sys/net/ipv4/ip_conntrack_max

                一旦超过,就马上出现 error 001。

                max 值我已经加大过好几次,虽然还有空间可以加,不过总是想知道到底是什么因素导致 ip_conntrack_count 不断增加。

          • 家园 呵呵,如果是被DDOS攻击

            就是一群肉鸡站在门口,然后每只都能等5天才会被踢开。怪不得我们这些真正的用户进不来。

      • 家园 送花献宝,这个是真知

        送花成功。有效送花赞扬。感谢:作者获得通宝一枚。

        参数变化,作者,声望:1;铢钱:16。你,乐善:1;铢钱:-1。本帖花:1

        老铁按照这个做法做一下吧,看看是不是被攻击了,从最近河里的情况看,被攻击的可能性比较大。用一些聪明办法去过滤攻击者,不要单纯靠增加资源来硬撑。

      • 家园 如果增加资源能解决问题

        一般就增加资源。

        你这个错误代码实在是太影响用户体验了。

        即便是被人滥用,增加资源也能改善的。

      • 家园 萨苏文风,流毒匪浅啊~~~~
    • 家园 老铁新年快乐!

      前一段Error001特别多,这几天不大看到。我对Linux、网站维护和防止恶意攻击一点不懂,相信老铁会找到办法的。祝老铁新年快乐!

    • 家园 【整理】中文网站里面很多内容值得参考。

      1.外链出处

      要点:

      局域网中当有人使用p2p类的软件就很容易使ip_conntrack达到最大值

      ip_conntrack 是Linux NAT一个跟踪连接条目的模块记录着允许的跟踪连接条目ip_conntrack 模块会记录 tcp 通讯协议的 established connection 记录, 而且预设 timeout 时间长达五天 (432,000 秒).所以局域网中当有人使用p2p类的软件就很容易使ip_conntrack达到最大值...也由此造成:

      ip_conntrack: table full, dropping packet. 的错误提示..网关丢弃数据包..网络中断..

      具体解决办法如下二种:

      1.加大ip_conntrack_max设定值

      #modprobe ip_conntrack 需提前加载ip_conntrack模块

      #echo "986400" > /proc/sys/net/ipv4/ip_conntrack_max 数值具体多大应计算得出

      开机使用新数值..有三种办法:

      除vi /etc/rc.local外亦有:

      #vi /etc/sysctl.conf 加入: net.ipv4.ip_conntrack_max = 986400

      #sysctl -w net.ipv4.ip_conntrack_max=986400

      2.减小ip_conntrack timeout 的时限 默认5天即432000s

      ip_conntrack_tcp_timeout_established 值默认432000s 即5天

      #echo "3600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established

      开机使用同于上例

      #vi /etc/sysctl.conf 加入: net.ipv4.ip_tcp_timeout_established = 3600

      #sysctl -w net.ipv4.ip_tcp_timeout_established=3600

      另:通过ip_conntrack buffer 使用状况查出局域网中进行p2p下载的主机

      查看目前 ip_conntrack buffer 使用状况

      #grep conn /proc/slabinfo

      结果实例: ip_conntrack 5918 8140 384 10 1:tunables 54 27 0:slabdata 814 814 0 (各值说明如下)

      ip_conntrack the cache name

      5918 the number of currently active objects

      8140 the total number of available objects

      384 the size of each object in bytes

      814 the number of pages with at least one active object

      814 the total number of allocated pages

      1 the number of pages per slab are given

      man slabinfo 可查询详细说明.

      查出目前 ip_conntrack 记录最多的前五名 IP

      #cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c |

      sort -nr | head -n 5

      结果实例:

      2987 192.168.1.30

      334 192.168.1.52

      166 192.168.1.56

      99 192.168.1.43

      84 192.168.1.46

      由此可知, 192.168.1.30占用了绝大多数的ip_connect buffer,推断这个IP的User可能使用了P2P软件

      推荐一个清除某IP链接的方法:通过过滤ip_conntrack表得到ESTABLISHED状态过多的ip,用hping工具将这些ip从表中清理掉...

       下载: http://www.hping.org/download.html

        安装: ./configure;make;make install

      hping清理IP链接脚本:(此脚本修改链接状态为closed)

      #!/bin/sh

      if [ -z $1 ] ; then

      echo "NO INPUT IP"

      exit

      fi

      grep -E "^tcp .{10,25}ESTABLISHED src=$1 " /proc/net/ip_conntrack | while read line; do

      S_IP=`echo $line | awk '{print substr($5,5)}'`

      S_SOCK=`echo $line | awk '{print substr($7,7)}'`

      D_IP=`echo $line | awk '{print substr($6,5)}'`

      D_SOCK=`echo $line | awk '{print substr($8,7)}'`

      echo "$S_IP:$S_SOCK $D_IP:$D_SOCK"

      hping2 $D_IP -R -s $S_SOCK -p $D_SOCK -a $S_IP -k -c 1 > /home/huaying/1.log 2>&1 &

      done

      对于具体p2p下载产生链接数及ip_connect_max具体设置数值大小推荐以下范文,感兴趣的朋友可以看看...http://www.chinaunix.net/jh/36/596067.html

      附:linux NAT 性能优化常用设置...

      #echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range

      #echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush

      #echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

      #echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

      #echo "1048576" > /proc/sys/net/ipv4/netfilter/ip_conntrack_max

      #echo "1" > /proc/sys/net/ipv4/ip_forward

      #echo "268435456" >/proc/sys/kernel/shmall

      #echo "536870912" >/proc/sys/kernel/shmmax

      #echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established

      #echo "1024" > /proc/sys/net/ipv4/neigh/default/gc_thresh1

      #echo "2048" > /proc/sys/net/ipv4/neigh/default/gc_thresh2

      #echo "4096" > /proc/sys/net/ipv4/neigh/default/gc_thresh3

      #echo "52428800" > /proc/sys/net/ipv4/route/max_size

      #echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp

      #echo "1" > /proc/sys/net/ipv4/tcp_window_scaling

      2. 外链出处

      要点:提供了一个对付DDOS的思路

      http://linux.bdcf.net/index.php?option=content&task=view&id=87&Itemid=2

      一个perl脚本来清空ip_conntrack.但是我发觉更简单办法是移除ip_conntrack模块.移除时提示有依赖,还是直接service iptables stop来得快 .但是要记得,ip_forward也被设为0了,所以该设的全重设

      http://linux.bdcf.net/index.php?option=content&task=view&id=87&Itemid=2

      一个perl脚本来清空ip_conntrack.但是我发觉更简单办法是移除ip_conntrack模块.移除时提示有依赖,还是直接service iptables stop来得快.但是要记得,ip_forward也被设为0了,所以该设的全重设

      如何清除/proc/net/ip_conntrack的内容?

      作者 woflyin

      2004-12-09

      对于做处于网关地位的机器,其开启了nat功能,那么/proc/net/ip_conntrack是保存的是内网地址和外部地址连接的情况,记录每个连接的周详情况,其内容一般会保持5天,期间重新启动网络并不会有效减少其内容,唯一的办法就是重新启动和增大内存的数量,给监控带来不便,内容很容易满,核心便会报警:

      ip_conntrack: table full, dropping packet

      解决办法:

      1.增加内存:修改/etc/sysctl.conf的配置容量 net.ipv4.ip_conntrack_max=大的数值!

      2.隔一段时间重新启动系统,清空ip_conntrack

      3.对ip_conntrack编程,读取其内容,匹配指定的ip地址,然后调用发包程式发送RST报文,人为的完成tcp连接。用perl实现,调用了一个外部程式hping2,能够从其主页找到,这个程式就是个构包器

      用法:cl.pl ipaddress

      #!/usr/bin/perl

      $ip = $ARGV[0];

      #print $ARGS,$ip;

      exit if(!$ip);

      open(FH,"ip_conntrack");

      while()

      {

      if (/^tcp .*ESTABLISHED src=$ip/)

      {

      #print $_;

      @line = split(/=/,$_);

      $sip = $line[1];

      $sip =~s/ .*//g;

      $dip = $line[2];

      $dip =~s/ .*//g;

      $sport = $line[3];

      $sport =~s/ .*//g;

      $dport = $line[4];

      $dport =~s/ .*//g;

      print "$sip:$sport $dip:$dportn";

      `/usr/bin/hping2 $dip -R -s $sport -p $dport -a $sip -k -c 1 >/dev/null 2>/dev/null &`;

      }

      }

      4。问题:通过这个思路,是否能够对消除ddos攻击有一定帮助呢?查询ip_conntrack表,判断syn_SENT标志是否过多,过多就能够采取这样的做法消除他们呢?希望大家讨论,一起进步!

      3. 这个似乎有用。

      要点:用iptables的raw表解决ip_conntrack: table full, dropping packet的问题

      外链出处

      内容不引用了,老铁自己看吧。

    • 家园 如果是链接过多的话,

      请考虑是私人为了下载帖子编写的爬虫的情况,这样的话,是否可以通过对请求头部进行分析判断是否是常用浏览器,如ie,ff,opera,safari,chrom等,如不是这几个,可以拒绝链接。这是我之前在编写爬虫的时候所了解到的一些信息。

      • 家园 应该和你说的情况无关

        我在主题中说的有意无意,恶意非恶意,就是指的这种情况。网站也有很多搜索引擎在抓内容,应该说,这些都是正常的网站访问,无非是增加流量而已,系统应该是能够应付的。

        我说的那种情况,从网上搜来的结果来看,可能和 syn flood 攻击有关,先敲一下门,但是就不回答“你是谁”。

    • 家园 老铁新年好!老铁辛苦了!
    • 家园 花!辛苦了,不过难道不是河友多了么?
    • 家园 但是我这里,

      最先ccthere家园博客那一栏消失了,最近cchere家园博客那一栏也消失了,为什么呢?这很不方便,并不仅仅是error001这一个问题。

      • 家园 如果你的屏幕分辨率不高的话

        很可能是顶栏太长出现了滚动条,把第二行内容隐藏起来了。解决方法很简单,拖一下滚动条,家园博客什么的就出来了。

        罪魁祸首是这几个字:

        家园有红包

分页树展主题 · 全看 上页 下页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河