11.11.2012

홍수 아래모든 종류의 포럼 및 채팅에 게시하기 위해 전송되는 메시지 형태의 거대한 데이터 흐름을 의미합니다. 기술적인 측면에서 보면, 홍수가장 일반적인 것 중 하나입니다 컴퓨터 공격의 종류, 그리고 그 목적은 서버 하드웨어가 수행해야 하는 요청의 수를 보내는 것입니다. 서비스 거부사용자 서비스. 만약 컴퓨터 공격로 수행 큰 수컴퓨터, 다음을 다루고 있습니다.

DDoS 플러딩 공격에는 여러 유형이 있으며 주요 유형은 다음과 같습니다.

  • SYN-ACK 플러드
  • HTTP 홍수
  • ICMP 홍수
  • UDP 플러드

SYN-ACK 플러드

SYN-ACK 플러드- 유형 중 하나 네트워크 공격, 이는 단위 시간당 엄청난 수의 SYN 요청을 보내는 것을 기반으로 합니다. 그 결과 서비스가 비활성화되며, 그 작업은 TCP 프로토콜을 기반으로 합니다. 먼저 클라이언트는 SYN 플래그가 포함된 패킷을 서버에 보냅니다. 이 플래그의 존재는 클라이언트가 연결을 설정하기를 원한다는 것을 나타냅니다. 서버는 차례로 응답 패킷을 보냅니다. SYN 플래그 외에 ACK 플래그도 포함되어 있어 요청이 수락되었고 클라이언트가 연결을 확인할 것으로 예상된다는 사실에 클라이언트의 주의를 환기시킵니다. 그는 성공적인 연결에 대한 ACK 플래그가 포함된 패킷으로 응답합니다. 서버는 클라이언트의 모든 "연결" 요청을 특정 크기의 대기열에 저장합니다. 요청은 클라이언트에서 ACK 플래그가 반환될 때까지 대기합니다. SYN 공격은 존재하지 않는 소스에서 대기열 크기를 초과하는 서버로 패킷을 보내는 것을 기반으로 합니다. 서버는 가상 주소의 패킷에 응답할 수 없습니다. 대기열이 줄어들지 않고 서비스가 중지됩니다.

HTTP 홍수

HTTP 홍수- 서비스가 다음과 함께 작동할 때 적용됩니다. 데이터 베이스. 공격은 다음 중 하나를 목표로 합니다. 웹 서버, 또는 데이터베이스와 함께 작동하는 스크립트. 웹 서버가 다른 유형의 요청에 주의를 기울일 수 없도록 엄청난 수의 GET 요청이 포트 80으로 전송됩니다. 로그 파일이 커지고 데이터베이스 작업이 불가능해집니다.

ICMP 홍수

ICMP 홍수- 쉬운 방법 처리량 감소그리고 부하 증가유사한 ICMP PING 요청을 전송하여 스택에서 끝없는 ECHO 요청에 응답하는 서버가 망가지기 때문에 방화벽에 약간의 주의를 기울이면 위험합니다. 따라서 동일한 양의 수신 및 발신 트래픽의 경우 규칙을 작성하십시오. iptables.

UDP 플러드

UDP 플러드- 또 다른 방법 대역폭 혼란, 이는 데이터를 보내기 전에 동기화가 필요하지 않은 프로토콜 작업을 기반으로 합니다. 공격은 서버의 UDP 포트로 패킷을 보내는 일반적인 방법으로 귀결됩니다. 서버는 패킷을 수신한 후 집중적으로 처리하기 시작합니다. 그런 다음 클라이언트는 잘못된 형식의 Udp 패킷을 하나씩 보냅니다. 결과적으로 포트가 작동을 멈추고 시스템이 충돌합니다.

기본적으로 정의 DDoS 공격 유형종종 많은 시간을 할애할 필요가 없습니다. 몇 가지 징후를 아는 것으로 충분합니다. 현저하게 로그 파일의 크기를 늘렸습니다.- 당신이 다루고있다 HTTP 홍수. 만약 서비스에 대한 제한된 액세스허용된 연결 수를 초과한 결과 SYN-ACK 플러드. 만약에 나가는 및 들어오는 트래픽거의 같음- 당신이 다루고있다 ICMP 홍수. 가장 중요한 것은 유지 관리를 잊지 않는 것입니다. 서버의 보안 DDoS로부터 적절한 주의를 기울이십시오. 가장 좋은 것은 돌보는 것입니다

DoS(약어 서비스 거부 "서비스 거부") - 해커 공격시스템의 성실한 사용자가 제공된 시스템 리소스(서버)에 액세스할 수 없거나 이러한 액세스가 어려운 상황을 만들기 위해 컴퓨팅 시스템에 오류를 가져옵니다.

DoS/DDoS 공격에는 두 가지 유형이 있으며 가장 일반적인 공격은 플러딩(flooding), 즉 엄청난 수의 패킷으로 피해자를 플러딩(flooding)한다는 개념에 기반합니다. 플러드는 ICMP 플러드, SYN 플러드, UDP 플러드 및 HTTP 플러드와 같이 다를 수 있습니다. 최신 DoS 봇은 이러한 모든 유형의 공격을 동시에 사용할 수 있으므로 사전에 각각에 대한 적절한 보호를 관리해야 합니다.

DoS 공격 탐지

SYN 플러드

"반개방" TCP 연결 수를 계산하여 SYN 플러드의 존재를 쉽게 확인할 수 있습니다. 정상적인 상황에서는 전혀 없어야 합니다(또는 매우 적은 양: 최대 1-3).

