[Warning] High TCP connect timeout rate! System may be under a 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