SYN 플러딩

From CS Wiki
TCP의 3-Way-Handshake 취약점을 이용한 DoS공격으로 다량의 SYN 패킷을 보내 백로그큐를 가득 채우는 방법을 이용한다.

3-Way-Handshake[edit | edit source]

TCP에서 서버-클라이언트간의 신뢰성 있는 연결을 위한 매커니즘. 클라이언트가 접속을 위해 SYN을 보내면, 서버가 SYN/ACK 으로 요청을 인지했음을 응답하고, 클라이언트가 ACK으로 최종 응답을 함으로써 연결이 이루어진다.
  1. 클라이언트 -> SYN -> 서버
  2. 서버 -> SYN/ACK -> 클라이언트
  3. 클라이언트 -> ACK -> 서버

Backlog Queue[edit | edit source]

Backlog Queue
  • 3-Way-Handshake를 위해 연결이 진행중인 요청을 담아두는 큐
  • SYN Backlog Queue엔 SYN을 보내온 연결요청 정보가 임시로 저장된다.
  • 서버는 SYN에 대해 SYN/ACK을 보내고 ACK을 받기 전까지 저장해 두는 것이다.
  • 큐가 가득차면 다른 연결을 받아들일 수 없게 된다.

SYN Flooding[edit | edit source]

  • 클라이언트가 SYN만 보내고 아무런 동작을 하지 않는다면 해당 연결 요청은 TCP Connection Timeout 시간동안 계속 SYN Backlog Queue에 남아있게 된다.
  • 다수의 클라이언트가 고의로 이런 행동을 한다면 SYN Backlog Queue는 가득 차게 된다.
  • SYN Backlog Queue가 가득차면 더이상의 연결요청을 받아 들일 수 없게된다.

공격 상황[edit | edit source]

  • 공격이 이루어지고 있는 상황은 netstat -an 을 통해 확인 가능하다.
  • 연결 요청중인 목록 중 SYN_RECV로 되어 있는 요청이 많을 경우 Syn Flooding 공격 상황을 의심 해볼 수 있다.
  • SYN_RECV로 된 요청이 많고, 해당 요청 IP가 비정상적인 경우 Syn Flooding 공격일 가능성이 아주 높다.

대응법[edit | edit source]

TCP Connection Timeout[edit | edit source]

  • TCP Connection Timeout 시간을 짧게 설정한다.
  • 단, 너무 짧게 설정할 경우 정상적인 연결요청임에도 느리다는 이유로 연결이 거부되는 경우가 생긴다.

Backlog Queue[edit | edit source]

  • Backlog Queue를 늘린다.
  • 제한된 용량을 무한정 늘릴 수는 없으므로 다른 방법도 병행하여야 한다.
  • 리눅스
# sysctl -w net.ipv4.tcp_max_syn_backlog=1024
  • 유닉스
# ndd -set /dev/tcp tcp_conn_req_max_q1 1024

방화벽[edit | edit source]

  • 방화벽에 의심 패킷에 대한 차단 정책을 추가한다.
  • 예시) 공격이 시도되고 있는 포트로 유사 패킷이 1초당 10개를 초과할 경우 차단한다.
# iptables -A INPUT -p TCP --dport 80 --syn -m limit 10/second -j ACCEPT
# iptables -A INPUT -p TCP --dport 80 --syn -j DROP

SYN COOKIE[edit | edit source]

솔루션[edit | edit source]

  • Anti-DDoS, IDS/IPS, 방화벽/UTM 등 보안 장비, 솔루션을 이용하여 비정상적인 접근을 탐지하여 차단한다.