DoS 보호

    조각 - 패킷을 차단합니다. 프로토콜의 기능적 목적으로 인해 ICMP 패킷은 매우 작아야 하고 일반적으로 MTU에 맞아야 하므로 조각의 존재는 일반적으로 오류 또는 공격 시도를 나타냅니다. iptables -A 입력 -p icmp -f -j DROP

    사용자를 대신하여 스푸핑을 방지합니다. iptables -A INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j LOG --log-level 정보 --log-prefix "DROP SYN,ACK: " iptables - A INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset

    결국 아직 열려 있지 않은 연결에서 SYN 및 ACK 플래그가 설정된 패킷(SYN 패킷에 대한 응답에만 플래그 조합이 있음)을 수신하면 누군가가 SYN 패킷을 다른 호스트로 보냈음을 의미합니다. 우리를 대신하여 응답이 왔습니다. 물론 공격자는 여전히 시퀀스 번호를 추측해야 하지만 그런 기회를 주지 않는 것이 좋습니다. 위의 규칙에 따라 호스트는 RST 패킷으로 응답하고 공격을 받은 호스트는 연결을 닫습니다. 이러한 규칙을 방화벽 구성에 추가하는 것이 좋습니다. 공격자가 사용자를 대신하여 스푸핑하는 경우 이 에피소드를 조사할 때 추적이 사용자로 연결되기 때문입니다.

SYN 플러드

통신 채널을 차단할 뿐만 아니라 침입하는 일반적인 방법 중 하나입니다. 네트워크 스택운영 체제를 더 이상 새 연결 요청을 수락할 수 없는 상태로 만듭니다. 존재하지 않는 반환 주소로 SYN 패킷을 전송하여 많은 수의 동시 TCP 연결을 초기화하려는 시도를 기반으로 합니다. 도달할 수 없는 주소로 응답 ACK 패킷을 보내려고 여러 번 시도한 후 대부분의 운영 체제는 설정되지 않은 연결을 대기열에 넣습니다. 그리고 n번째 시도 후에야 연결이 닫힙니다. ACK 패킷의 흐름이 매우 크기 때문에 곧 대기열이 가득 차고 커널은 새 연결 시도를 거부합니다. 가장 똑똑한 DoS 봇은 또한 공격을 시작하기 전에 시스템을 분석하여 중요한 포트만 열도록 요청을 보냅니다. 이러한 공격을 식별하는 것은 간단합니다. 서비스 중 하나에 연결을 시도하기만 하면 됩니다. 방어 조치에는 일반적으로 다음이 포함됩니다.

"반개방" TCP 연결 대기열을 늘립니다.

# sysctl -w net.ipv4.tcp_max_syn_backlog=1024

"반개방" 연결의 유지 시간 줄이기:

# sysctl -w net.ipv4.tcp_synack_retries=1

TCP 동기화 메커니즘 활성화:

# sysctl -w net.ipv4.tcp_syncookies=1

UDP 플러드

대역폭 클러터 방법. 다양한 UDP 서비스의 포트에 UDP 패킷을 끝없이 보내는 것을 기반으로 합니다. 이러한 서비스를 외부 세계에서 차단하고 단위 시간당 연결 수를 제한하면 쉽게 제거됩니다.

#포트 80에서 5개의 연결 제한을 설정합니다. iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j REJECT # 하나의 IP에서 smtp로 하나의 동시 연결만 허용 iptables -A FORWARD -p tcp --syn --dport smtp -m connlimit --connlimit-above 1 -j DROP # 포트 1720에서 연결 제한을 200개로 설정합니다. iptables -A INPUT -p tcp --syn --dport 1720 -m connlimit --connlimit-above 200 -j REJECT # udp 5060 $IPT -A INPUT -p udp --dport 5060 -m connlimit --connlimit-above 60 -j LOG --log-level 정보 --log-prefix "REJECT 5060: " $IPT -A INPUT -p udp --dport 5060 -m connlimit --connlimit-above 60 -j REJECT # tcp 1720 $IPT -A INPUT -p tcp --syn --dport 1720 -m connlimit --connlimit-above 60 -j LOG --log-level 정보 --log-prefix "거부 1720: " $IPT -A INPUT -p tcp --syn --dport 1720 -m connlimit --connlimit-60 이상 -j 거부

ICMP 홍수

ICMP 요청의 단조로운 전송을 통해 대역폭을 조절하고 네트워크 스택에 로드를 생성하는 매우 원시적인 방법은 ECHO 네트워크 혼잡 진단 프로토콜(ping)입니다. 양방향 트래픽 흐름을 분석하여 쉽게 감지할 수 있습니다. ICMP 플러드 공격 중에는 거의 동일합니다. 거의 고통 없는 절대 보호 방법은 ICMP ECHO 요청에 대한 응답을 비활성화하는 것입니다.

sysctl net.ipv4.icmp_echo_ignore_all=1

또는 방화벽 사용:

Iptables -A INPUT -p icmp -j DROP --icmp-유형 8

HTTP 홍수

    프로세스 수 ps aux | 그렙 아파치 | 화장실 -l

    포트 80의 연결 수 netstat -na | grep ":80" | 화장실 -l

    목록 보기 IP 주소연결 요청이 이루어지는 곳: netstat -na | grep ":80" | 정렬 | 유니크 -c | 정렬-nr

시스템

    스푸핑 방지 net.ipv4.conf.default.rp_filter = 1

    1분마다 TCP 연결을 확인합니다. 반대편에 합법차가 있으면 바로 대응합니다. 기본값은 2시간입니다. net.ipv4.tcp_keepalive_time = 60

    10초 후에 다시 시도하십시오. net.ipv4.tcp_keepalive_intvl = 10

    연결을 닫기 전 확인 횟수 net.ipv4.tcp_keepalive_probes = 5

