이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 13773|회답: 0

[안전 튜토리얼] SYN 플러드 공격, SYN 쿠키 방어, 그리고 Linux/FreeBSD용 커널 매개변수 수정

[링크 복사]
게시됨 2014. 10. 27. 오후 9:37:19 | | |

해커이 분야는 바람직하고 유망한 직업입니다. 저는 좋은 해커를 좋아하고 나쁜 해커는 싫어합니다. 이른바 나쁜 해커는 상대방에게 야근을 하게 만드는 그런 사람입니다.

    SYN 플러드 공격은 전형적인 서비스 거부 공격입니다. 이른바 서비스 거부 공격은 피해자의 호스트나 네트워크를 좋은 서비스를 제공하지 못하게 하여 공격의 목적을 간접적으로 달성하려는 것입니다. 해커들은 상대방이 야근하게 일하게 만들어 자신들이 공정하고 유능하며 용감하다는 것을 보여주려 하지만, 사실 아무것도 아닙니다.

   1: SYN 플러드 공격이란 무엇인가요?

    SYN 플러드 공격은 IPv4 내 TCP 프로토콜의 3방향 핸드셰이크 과정을 이용합니다. 이 프로토콜은 한쪽 끝이 상대방과 TCP 연결을 시작하려면 먼저 TCP SYN(동기화) 패킷을 상대방에게 보내고, 상대방이 받은 후 TCP SYN + ACK 패킷을 다시 보내고, 시작자가 TCP ACK(ACKnowledge 문자) 패킷을 다시 보내 세 번의 핸드셰이크가 완료되도록 규정합니다.

    위 과정에는 몇 가지 중요한 개념들이 있습니다:

    대기열은 연결되어 있지 않습니다: 3자 핸드셰이크 프로토콜에서는 서버가 연결되지 않은 큐를 유지하여 각 클라이언트의 SYN 패킷(syn=j)에 대한 항목을 열어 서버가 SYN 패킷을 수신하고 고객에게 확인을 보내며, 고객의 확인 패킷을 기다립니다. 이 항목들로 식별된 연결은 서버에서 Syn_RECV 상태에 있으며, 서버가 고객으로부터 확인 패킷을 받으면 해당 항목은 삭제되고 서버는 ESTABLISHED 상태에 들어갑니다. 즉, TCP 서버가 TCP SYN 요청 패킷을 받으면, TCP SYN+ACK 패킷을 TCP 클라이언트로 전송하기 전에 먼저 이 손으로 형성된 TCP 연결을 위해 데이터 영역을 할당해야 합니다. 일반적으로 SYN 패킷은 수신되었지만 ACK 패킷은 아직 수신되지 않은 연결 상태를 의미합니다반개방 연결(반쯤 열린 연결).

    백로그 매개변수: 는 최대 연결되지 않은 큐 수를 나타냅니다.

    SYN-ACK 재전송 횟수: 서버가 SYN-ACK 패킷을 전송한 후, 고객 확인 패킷이 수신되지 않으면 서버가 첫 번째 재전송을 수행하고, 일정 시간 동안 기다린 후 고객 확인 패킷을 받지 못한 후 두 번째 재전송을 수행합니다. 재전송 횟수가 시스템에서 지정한 최대 재전송 횟수를 초과하면 시스템은 준연결 대기열에서 연결 정보를 삭제합니다. 각 재전송 대기 시간이 반드시 같지는 않다는 점에 유의하세요.

    반연결 생존 시간: 는 반연결 대기열의 항목이 최대 생존 시간을 의미하며, 즉 서비스가 SYN 패킷을 수신한 시점부터 패킷이 유효하지 않음이 확인될 때까지의 최대 시간을 의미합니다. 시간 값은 모든 재전송 요청 패킷의 최대 대기 시간의 합입니다. 때때로 반연결된 생존 시간(survival time)이라고도 부르며, SYN_RECV 생존 시간(survival time)이라고 부릅니다.

    가장 일반적인 SYN 플러드 공격에서는 공격자가 짧은 시간 내에 피해자에게 많은 수의 TCP SYN 패킷을 보내며, 이 시점에서 공격자는 TCP 클라이언트이고 피해자는 TCP 서버가 됩니다. 위 설명에 따르면, 피해자는 각 TCP SYN 패킷에 특정 데이터 존을 할당했는데, 이는 SYN 패킷들이 서로 다른 소스 주소를 가지고 있을 때(공격자가 쉽게 위조할 수 있음) 한 가지였습니다. 이로 인해 TCP 서버 시스템에 큰 부담이 가해지고 결국 시스템이 제대로 작동하지 않을 수 있습니다.

    2. SYN 쿠키의 원칙

    SYN 플러드 공격을 효과적으로 방지하는 방법 중 하나는 SYN 쿠키입니다. SYN 쿠키 이유 D. J. 번스테인과 에릭 쉥크가 발명했습니다.

    SYN 쿠키는 SYN 플러드 공격을 방지하기 위해 TCP 서버 측 3방향 핸드셰이크 프로토콜을 수정한 것입니다.그 원리는 다음과 같습니다:TCP 서버가 TCP SYN 패킷을 받고 TCP SYN+ACK 패킷을 반환할 때, 전용 데이터 영역을 할당하지 않고 이 SYN 패킷을 기반으로 쿠키 값을 계산합니다. TCP ACK 패킷이 수신되면, TCP 서버는 해당 쿠키 값을 기반으로 TCP ACK 패킷의 정당성을 확인합니다. 합법적인 경우, 향후 TCP 연결을 처리하기 위해 전용 데이터 영역이 할당됩니다.

    Linux와 FreeBSD에서 SYN 쿠키를 구현하기 위해 커널 매개변수를 어떻게 설정하는지 이야기해 봅시다

    셋째: 리눅스 설정

    서버 구성이 좋지 않으면 TCP TIME_WAIT 소켓 수가 20,000개나 30,000개에 달해 서버가 쉽게 죽을 수 있습니다. 리눅스 커널 매개변수를 수정함으로써 서버의 TIME_WAIT 소켓 수를 줄일 수 있습니다.

    TIME_WAIT 다음 명령어로 확인할 수 있습니다:

  1. 以下是代码片段:
  2. netstat -an | grep "TIME_WAIT" | wc -l
