기술나눔

[HBZ 공유] TCP 플러드 공격을 피하는 방법

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

재래식 홍수 공격의 원리

  1. TCP 두 번째 핸드셰이크가 반 연결을 설정하면 이때 플러드 공격이 시작될 수 있습니다.
  2. 즉, 많은 수의 요청이 두 번째 핸드셰이크 동안 서버는 이러한 요청을 세미 연결 대기열에 넣습니다. 이러한 악의적인 공격 클라이언트는 세 번째 핸드셰이크를 확인하지 않기 때문에 이러한 세미 연결을 처리할 수 없습니다. 해제하면 서버는 시간 초과될 때까지 대기합니다. 이때 세미 연결 대기열이 채워지고 정상적인 요청 연결에 응답할 수 없습니다.

일반적인 홍수 공격을 해결하는 방법

  1. 싱크쿠키 모드가 켜져 있으면 서버는 첫 번째 핸드셰이크 동안 (소스 주소, 소스 포트, 대상 주소, 대상 포트 등)과 난수를 기반으로 해시 값(SHA1)을 계산하고 두 번째 핸드셰이크를 수행합니다. 생성된 싱크쿠키는 클라이언트에 반환됩니다. 클라이언트가 세 번째 핸드셰이크를 확인하면 서버는 싱크쿠키가 이전 것과 일치하는지 확인합니다. 확립된.
  2. 이 접근 방식의 장점: 서버가 수신하지 않거나 수신된 싱크쿠키가 일치하지 않는 경우 TCP 연결이 설정되지 않습니다. 그리고 싱크쿠키를 사용하는 경우 서버는 세미 연결 큐를 유지하지 않습니다. 즉, 세미 연결 상태가 없습니다. 비교를 위해 싱크 쿠키를 사용하므로 세미 연결 큐가 필요하지 않으므로 세미 연결 큐를 피합니다. 채워져 새로운 연결이 수신되지 않습니다.

싱크쿠키가 해결할 수 없는 시나리오

  1. 다수의 DDOS 공격이 실행되면 싱크쿠키 방식도 마비됩니다. 마비되는 이유는 CPU가 많은 수의 싱크쿠키를 계산해야 하므로 CPU가 죽게 되기 때문입니다. 싱크쿠키를 계산하는 것도 CPU 성능을 소모하기 때문에 CPU가 엄청난 양의 DDOS를 처리할 수 없기 때문에 현재로서는 대역폭을 늘리고 하드캡을 구성하는 방법밖에 없습니다.

기타 솔루션

  1. 세미 연결 큐와 전체 연결 큐를 늘립니다. (이 방법은 기본적으로 대규모 공격에는 효과적이지 않습니다.)
  2. SYN+ACK 재전송 횟수를 줄입니다(TCP는 안정적인 연결을 유지하기 위해 재전송에 의존함). 즉, 많은 수의 syn 요청에서 플러드 공격을 받은 경우 서버는 응답을 받을 수 없을 때까지 계속 재시도합니다. 최대 횟수를 줄이면 어느 정도 안심이 될 것입니다.

홍수 피해를 입었는지 확인하는 방법

1. 先进行流量查看:
sar -n DEV 1 -h

然后只看eth0即可-->用rxkb/s 和 rxpck/s 这两列相除-->如果得出的包就50-60几字节,
那就说明是小包搞鬼,有可能遭受洪水攻击了,一般来说最大MTU = 1460

2. 如果发现是小包搞鬼,那就再进行网络抓包, 输入如下命令
tcpdump -i eth0 -n tcp port 80

3. 看有多少个[S], 这个表示发起TCP请求阶段,如果[S]过多,那就说明是洪水攻击,这是洪水攻击的特征


4. 进一步确认是洪水攻击,查询半连接的池子大小,以及当前半连接数量
半连接总大小: cat /proc/sys/net/ipv4/tcp_max_syn_backlog
当前半连接数: ss -s 或 netstat -n -p | grep SYN_RECV | wc -1



[S]: SYN,开始连接
[P]: PSH, 推送数据
[F]: FIN, 结束连接
[R]: RST, 重置连接
[.]: 没有Flag,可能是ACK 也可能是URG

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24