데비안: DDoS 퇴치

기본적으로 Debian OS 및 기타 OS는 봇넷에 의해 생성된 수많은 연결을 지원할 수 없습니다. TCP/IP 스택을 강화하려면 커널 구성을 변경해야 합니다. 이러한 구성의 예:

net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.core.rmem_max = 996777216 net.core.wmem_max = 996777216 .tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_mem= 786432 1048576 996777216 net.ipv4.tcp_wmem = 4096 87380 4194304 net.ipv4.tcp_max_orphans = 2255360 net.core.netdev_max_backlog = 10000 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_keepalive_intvl = 15 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 494967295 kernel.shmall.5.4 260con

커널 구성을 조심스럽게 변경하고 서버를 재부팅하십시오 ...

FreeBSD: DDoS 퇴치

SYN-ACK 요청에 대한 응답 패킷의 대기 시간을 줄입니다(SYN 플러드에 대한 보호).

# sysctl net.inet.tcp.msl=7500

우리는 서버를 블랙홀로 만듭니다. 따라서 커널은 비어 있는 포트에 연결을 시도할 때 응답 패킷을 보내지 않습니다.

# sysctl net.inet.tcp.blackhole=2 # sysctl net.inet.udp.blackhole=1

ICMP 메시지에 대한 응답 수를 초당 50개로 제한합니다(ICMP 플러딩에 대한 보호).

# sysctl net.inet.icmp.icmplim=50

우리는 증가 최대 금액서버 연결(모든 유형의 DDoS에 대한 보호):

# sysctl kern.ipc.somaxconn=32768