코드 복사

CentOS 같은 리눅스에서는 /etc/sysctl.conf 파일을 수정하면 이를 달성할 수 있습니다.

    다음 문장을 추가하세요:

  1. 以下是代码片段:
  2. net.ipv4.tcp_fin_timeout = 30
  3. net.ipv4.tcp_keepalive_time = 1200
  4. net.ipv4.tcp_syncookies = 1
  5. net.ipv4.tcp_tw_reuse = 1
  6. net.ipv4.tcp_tw_recycle = 1
  7. net.ipv4.ip_local_port_range = 1024    65000
  8. net.ipv4.tcp_max_syn_backlog = 8192
  9. net.ipv4.tcp_max_tw_buckets = 5000
  10. net.ipv4.tcp_synack_retries = 2
  11. net.ipv4.tcp_syn_retries = 2
코드 복사

설명:

net.ipv4.tcp_syncookies = 1은 SYN 쿠키가 활성화되어 있다는 뜻으로, 이는 BOOLEAN입니다. SYN이 큐가 넘칠 때까지 기다릴 때, 이를 처리할 쿠키를 활성화하면 소수의 SYN 공격을 막을 수 있고, 기본값은 0으로 종료됩니다.
net.ipv4.tcp_tw_reuse = 1은 재사용이 활성화되었음을 의미하며, 이는 BOOLEAN입니다. 새로운 TCP 연결을 위해 TIME-WAIT 소켓을 재사용할 수 있게 하며, 기본값은 0으로 설정되어 폐쇄를 의미합니다;
net.ipv4.tcp_tw_recycle = 1은 TCP 연결에서 TIME-WAIT 소켓의 빠른 재활용을 가능하게 하는 BOOLEAN을 의미하며, 기본값은 0이므로 닫혀 있습니다.
net.ipv4.tcp_fin_timeout = 30은 로컬 요청으로 소켓이 닫히면 이 매개변수가 FIN-WAIT-2 상태에 머무르는 시간을 결정한다는 의미입니다. 단위는 초입니다.
net.ipv4.tcp_keepalive_time = 1200은 키팔리브가 사용될 때 TCP가 키팔라이브 메시지를 얼마나 자주 전송하는지를 나타냅니다. 기본값은 2시간이었으나 20분으로 변경되었습니다. 단위는 초입니다.
net.ipv4.ip_local_port_range = 1024 65000은 외부 연결에 사용되는 포트 범위를 나타냅니다. 기본 소형은 작습니다: 32768에서 61000으로, 1024에서 65000으로 변경되었습니다.
net.ipv4.tcp_max_syn_backlog = 8192는 SYN 큐의 길이를 나타내며, 기본값은 1024이며, 대기 중인 네트워크 연결을 더 수용하기 위해 증가한 큐 길이는 8192입니다.
net.ipv4.tcp_max_tw_buckets = 5000은 시스템이 동시에 유지TIME_WAIT할 수 있는 최대 소켓 수를 나타내며, 이 수를 초과하면 즉시 TIME_WAIT 소켓이 삭제되고 경고 메시지가 출력됩니다. 기본값은 180000이며, 5000으로 변경되었습니다. Ap치나 Nginx 같은 서버에서는 앞서 언급한 매개변수들이 소켓 수를 TIME_WAIT 줄일 수 있지만, Squid의 경우 효과가 크지 않습니다. 이 매개변수는 많은 TIME_WAIT 소켓에 의해 Squid 서버가 끌려가지 않도록 최대 TIME_WAIT 소켓 수를 제어합니다.
net.ipv4.tcp_synack_retries와 net.ipv4.tcp_syn_retries는 SYN 재시도 횟수를 정의합니다.

