Solaris/문제해결

[Warning] High TCP connect timeout rate! System may be under a SYN flood attack!

[건희아빠] 2010. 6. 8. 16:41
참고 사이트 : http://sernet.tistory.com/entry/SYN-flood-attack
http://cafe.naver.com/sunschool.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=248
http://blog.naver.com/parkhw97?Redirect=Log&logNo=140078430052


Warning 메시지가 아래처럼 발생하는 경우.
May 18 14:30:38 SE-HSMS-DMZ ip: [ID 995438 kern.warning] WARNING: High TCP connect timeout rate! System (port 8000) may be under a SYN flood attack!

SYN Flood Attack 이란 ??
클라이언트와 서버통신을 하기전에 3 Way Hand Shaking 을 하는 과정이 일어납니다.
1. 클라이언트에서 서버로 접속을 요청하는 패킷을 SYN 패킷
2. 이걸 받은 서버는 SYN 패킷을 잘받았다는 ACK 패킷을 날려주고
3. 클라이언트는 다시 ACK 패킷에 대한 답변으로 ACK 패킷을 보내게 됩니다.
 
이과정이 끝나게 되면 로그기록이 서버에 저장되고 서버와 클라이언트간의 통신이 시작됩니다.
SYN Flood Attack은 클라이언트에서 서버로 접속을 요청하는 SYN 패킷만을 보내게 하는 겁니다. 그렇게 되면 서버는 SYN 패킷을 받은 클라이언트에게 ACK 패킷을 날리고 다시 ACK 패킷 받기를 기다리게 되므로 시스템 자원이 소모됩니다. 이떄 서버는 클라이언트의 IP나 시간대등이 로그기록을 못하게됩니다.


접근방법 1.
Solaris 시스템에서 SYN flood attack이 현재 발생하고 있다는 것을 확인합니다.

root:[/]# netstat -an -f inet | grep SYN_RCVD
127.0.01.80       192.168.33.107.46788     0      0 24820      0 SYN_RCVD
127.0.01.80       192.168.33.107.46793     0      0 24820      0 SYN_RCVD

시스템이 정상적인 상태에서는 SYN_RCVD 상태의 Connection 횟수가 거의 0 이다.

root:[/]# netstat -an -f inet | grep SYN_RCVD | wc -l
     146


접근방법 2.
Solaris는 시스템이 TCP SYN 공격하에 있는지를 결정해주는 또 다른 방법
다음 명령어를 실행하여 tcpTimRetransDrop, tcpListenDrop, tcpHalfOpenDrop 파라미터들의 값을 조사합니다.

root:[/]# netstat -s -P tcp

TCP     tcpRtoAlgorithm     =     4     tcpRtoMin           =   400
        tcpRtoMax           = 60000     tcpMaxConn          =    -1
        tcpActiveOpens      =11300468   tcpPassiveOpens     =59101907
        tcpAttemptFails     =606915     tcpEstabResets      =4036505
        tcpCurrEstab        =   329     tcpOutSegs          =2257531513
        tcpOutDataSegs      =418877743  tcpOutDataBytes     =3979358059
        tcpRetransSegs      =22383402   tcpRetransBytes     =1055236891
        tcpOutAck           =350150857  tcpOutAckDelayed    =34673289
        tcpOutUrg           =     0     tcpOutWinUpdate     =1371910
        tcpOutWinProbe      =447352     tcpOutControl       =139150897
        tcpOutRsts          =2044823    tcpOutFastRetrans   =3493103
        tcpInSegs           =1045057140
        tcpInAckSegs        =1392911626 tcpInAckBytes       =3244396294
        tcpInDupAck         =70310266   tcpInAckUnsent      =  6777
        tcpInInorderSegs    =1064036890 tcpInInorderBytes   =1241841314
        tcpInUnorderSegs    =570411     tcpInUnorderBytes   =616643249
        tcpInDupSegs        =6899743    tcpInDupBytes       =220524164
        tcpInPartDupSegs    =  7874     tcpInPartDupBytes   =4337780
        tcpInPastWinSegs    =2071646    tcpInPastWinBytes   =2560302494
        tcpInWinProbe       =123733     tcpInWinUpdate      =426151
        tcpInClosed         =179467     tcpRttNoUpdate      =248600944
        tcpRttUpdate        =1090895303 tcpTimRetrans       =3587901
        tcpTimRetransDrop   =695160     tcpTimKeepalive     = 46039
        tcpTimKeepaliveProbe=  2399     tcpTimKeepaliveDrop =   162
        tcpListenDrop       = 17969     tcpListenDropQ0     =     0
        tcpHalfOpenDrop     = 16366     tcpOutSackRetrans   =1331972


정상적인 상태에서는 tcpTimRetransDrop, tcpListenDrop, tcpHalfOpenDrop
파라미터들의 값이 모두 0을 유지하고 있으나, 공격이 있을 경우는 0이 아닌 값으로 나타난다.

파라미터 설명
tcpTimRetransDrop 시스템 부팅후 SYN 요구나 연결확립된 TCP 연결에 대하여 시간만료된 패킷의 수
tcpListenDrop 시스템이 부팅한 후에 TCP queue backlog 때문에 거절된 SYN 요구의 횟수를 의미
tcpHalfOpenDrop
값이 빠르게 증가하면 해당 시스템이 TCP SYN 공격을 당하고 있을 확률이 상당히 높음을 나타냄

해결방법 tcp parameter를 수정
1. abort timer를 짧게하기 위해서는 milli-second로 설정하는 커널 변수인 tcp_ip_abort_cinterval를 사용
   시스템 디폴트값은 180초로 설정돼 있으므로, abort timer를 60초로 설정하기 위해서는 다음과 같은 명령어를 실행하면 됩니다.
    # ndd -set /dev/tcp tcp_ip_abort_cinterval 600000

2. TCP 연결 큐(queue)를 더 길게 한다.
   연결확립(connection established)이 이루어지지 않은 패킷에 대한 큐 크기는 커널 변수인
   tcp_conn_req_max_q0(Solaris 2.6이상)를 사용할 수 있다. tcp_conn_req_max_q0의 디폴트 값은 1024
   큐 (queue) 크기를 증가시키기 위해서 다음 명령어를 실행하면 됩니다.
    # ndd -set /dev/tcp tcp_conn_req_max_q0 2048