우리는 DEVICE_POLLING을 켭니다 - 높은 부하에서 커널에 의한 네트워크 드라이버의 자체 폴링(DDoS "a 동안 시스템의 부하를 크게 줄임):

"options DEVICE_POLLING" 옵션으로 커널을 다시 빌드하십시오. 폴링 메커니즘 활성화: "sysctl kern.polling.enable=1"; /etc/sysctl.conf에 "kern.polling.enable=1" 항목을 추가합니다.

시스템에서 DDoS 폭풍이 붕괴하는 동안 교착 상태에 빠지지 않으려면 다음과 같은 상황에 대해 신중하게 준비해야 합니다.

    외부 네트워크에 직접 액세스할 수 있는 모든 서버는 간단하고 빠른 원격 재부팅을 준비해야 합니다(sshd는 러시아 민주주의의 아버지를 구할 것입니다). 큰 장점은 기본 채널이 막힌 경우 서버에 액세스할 수 있는 두 번째 관리 네트워크 인터페이스가 있다는 것입니다.

    서버에서 사용되는 소프트웨어는 항상 최신 상태여야 합니다. 모든 구멍이 패치되고 업데이트가 설치됩니다(단순한 부팅, 많은 사람들이 따르지 않는 조언). 이렇게 하면 서비스의 버그를 악용하는 DoS 공격으로부터 사용자를 보호할 수 있습니다.

    관리용으로 의도된 모든 수신 네트워크 서비스는 액세스할 수 없어야 하는 사람이 볼 수 없도록 방화벽 뒤에 숨겨져 있어야 합니다. 그러면 공격자는 이를 사용하여 DoS 공격이나 무차별 대입을 수행할 수 없습니다.

    서버(가장 가까운 라우터)에 접근할 때 트래픽 분석 시스템(도움을 위한 NetFlow)을 설치해야 합니다. 이를 통해 초기 공격에 대해 적시에 학습하고 이를 방지하기 위한 적시에 조치를 취할 수 있습니다.

SYN 플러드 공격은 공격자가 TCP 프로토콜을 사용하는 대상 시스템의 서비스에 대량의 SYN 요청을 보내는 서비스 거부 공격의 한 형태입니다. 이는 서버 리소스를 소모하여 시스템이 정상적인 트래픽에도 응답하지 않도록 합니다. 이 공격은 TCP 프로토콜을 사용하지만 주로 웹 서비스를 사용하는 모든 서비스에서 발생할 수 있습니다. 이 자습서에서는 SYN 플러드 공격의 기본 사항과 완화 단계를 자세히 살펴봅니다.

SYN Flood 공격은 3방향 핸드셰이크라고 하는 TCP(Transmission Control Protocol)의 구현 특성을 악용합니다. 다음은 일반적인 3방향 핸드셰이크에서 발생하는 단계입니다.

1. 클라이언트는 서버에 SYN(동기화) 메시지를 전송하여 연결을 요청합니다.
2. 서버는 SYN-ACK를 클라이언트에 다시 전송하여 이 요청을 승인합니다.
3. 클라이언트는 ACK로 응답하고 연결이 설정됩니다.

SYN 플러드 공격은 예상한 ACK 코드로 서버에 응답하지 않음으로써 작동합니다. 이러한 반개방 연결에 의해 대상 시스템 TCP 백로그가 채워지므로 모든 새 연결이 무시될 수 있습니다. 이로 인해 합법적인 사용자도 무시됩니다.

이 공격은 두 가지 방식으로 발생할 수 있습니다.

1. 직접 공격

이러한 종류의 공격에서 공격자는 IP 소스 주소를 스푸핑하지 않고 SYN 세그먼트를 빠르게 전송합니다. 이러한 유형의 공격이 탐지되면 공격할 공격자의 소스 IP 주소가 있는 패킷을 차단하는 간단한 방화벽 규칙을 추가할 수 있기 때문에 이러한 유형의 공격은 방어하기가 매우 쉽습니다.

2.IP 주소 스푸핑 사용

이것은 직접 공격보다 더 복잡한 형태의 공격입니다. 이 방법에서 악의적인 시스템은 스푸핑된 IP 주소에서 대상 시스템으로 SYN 요청 플러드를 전송하여 서버가 SYN-ACK를 위조된 IP 주소로 보내도록 합니다. SYN을 보냈습니다.

SYN 플러드 공격 탐지

웹 사이트 방문자에 대한 SYN Flood 공격의 일반적인 증상은 사이트가 로드하는 데 오랜 시간이 걸리거나 페이지의 일부 요소를 로드하지만 다른 요소는 로드하지 않는 것입니다. 웹 서버에 대한 SYN Flood 공격이 의심되는 경우, 당신은 할 수 있습니다"SYN_RECEIVED" 상태의 웹 서버 연결 요청을 확인하는 데 사용합니다.

netstat 참치 | 그렙:80 | 그렙 SYN_RECV

이 상태에서 많은 연결이 표시되면 서버가 SYN Flood 공격을 받을 수 있습니다. 단일 IP 주소에서 많은 수의 SYN_RECV 패킷을 사용하여 직접 공격하는 경우 해당 IP 주소를 방화벽에 추가하여 이 공격을 중지할 수 있습니다. 서버에 APF 또는 방화벽이 설치된 경우 다음 명령을 실행하여 이를 수행할 수 있습니다.

apf -d IP 주소
csf -dIPADDRESS

SYN Flood 공격 방어

SYN 쿠키 사용

이것은 SYN Flood 공격을 방어하는 가장 효과적인 방법입니다. SYN 쿠키를 사용하면 서버가 SYN 대기열이 가득 찼을 때 연결이 끊기는 것을 방지할 수 있습니다. 대신 서버는 SYN 대기열이 확장된 것처럼 작동합니다. 서버는 적절한 SYN+ACK 응답을 클라이언트에 다시 보내지만 SYN 대기열 항목은 버립니다. 그런 다음 서버가 클라이언트로부터 후속 ACK 응답을 받으면 TCP 시퀀스 번호로 인코딩된 정보를 사용하여 SYN 대기열 항목을 재구성할 수 있습니다.

SYN 쿠키는 /etc/sysctl.conf에 다음을 추가하여 활성화할 수 있습니다.

net.ipv4.tcp_synccookies=1

sysctl 구성 파일을 수정한 후 다음 명령을 실행하여 /etc/sysctl.conf 파일에서 sysctl 설정을 로드해야 합니다.

SYN 백로그 대기열 늘리기

선택적 방어 기술은 SYS 백로그 큐 크기를 늘리는 것입니다. 기본 크기는 1024입니다. 이것은 /etc/sysctl.conf에 다음을 추가하여 수행할 수 있습니다.

net.ipv4.tcp_max_syn_backlog=2048

SYN_ACK 재시도 줄이기

커널 매개변수 tcp_synack_retries를 조정하면 커널이 SYN_RECV 상태 연결을 더 일찍 닫습니다. 기본값은 5입니다.

net.ipv4.tcp_synack_retries = 3

SYN_RECV 시간 초과 설정

SYN_RECV의 시간 초과 값을 낮추면 SYN 플러드 공격을 줄이는 데 도움이 됩니다. 기본값은 60이며 40 또는 45로 줄일 수 있습니다. 이것은 sysctl.conf에 다음 줄을 추가하여 수행할 수 있습니다.

net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv=45

IP 스푸핑 방지

다음 sysctl 매개변수는 SYN 플러드 공격에 사용되는 IP 스푸핑으로부터 보호하는 데 도움이 됩니다.

net.ipv4.conf.all.rp_filter = 1

많은 호스팅 회사는 Netscreen 또는 Appsafe와 같은 SYN 플러드 방어를 사용하는 방화벽을 배포하여 SYN 공격에 대한 보호 기능을 제공합니다.

DoS/DDoS 공격은 기본 가용성 서비스를 방해하는 것을 목표로 합니다. DoS/DDoS 공격의 주요 목표는 공격받은 개체를 서비스에서 제외하고 합법적인 사용자가 해당 리소스에 액세스할 수 없도록 하는 것입니다. 서비스 거부 공격은 다음 두 가지 방법으로 수행할 수 있습니다. 소프트웨어시스템을 공격하고 특별히 구성된 네트워크 패킷(플러드)을 대량으로 전송합니다.

첫 번째 방법은 더 어렵고 공격자의 더 높은 자격이 필요합니다. 두 번째 방법은 "무차별 대입"을 기반으로 합니다. 이 아이디어는 공격자가 보낸 엄청난 수의 패킷을 처리하여 서버의 컴퓨팅 리소스를 로드하는 것입니다. 이러한 서버 로딩은 기껏해야 서버가 정당한 사용자의 처리 요청을 수락할 수 없다는 사실로 이어질 수 있으며, 최악의 경우 서버 정지 및 종료로 이어질 수 있습니다.

여기에서 시스템 리소스 로드를 목표로 하는 두 가지 유형의 공격을 구별할 수 있다는 점에 주목할 가치가 있습니다. 첫 번째 경우에는 서버의 컴퓨팅 리소스가 로드되고 다른 경우에는 통신 채널의 대역폭이 로드됩니다. 개발된 기술은 첫 번째 유형의 공격으로부터 보호하는 데 중점을 두고 있으므로 처리량이 서버가 지정된 모든 트래픽을 수신하기에 충분하다고 가정합니다.

많은 DoS/ 디도스 공격공격자가 보낸 패킷을 서버에서 처리한 결과는 공격자에게 중요하지 않습니다. 이는 공격자가 잘못된 IP 주소(이 개념을 스푸핑이라고 함)에서 잘못된 요청 스트림을 보낼 수 있음을 의미하며, 이는 공격자가 탐지되지 않고 그러한 공격에 효과적으로 대응하는 것을 방지합니다.

성공적인 DoS 공격을 수행하려면 상당히 높은 채널 대역폭이 필요합니다. 따라서 대부분의 경우 서비스 거부 공격은 여러 시스템에서 동시에 수행됩니다. 많은 수의 시스템이 관련된 공격을 DDoS라고 합니다. 분산 공격의 경우 공격자의 소유가 아닌 특수 소프트웨어에 감염된 시스템을 사용할 수 있다는 점은 주목할 가치가 있습니다. 이러한 감염된 기계를 "좀비"라고 합니다. "좀비"를 얻는 한 가지 방법은 평화로운 사용자의 컴퓨터에 "트로이 목마"를 대량으로 도입하는 것입니다. 외부에서 명령을 받은 이러한 "트로이 목마"는 인터넷에 액세스할 수 있는 "평화로운" 컴퓨터를 서버 리소스 과부하를 목표로 하는 잘못된 요청의 소스로 바꿉니다.

가장 일반적인 DoS 공격은 다음과 같습니다.

TCP SYN 플러드 또는 TCP SYN

죽음의 핑

TCP 전송 계층 프로토콜을 사용하는 애플리케이션 서비스를 노리는 TCP SYN(tcp syn flood) 공격에 대해 자세히 살펴보자. 이 프로토콜은 전송된 모든 데이터의 100% 전달을 보장하기 때문에 정보 시스템에서 널리 보급되었습니다. 이 프로토콜을 전송으로 사용하여 상호 작용하는 네트워크 노드는 서로 간에 TCP 연결을 설정하며, 그 안에서 수신자가 발신자가 보낸 모든 패킷을 수신하도록 제어됩니다. 이것은 수신자가 수신한 패킷을 발신자에게 통지함으로써 달성됩니다. 그를 위해 의도된 모든 패킷이 수신자에게 도달하지 않은 경우 발신자는 패킷을 다시 보냅니다. 보시다시피 이 프로토콜의 장점은 연결을 설정할 수 있다는 것입니다. 특히 연결의 현재 상태에 대한 정보를 저장하기 위해 프로토콜에서 사용하는 패킷의 비트 플래그 필드가 사용됩니다. 8비트는 이 필드에 예약되어 있지만 그 중 2개는 예약되어 있으며 현재 URG(긴급 플래그), ACK(승인 플래그), PSH(푸시 기능 플래그), RST(리셋 플래그), SYN(동기화)의 6개 플래그만 사용됩니다. ) 및 FIN(종료 플래그). 불행히도 표준에서 설정한 연결 설정 메커니즘은 완벽하지 않으며 고려 중인 공격은 단점을 사용합니다.