다음 명령을 실행해 구성이 효과를 발휘하도록 하세요:

  1. 以下是代码片段:
  2. /sbin/sysctl -p
코드 복사

/etc/sysctl.conf를 수정하고 싶지 않다면, 다음 명령어를 사용해 수정할 수도 있습니다:

  1. 以下是代码片段:
  2. /sbin/sysctl -w key=value
코드 복사

넷째, FreeBSD 하에 구축됨

    야유의 개인적인 학습 관점: FreeBSD의 Syn 방어가 리눅스와 같지 않을 수 있고, 설정된 매개변수도 정확히 같지 않으며, 관련 설정과 이해도 올바르지 않을 수 있습니다:)

    TCP 링크에도 하나 있습니다MSL(최대 세그먼트 수명)개념최대 생성 시간일반 구현에서는 MSL 값을 30초 동안 측정하며, 일부 구현은 2분이 걸리기도 합니다. TCP 상태 머신에서의 "패시브 셧다운": CLOSE_WAIT부터 LAST_ACK까지는 다음과 같은 규칙이 있습니다: TCP가 능동 종료를 수행하고 마지막 ACK를 반환할 때, 연결은 MSL의 두 배 동안 TIME_WAIT 상태를 유지해야 합니다. 이렇게 하면 TCP가 마지막 ACK를 다시 보낼 수 있습니다(다른 쪽은 타임아웃 후 마지막 FIN을 다시 전송).

    이 규칙의 존재로 인해 해당 주소의 링크(클라이언트 주소, 포트 및 서버 측 주소, 포트)는 이 2*MSL 시간 동안 사용할 수 없습니다. 예를 들어, 링크를 생성한 후 닫고 빠르게 다시 시작하면 포트가 사용 불가능해집니다.

    TIME_WAIT 시간은 2*MSL입니다. 그래서 net.inet.tcp.msl 조정을 통해 TIME_WAIT 시간을 줄일 수 있습니다. 웹 서버의 경우, 이 값은 7500 또는 2000으로 조정할 수 있습니다(웹에 접속할 때, 페이지가 4~15초 이상 플래싱될 수 없으니 포기하는 것도 고려할 수 있습니다 -_-)

    매개변수 설정 참고:

  1. 以下是引用片段:
  2. net.inet.tcp.syncookies=1
  3. 防止DOS攻击

  4. net.inet.tcp.msl=7500
  5. 防止DOS攻击,默认为30000

  6. net.inet.tcp.blackhole=2
  7. 接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包

  8. net.inet.udp.blackhole=1
  9. 接收到一个已经关闭的端口发来的所有UDP包直接drop
코드 복사

FreeBSD에서는 yayu가 /etc/sysctl.conf의 내용을 효과적으로 만들 수 있는 "/sbin/sysctl -p" 같은 명령어를 못해서, 그냥 다음 명령어를 사용했습니다:

  1. 以下是代码片段:
  2. sysctl net.inet.tcp.syncookies=1 net.inet.tcp.msl=7500 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1
코드 복사






이전의:우창공업대학 학생이 언론에 보낸 편지
다음:대학 호텔에서 매춘 조직에 관한 진실을 복원하라 "우창공업대학: 소문은 여기서 멈춘다...
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com