최근에 우리는 SYN 플러딩으로 인해 아파치 서버가 매우 느리게 응답했습니다. 이에 대한 해결 방법은 tcp_syncookies ( net.ipv4.tcp_syncookies=1 in /etc/sysctl.conf
) 를 활성화하는 것 입니다.
더 많은 배경을 원한다면 여기 에 대한 질문을 게시했습니다 .
syncookies를 활성화 한 후 약 60 초마다 / var / log / messages에 다음 메시지가 표시되기 시작했습니다.
[84440.731929] possible SYN flooding on port 80. Sending cookies.
Vinko Vrsalovic는 이것이 syn 백 로그가 가득 찼음을 의미한다고 알려주므로 tcp_max_syn_backlog를 4096으로 올렸습니다. 또한 어느 시점에서을 발행하여 tcp_synack_retries를 3 (기본값 5에서 아래로)으로 내 렸습니다 sysctl -w net.ipv4.tcp_synack_retries=3
. 이렇게 한 후 메시지 간격이 약 60 초에서 180 초 사이로 바뀌면서 빈도가 줄어드는 것처럼 보였습니다.
다음으로 발행 sysctl -w net.ipv4.tcp_max_syn_backlog=65536
했지만 여전히 로그에 메시지가 표시됩니다.
이 모든 과정에서 SYN_RECV 상태 (실행 중 watch --interval=5 'netstat -tuna |grep "SYN_RECV"|wc -l'
) 의 연결 수를 보았 으며 백 로그 크기보다 훨씬 낮은 약 240 이상 으로 올라가지 않았습니다. 그러나 나는 약 512 정도의 Red Hat 서버를 가지고 있습니다 (이 서버의 한계는 기본값 1024입니다).
백 로그의 크기를 제한하는 다른 TCP 설정이 있습니까? 아니면 잘못된 트리를 짖고 있습니까? SYN_RECV 연결 수가 netstat -tuna
백 로그의 크기와 관련 이 있어야합니까 ?
최신 정보
내가 합법적 인 연결을 다루고 있다고 말할 수있는 가장 좋은 netstat -tuna|wc -l
것은 5000 명 정도입니다. 나는 오늘 이것을 연구 하고 있으며 last.fm 직원으로부터이 게시물 을 찾았 습니다 .
또한 syncookies가 활성화되어있을 때 tcp_max_syn_backlog가 영향을 미치지 않는다는 것을 발견했습니다 ( 이 링크에 따라 )
다음 단계로 sysctl.conf에서 다음을 설정했습니다.
net.ipv4.tcp_syn_retries = 3
# default=5
net.ipv4.tcp_synack_retries = 3
# default=5
net.ipv4.tcp_max_syn_backlog = 65536
# default=1024
net.core.wmem_max = 8388608
# default=124928
net.core.rmem_max = 8388608
# default=131071
net.core.somaxconn = 512
# default = 128
net.core.optmem_max = 81920
# default = 20480
그런 다음 응답 시간 테스트를 설정하고 sysctl -p
by by syncookies를 실행 및 비활성화했습니다 sysctl -w net.ipv4.tcp_syncookies=0
.
이 작업을 수행 한 후 SYN_RECV 상태의 연결 수는 여전히 220-250으로 유지되었지만 연결이 다시 지연되기 시작했습니다. 이러한 지연이 발견되면 syncookies를 다시 활성화하고 지연이 중지되었습니다.
내가보고있는 것은 여전히 초기 상태에서 개선 된 것이라고 생각하지만 일부 요청은 여전히 지연되어 syncookies를 활성화하는 것보다 훨씬 나쁩니다. 따라서 부하에 대처하기 위해 더 많은 서버를 온라인 상태로 만들 수있을 때까지 서버를 사용하도록 설정 한 것 같습니다. 그럼에도 불구하고 서버 버퍼가 가득 찼을 때 (보증 적으로) 전송되기 때문에 다시 비활성화 해야하는 유효한 이유가 확실하지 않습니다.
그러나 syn 백로 그는 SYN_RECV 상태에서 ~ 250 개의 연결만으로 가득 찬 것으로 보이지 않습니다! SYN 플러딩 메시지가 빨간색 청어 일 수 있으며 채워지는 syn_backlog 이외의 것일 수 있습니까?
다른 튜닝 옵션이있는 사람이 아직 시도하지 않은 경우 시도해 보는 것이 행복하지만 syn_backlog 설정이 어떤 이유로 제대로 적용되지 않는지 궁금합니다.