이 TCP SYN 공격의 주요 목표는 설정 상태에 있는 TCP 연결 수의 제한을 초과하는 것입니다. TCP 연결을 설정하는 절차를 고려하십시오. 먼저 연결을 시작한 클라이언트가 서버에 TCP-SYN 요청을 보냅니다. 이러한 요청을 받으면 서버는 특별히 설계된 버퍼에 연결 매개변수에 대한 메모리를 할당합니다. 그런 다음 SYN+ACK 플래그가 있는 패킷을 TCP 클라이언트에 보냅니다. SYN+ACK 패킷을 받으면 클라이언트는 서버에 승인 패킷을 보내야 합니다. ACK 플래그가 설정된 패킷 서버가 이 패킷을 수신하고 처리하면 연결이 설정됩니다. 전술 한 바와

절차는 그림 1에 나와 있습니다. 1.1

쌀. 1.1

TCP SYN 공격은 다음과 같이 수행됩니다. 공격자는 TCP 프로토콜 집합의 SYN 플래그를 사용하여 많은 수의 패킷을 생성합니다. 패킷을 수신할 때 공격받은 시스템은 연결 매개변수를 저장하기 위해 메모리를 할당하고 응답을 보냅니다. SYN + ACK 플래그가 있는 패킷이고 ACK 플래그가 있는 패킷을 예상합니다. 분명히 그녀는 예상된 응답을 받지 못할 것이며 메모리는 설정된 시간 초과가 만료된 후에만 해제됩니다. 일정 시간이 지나면 연결의 TCP 매개변수를 저장하기 위해 할당된 버퍼가 완전히 차서 시스템이 새 연결을 설정할 수 없게 됩니다. 그 후, 각각 추가 요청부담을 더욱 증가시킵니다. 그러한 공격은 필요하지 않습니다 피드백따라서 공격자는 발신자의 임의 IP 주소로 패킷을 생성할 수 있습니다.

공격자의 피드백이 부족하면 TCP-SYN 공격을 감지하고 차단하는 것이 매우 어렵습니다.

위협으로부터 보호하기 위한 목표 설정

현재 TCP SYN 공격을 탐지하는 효과적인 방법은 공개 문헌에 알려져 있지 않습니다. 최신 운영 체제에는 SYN 쿠키와 같이 공격받은 서버를 보호하는 메커니즘이 있습니다. 운영 체제는 일부 매개변수가 초과되었음을 감지하면 자동으로 보호 기능을 켭니다. 예를 들어 Windows 2000은 TcpMaxHalfOpen, TcpMaxHalfOpenRetried, TcpMaxPortsExhausted의 세 가지 매개변수 값을 모니터링합니다. 이러한 설정의 임계값에는 기본값이 있으며 관리자가 변경할 수 있습니다. 초기 값이 특정 서버에 적합하지 않은 경우 관리자는 보호를 효과적으로 구성하기 어려운 작업을 수행합니다. 또한 이 방법을 사용하려면 일부 네트워킹 전문가가 TCP 프로토콜의 "심각한 위반"으로 간주하는 TCP/IP 스택 구현에 대한 적절한 변경이 필요합니다.

