SYN Flood 공격 원리와 대응수단에 대해서 [DOS/DDOS]

오늘 소개할 내용은 SYN Flood 공격입니다
SYN를 이해하기 위해서는 TCP/IP 프로토콜 개념을 이해하셔야 하는데 지난번 게시물에서 TCP와 UDP에 관해 작성된 내용이 있으니
TCP/UDP에 관한글을 읽어주세요
 
 

SYN Flood란

TCP의 3WayHandshake 취약점을 이용하여 다량의 SYN패킷을 보내어 서버의 백로그 큐를 가득 채워 마비시키는 공격을 말합니다
 
 
 

지난 글에 자세히 나와있지만 일반적인 TCP네트워크에서 3-Way Handshake과정은 클라이언트가 서버에 접속하기 위해 SYN패킷을 보내면 서버가 SYN / ACK패킷으로 클라이언트의 요청을 수락한다고 클라이언트에게 알려주고 최종적으로 클라이언트가 ACK패킷으로 응답을 하면서 서로 간의 연결이 이루어지게 됩니다
 

728x90

백로그 큐(Backlog Queue)

백로그 큐는 3WayHandshake를 위해 연결이 진행 중인 요청을 담아두는 큐 공간을 의미합니다
서버는 SYN / ACK패킷을 전송 후 클라이언트의 ACK응답을 받기 전까지 저장해둡니다
백로그 큐 공간이 가득 차게 되면 다른 연결을 받을 수 없는 상태가 됩니다
 
 
 

SYN Flood 공격 방법

 
 

SYN Flood공격의 경우 공격자가 여러 개의 스푸핑 된 아이피로 타깃 서버에 SYN Packet을 전송 후 아무것도 하지 않으면 서버의 SYN Backlog Queue에 클라이언트의 연결 요청이 계속 남아있게 됩니다
쌓여있는 연결 요청을 없애기 위해선 처음 연결 요청을 보낸 클라이언트가 ACK패킷으로 응답을 한 뒤 3HandShake과정이 끝나야 하는데 위의 그림처럼 아무것도 하지 않은 상태로 응답하지 않는다면  SYN Backlog Queue는 가득 차게 되어 더 이상 연결 요청을 받아들일 수 없는 상태가 됩니다
 
 
 

SYN Flood 공격 대응방법

Backlog Queue확장

Backlog Queue를 늘릴경우 많은 요청이 들어와도 여유공간이 남아있기 때문에 서버를 운영할 수 있습니다
다만 공격자가 더 많이 Backlog Queue보다 더 많은 공격을 하면 결국에는 완벽한 대응이 불가합니다
 
 

SYN Cookie 사용하기

SYN Cookie는 클라이언트의 SYN요청을 Backlog Queue에 저장하지 않고 SYN / ACK 패킷 안에 SYN패킷 정보를 넣어서  전송 후 통신을 원하는 상대는 SYN / ACK패킷 안에 SYN패킷 정보가 담긴 데이터를 받은 후 SYN /ACK패킷에다가  ACK패킷을 담아 패킷을 보낸 뒤 통신을 할 수 있습니다 
 
 
 

SYN Cookie 설정 방법

리눅스의 sysctl 명령을 사용하여 변경 가능합니다 해당 명령어는 /proc/sys 하위 디렉터리에 대한 커널 매개 변수값을 변경할 때 사용되는 명령어입니다
 
 
 

현재의 sysctl 값 확인하기

sysctl -a 명령을 사용하면 현재의 sysctl값을 확인할 수 있습니다
sysctl -a |grep tcp 명령을 사용할 경우 tcp에 해당하는 값들만 조회할 수 있습니다
 

sysctl 원하는값 추출하기

grep을 이용해서 저희가 원하는 정보 부분만 확인해보겠습니다
 
 
 

syncookies 설정하기

현재 값이 1로 설정되어있습니다 1로 설정되어있음은 syncookies를 사용한다는 의미입니다 
만약에 해당 값이 0으로 사용되어있다면 syncookies가 비활성화되어있는 상태이니 아래 명령으로 활성화시켜주세요
sudo sysctl -w net.ipv4.tcp_syncookies=1
 
 
 

결론

그러면 결국에 syncookies를 설정하면 SYNFlood를 막을 수 있을 텐데 왜 아직도 세계적으로 SYNFlood공격이 유효할까요??
일반적인 DOS(Denial-of-service)공격일 경우 하나의 PC에서 취약점 공격이 들어오기 때문에 syncookies로 방어할 수 있지만 여러 대의 DDOS(Distributed denial-of-service) 공격은 여러 대의 PC에서 SYN패킷을 전송합니다 서버 측은 Backlog Queue를 사용하지 않아도 어쨌건 SYN / ACK를 전송을 해줘야 하는데 이때 발생하는 컴퓨터 자원은 한정되어 있습니다 이점을 노려서 여러 대의 PC에서 엄청난 데이터의 양 트래픽을 발생시켜 서버를 마비시킵니다
올바른 SYN패킷만 검토하는 DDOS 방어 솔루션도 있지만 결국엔 이 또한 자원이 한정돼있는 컴퓨터이기 때문에 대량의 트래픽 공격이 발생하면 결국에 서버가 마비됩니다
 
 
 

Top