Linux за българи: Форуми

Сигурност => Системна Сигурност => Темата е започната от: nikodim1 в Jul 07, 2009, 11:20



Титла: CLOSE_WAIT apache не се затварят
Публикувано от: nikodim1 в Jul 07, 2009, 11:20
Системата е FreeBSD 6.1 с Apache 2.2.3
От време на време се наблюдава изключително висок брой връзки висящи в state CLOSE_WAIT
На моменти имам над 100 такива от 1 IP - обикновено тези IP-та са азиатски - Китай, Малайзия ...
Случва се сървърът да достигне MaxClients и известно време да не може да приема заявки. При рестарт на apache висящите в CLOSE_WAIT връзки изчезват. Доколкото успях да намеря информация това би трябвало да е проблем с Apache - но не намерих начин за справяне с проблема, друг освен рестарт на уеб сървъра.

Също така предполагам че това е някакъв вид DoS атака но не мога да съм 100% сигурен

Дали има някой сблъсквал се с подобен проблем ?


Титла: Re: CLOSE_WAIT apache не се затварят
Публикувано от: romeo_ninov в Jul 07, 2009, 12:45
Поиграй си с mod_secure мисля че там имаше решение за твоя случай


Титла: Re: CLOSE_WAIT apache не се затварят
Публикувано от: netgraph в Jul 07, 2009, 14:45
Първо един цитат от man 4 tcp:
Цитат
maxtcptw           When a TCP connection enters the TIME_WAIT state, its
                        associated socket structure is freed, since it is of
                        negligible size and use, and a new structure is allo-
                        cated to contain a minimal amount of information nec-
                        essary for sustaining a connection in this state,
                        called the compressed TCP TIME_WAIT state.  Since this
                        structure is smaller than a socket structure, it can
                        save a significant amount of system memory.  The
                        net.inet.tcp.maxtcptw MIB variable controls the maxi-
                        mum number of these structures allocated.  By default,
                        it is initialized to kern.ipc.maxsockets / 5.

     nolocaltimewait    Suppress creating of compressed TCP TIME_WAIT states
                        for connections in which both endpoints are local.

     fast_finwait2_recycle
                        Recycle TCP FIN_WAIT_2 connections faster when the
                        socket is marked as SBS_CANTRCVMORE (no user process
                        has the socket open, data received on the socket can-
                        not be read).  The timeout used here is
                        finwait2_timeout.

     finwait2_timeout   Timeout to use for fast recycling of TCP FIN_WAIT_2
                        connections.  Defaults to 60 seconds.

Освен това при мен се получава, така че да не освобождава тези CLOSE_WAIT компресирани връзки и
да се натрупват до над 60 000 (на 1 машина). Честно казано не съм търсил къде е проблема, но за бързо решение
драснах един малък модул, който просто изчиства всички _компресирани_  връзки в CLOSE_WAIT в  момента на зареждане, след
което проблема при мен се оправя и започват отново да си изтичат нормално. Може да си направиш скрипт, който
да следи за броя на висящи връзки в CLOSE_WAIT например.
Същия проблем имам и под FreeBSD 7.x. Този модул е за 6.x.

Ето модула ако мислиш, че ще ти е полезен:
http://93.152.160.252/tcpclean.tar.gz ($2)

Цитат
make
kldload ./tcpclean.ko
kldunload tcpclean

Друг вариант може би е tcpdrop
Цитат
man tcpdrop



Титла: Re: CLOSE_WAIT apache не се затварят
Публикувано от: nikodim1 в Jul 08, 2009, 14:01
Много благодаря за насоките
Направих го със tcpdrop - засега изглежда че работи.

Върши ми работа, но все пак ми се струва, че проправям последствията а не самия проблем

Благодаря още веднъж