OS에 통합된 TCP 공격 탐지 도구의 또 다른 단점은 과부하(프로세서 및 메모리 리소스 부족을 의미)가 발생하거나 시스템 자체가 정지되는 경우 대응책도 작동할 수 없게 된다는 것입니다.

마스터 작업의 목적은 TCP SYN 공격을 탐지하는 수학적으로 건전한 방법을 만드는 것입니다. 이렇게 하려면 TCP 서버와 클라이언트의 상호 작용을 설명하는 수학적 모델을 구축해야 합니다. 이러한 모델의 초기 매개변수는 서버 및 통신 채널의 특성이어야 하며, 출력 매개변수는 TCP-SYN 공격의 유무에 대한 설명이어야 합니다.

중요한 자원을 보호하기 위해 제안된 방법론을 실제로 사용할 수 있습니다. 기업 네트워크특정 서버 및 연결된 네트워크에 대한 모델의 입력 매개변수의 실제 값을 결정하는 데도 도구가 필요합니다.

면책 조항 1: 기사가 다소 구겨지고 많은 주제가 완전히 다루어지지 않은 점을 용서해 주십시오. 댓글에 질문을 남겨주세요. 나는 차례로 가장 많은 것을 공개하려고 노력할 것입니다. 흥미로운 주제미래의 기사에서.

면책 조항 2: "SYN 공격으로부터 서버를 보호하는 방법" 또는 "Linux DDoS 보호"라는 제목의 기사가 인터넷에 많이 있습니다. 나는 그들 중 많은 사람들이 절대 맹목적으로 신뢰해서는 안된다는 것을 경고해야합니다! 그들은 종종 공격 중에 무슨 일이 일어나고 있는지 잘 이해하지 못하고 미친 짓을 할 것을 권장하는 사람들에 의해 작성됩니다. 누군가가 sysctl을 "최적화"하여 정상적인 트래픽도 서버로 가는 것을 중지하고 대부분은 범주적으로 syncookies를 활성화하도록 조언합니다. 대부분의 실제 공격으로는 불가능합니다!

이 문서에는 3가지 목표가 있습니다.

SYN 공격이란?

SYN 플러드 또는 SYN 공격은 TCP 서버 프로세스를 실행하는 호스트에 영향을 미치는 서비스 거부 기술입니다. 이 공격은 TCP가 LISTEN 상태에 있는 포트에서 SYN 세그먼트를 수신한 후 세션 상태를 저장한다는 사실을 이용합니다. 주요 아이디어는 호스트가 잘못된 반개방 세션에 대해 너무 많은 상태를 저장하여 새 연결을 설정하기 위한 리소스가 남지 않도록 하여 이 동작을 악용하는 것입니다(RFC4987).

SYN 플러딩은 상대적으로 처리하기 어렵기 때문에 이러한 유형의 공격이 널리 사용됩니다. 왜요?

1) 랜덤 소스 IP가 일반적으로 사용되며, 이는 각 패킷에서 재생성되기 때문에 금지할 필요가 없습니다.
2) SYN 공격은 공격자 측에서는 적은 자원을 소모하고 피해자 측에서는 많은 자원을 소모합니다.
3) 이러한 유형의 공격에 대한 보호는 매우 복잡하고 미묘한 차이가 있으며 이해하고 구현하는 데 시간이 걸립니다.

잠재적으로 공격할 수 있는 서버(사실, 공개 IP 주소를 가진 모든 서버, 특히 웹 서버)는 사전에 SYN 공격으로부터 보호되어야 한다고 생각합니다.

그림 1: SYN 공격

SYN 공격은 어떻게 수행됩니까?

공격을 수행하는 데 자주 사용되는 유틸리티의 예는 hping3입니다. 공격자가 여러분을 대신해 수행하기 전에 이를 사용하여 서버를 스트레스 테스트할 수 있습니다.

hping3은 다양한 매개변수를 사용하여 다양한 유형의 공격을 수행할 수 있는 기능이 풍부한 유틸리티입니다. 나는 사용에 대한 마스터 클래스를 제공하지 않을 것이며 작은 SYN 공격에 대한 취약성을 서버에서 확인할 수 있는 방법의 예만 보여줄 것입니다.

# hping3 -S<--fast|--faster|--flood>-p 80 xx.xx.xx.xx

이 예에서 80(HTTP)은 대상 포트입니다. 공격이 서로 어떻게 다른지 보려면 다른 옵션(hping3 --help)을 살펴보십시오.

이 유틸리티는 자신의 리소스를 테스트할 때만 주의해서 사용하십시오! 솔직히 말해서 대부분의 인터넷은 공격자가 공격받은 것보다 훨씬 작은 채널을 가지고 있더라도 이러한 간단한 작업에 취약합니다.

SYN 공격을 식별하고 측정하는 방법은 무엇입니까?

1) SYN 공격 중에 공격자는 서버에 대한 많은 연결을 열지만 닫지 않으며 연결은 SYN_RECV 상태에서 계속 중단됩니다. 다음과 같이 계산할 수 있습니다.

# netstat -anutp | grep SYN_RECV | 화장실 -l

이 숫자가 30보다 크면 아마도 SYN 공격을 받고 있을 것입니다.

2) vnstat를 사용하여 현재 네트워크 부하를 모니터링할 수 있습니다.

# vnstat -l -i eth0

이것은 공격이 얼마나 강력한지 이해하는 데 도움이 되는 매우 유용한 유틸리티입니다.

F2 키를 누르고 "디스플레이 옵션"으로 이동하여 "다른 색상으로 스레드 표시"를 선택합니다. 분홍색에서는 시스템 인터럽트로 인한 부하를 볼 수 있습니다.

4) 서버가 수신하는 SYN을 검토합니다. 공통점은 무엇입니까? "-c 100"은 tcpdump가 자신을 100개의 패킷으로 제한하도록 지시합니다.

# tcpdump -i eth0 -nn "tcp 포트 80" 및 "tcp == 2" -c 100

마지막으로, 많은 SYN 공격은 "균일"하지 않으며 분석 프로세스에서 고려해야 하는 피크와 딥이 있음을 기억하십시오.



그림 2. 일반적인 공격의 역학

먼저 첫 번째 것들

NIC, 인터럽트, 큐...

가장 먼저 작업해야 할 것은 드라이버입니다. 네트워크 카드. 프레임이 네트워크 카드에 도착하면 시스템 인터럽트를 시작해야 합니다. 이 인터럽트는 프로세서에 현재 작업을 일시 중단하고 들어오는 트래픽 부분을 처리하도록 지시합니다. 그러나 각 프레임이 즉각적인 인터럽트를 일으키고 현재 작업에서 CPU를 "산만하게"하면 FTP를 통한 파일 전송과 같은 가장 간단한 네트워크 작업에서도 눈에 띄는 성능 저하가 관찰될 수 있습니다. 따라서 이러한 인터럽트는 네트워크 카드에 누적되고 한 번에 프로세서에 의해 처리되는 대기열로 구성됩니다. 일반적으로 이것은 초당 250-1000번 발생하며 빈도는 적습니다. CPU 로드가 낮을수록 지연이 커집니다.

반면에 대부분의 최신 데스크탑 및 서버에는 다중 프로세서 코어가 있습니다. 각각이 OS에 대해 별도의 프로세서로 작동하기 때문에 인터럽트로 인한 부하를 그들 사이에 고르게 분배할 수 있습니다. 2가지 방법이 있습니다.

1) 첫 번째 권장 사항은 하드웨어 대기열을 사용하는 것입니다. 최신 NIC에는 일반적으로 4-16개의 인터럽트 대기열이 여러 개 있습니다. 어떤 이유로 Linux에서는 기본적으로 비활성화되는 경우가 많습니다. 이를 활성화한 다음 프로세서 간에 균등하게 배포해야 합니다.

2) 두 번째 방법은 RPS(Receive Packet Steering)라고 합니다. 예쁘다 새로운 메커니즘모든 코어 간에 부하를 자동으로 분산하는 커널은 카드에 여러 하드웨어 대기열이 있는지 여부가 중요하지 않습니다. 하드웨어 대기열보다 더 많은 코어가 있는 경우에만 이 방법을 사용하십시오(그런데 SMT/HyperThreading 비활성화를 고려하십시오. 공격 중에 유용할 것입니다).


그림 3. Intel 10Gb NIC

취해야 할 단계:

1) 네트워크 카드의 제조사와 모델을 파악합니다. (인텔이라면 더 좋을 것입니다.)

# ethtool -i eth0

2) 설치 최신 드라이버. 네트워크 카드 칩 제조업체의 웹 사이트로 이동하여 다운로드 최신 버전 Linux용 드라이버(이를 빌드하려면 현재 커널의 소스가 필요함)

3) 하드웨어 대기열을 설정합니다. 이렇게 하려면 함께 제공되는 네트워크 카드 드라이버의 설명서를 사용해야 합니다. igb용( 인텔 드라이버) 8개의 대기열과 4개의 포트가 있는 경우 다음과 같습니다.

# rmmod igb
# modprobe igb QueuePairs=1,1,1,1 RSS=8,8,8,8 IntMode=3,3,3,3 InterruptThrottleRate=3000,3000,3000,3000

RHEL/CentOS의 igb 드라이버의 경우 /etc/modprobe.conf에 드라이버 옵션 라인을 추가하고 재부팅하면 됩니다.

옵션 igb QueuePairs=1,1,1,1 RSS=8,8,8,8 IntMode=3,3,3,3 InterruptThrottleRate=3000,3000,3000,3000

4) 인터럽트 부하를 코어 간에 균등하게 분배합니다.
카드가 사용하는 인터럽트 번호(이 경우 eth0)를 결정해야 합니다.

# 고양이 /proc/인터럽트 | 그렙 eth0

여기에서 NIC가 사용하고 있는 모든 인터럽트 번호와 현재 코어에 어떻게 분포되어 있는지 확인할 수 있습니다. 이 숫자를 적어 두십시오. 이제 각 인터럽트에 자체 코어를 할당하기 위해 SMP 선호도를 변경해야 합니다(인터럽트 1 > cpu 1, 인터럽트 2 > cpu 2 등). 완료 방법은 다음과 같습니다.

# 에코 > /proc/irq/xx/smp_affinity

5) 선택 사항: RPS 활성화(필요하지 않을 수 있음, 위 참조)

# 에코 f > /sys/class/net/eth0/queues/rx-0/rps_cpus

적절한 장치(eth0이 아닌 경우)와 지원하는 모든 수신 대기열(rx-0..n)을 선택합니다.

시스템

다음은 sysctl입니다. 이것은 많은 시스템 설정을 즉석에서 구성할 수 있는 소프트웨어 인터페이스입니다. 그러나 이 기사에서는 SYN 공격으로부터 보호하기 위해 SYN을 사용하는 방법에 대해 논의하지 않을 것입니다.

대부분의 "고문"이 생각하는 것과는 달리 서버를 소유한 모든 사람에게 적합한 "보편적 최적화"는 없습니다. 모든 소위 최적화는 메모리 소비 증가 또는 접근성/기능 감소와 같은 결과를 낳습니다. 물론 특정 변경 사항을 적용해야 하지만 이 주제는 이 주제보다 더 광범위한 별도의 기사가 필요합니다.

중요하고 자주 오용되는 것으로 주목하고 싶은 유일한 것은 소위 syncookies입니다. 간단히 말해서, 이것은 연결의 정당성을 확인하기 위해 각 SYN 요청에 대한 응답으로 쿠키를 전송하여 SYN 공격을 방지하기 위한 시스템 전체 메커니즘입니다. 사실 이것은 공격 비율이 서버의 유효 대역폭의 40% 이하인 경우에 매우 유용할 수 있다는 것입니다. 처리량, 서버가 실제로 처리할 수 있음). 다른 경우에는 syncookie를 사용하면 네트워크, CPU의 부하가 증가하여 서비스 거부가 발생합니다.

개인적으로 대부분의 경우 syncookies를 비활성화합니다.

iptables를 사용한 기본 보안 기술

방화벽을 "강화"하는 것을 잊지 마십시오. 서버에 실제로 필요한 트래픽을 제외한 모든 들어오는 트래픽을 차단하십시오. 신뢰할 수 있는 네트워크에서만 관리를 허용합니다.

가장 간단한 경우는 주소 대체(스푸핑) 없이 1개의 IP에서 공격하는 것입니다. 다음은 다루기 쉽습니다.

# iptables -A 입력 -p tcp -m 상태 --상태 NEW -m 최근 --update --seconds 60 --hitcount 20 -j DROP
# iptables -A INPUT -p tcp -m state --state NEW -m 최근 --set -j ACCEPT

이러한 규칙은 주소당 SYN 패킷 수를 분당 20개로 제한합니다. 그냥 항상 사용하지 마십시오! NAT 뒤에서 합법적인 트래픽을 차단할 수 있습니다.

많은 SYN 공격은 유틸리티 "sin"을 공격하는 "비정상적"이고 반복적인 TCP 헤더 매개변수로 걸러낼 수 있습니다.

첫 번째 매개변수는 MSS(Maximum Segment Size) - 연결을 시작하는 호스트가 허용하려는 최대 세그먼트 크기입니다. 대부분의 공격 도구(hping 포함)는 기본적으로 이 옵션을 활성화하지 않습니다. 반면에 나는 아직 그것을 설치하지 않을 합법적인 클라이언트를 보지 못했습니다. "Normal" 값의 범위는 536에서 65535까지입니다. 다음을 사용하겠습니다.

# iptables -t mangle -I PREROUTING -p tcp -m tcp --dport 80 -m state --state NEW -m tcpmss ! --mss 536:65535 -j 드롭

그런데 맹글 테이블은 필터보다 먼저 처리되기 때문에 빠르지만 모든 트래픽이 이를 통과하며 INPUT, OUTPUT, FORWARD를 분리할 방법이 없습니다.

또 다른 극도로 유용한 매개변수 TCP 창 크기입니다. 대부분의 공격자는 매번 생성하지 않으며 공격 내내 동일하게 유지됩니다. 창 크기별로 세그먼트를 필터링하고 차단하려면 iptables용 u32 모듈이 필요합니다. 공격 창의 크기(예: 512)를 알게 되면 16진수(이 경우 0x200)로 변환하고 다음 명령을 실행합니다.

# iptables -t mangle -I PREROUTING -d xx.xx.xx.xx -p tcp -m u32 --u32 "6&0xFF=0x6 && 32&0xFFFF=0x200" -j DROP

하지만 조심해! 널리 사용되는 운영 체제에서 사용되는 잘 알려진 창 크기를 차단하지 마십시오.

마지막으로 TTL(Time To Live) 매개변수에 대해 언급하겠습니다. 값의 범위가 작고 잘못된 사람을 거의 확실히 차단할 것이기 때문에 이것이 검사의 기반이 되는 마지막 매개변수가 되기를 바랍니다. 그러나 많은 공격 패킷을 보고 TTL과만 일치하는 경우 도움이 될 수 있습니다.

# iptables -A FORWARD -p tcp -m ttl --ttl-eq=55 -m state --state NEW -j DROP

아무 것도 도움이되지 않으면

전문가에게 문의하세요! 난 진심이야 여기에 설명된 내용은 빙산의 일각에 불과합니다. 함께 사용해야 하는 두 가지 방어 전략이 있음을 기억하십시오.

1) 더 많은 수의 요청을 처리하기 위해 컴퓨팅/네트워크 리소스를 늘리거나 최적화합니다.
2) 추가 차단을 위해 원치 않는 트래픽을 합법적인 트래픽과 분리합니다.

따라서 외부에 도움을 요청해야 하는 3가지 이유가 있습니다.
1) 원치 않는 트래픽을 합법적인 트래픽과 분리할 만큼 충분한 대역폭이나 컴퓨팅 리소스가 없습니다.
2) 공격이 복잡하고 원치 않는 패킷이 정상적인 패킷과 다르지 않거나 거의 다르지 않습니다. 전문가는 고급 필터링 방법과 때로는 값비싼 특수 하드웨어 및 소프트웨어를 사용합니다.

그리고 마지막으로