개발 - WEB, WAS, DB

디도스 공격 방어 후기 (2)

개미v 2024. 8. 10. 10:38

이튿날인 다음날도 디도스 공격이 이어졌습니다.
이번에는 해외IP 전부 차단 해서 괜찮을 줄 알았는데, 국내의 좀비PC들이 많아서 또 뚜드려 맞았습니다.

다수(무한대)의 IP를 방화벽에 블랙리스트 방식으로 차단하는 것은 한계가 있어 보입니다.
그래도 다른 방도가 없으니 블랙리스트 추가 작업 했습니다.
언젠가는 다 막겠죠.

 

국내 클라우드사 IP 차단

네이버 클라우드 쪽에서 공격이 많았습니다.
그래서 국내 클라우드 IP 대역 차단 했습니다.

- 네이버 클라우드
https://www.ip2location.com/as135354

- NHN 클라우드
공격이 없었는데 선제적으로 조치
https://www.ip2location.com/as45974

- KT 클라우드, 가비아 등등
막고 싶지만 공개된 IP 대역이 없음

 

봇 IP 허용

해외IP를 전부 차단하면 문제가 되는 것이 구글 봇 같은 것들이 접근을 못합니다.
구글 봇은 아래 URL에서 확인 가능한데... 너무 많습니다.
https://developers.google.com/search/apis/ipranges/googlebot.json
https://developers.google.com/search/apis/ipranges/special-crawlers.json

그래서 대략적으로 허용 규칙 생성

// 구글 봇(기본)
66.249.0.0
34.64.82.0
// 빙 봇
40.77.0.0
52.167.144.0
65.52.0.0
157.55.0.0
// MSN 봇
207.46.0.0
// 야후
67.195.114.35
72.30.161.233

// 구글 봇(기타)
192.178.0.0
209.85.238.0
72.14.199.0
74.125.0.0

 

방화벽 차단 & 해제 스케줄러

해외IP를 항상 차단해 놓으면 문제가 될 것 같으니, 자동으로 방화벽 차단하고 해제하게 스케줄러 설정했습니다.
디도스 공격자가 동일 시간대에 일정한 패턴으로 공격하더라고요.

- 차단
netsh advfirewall firewall set rule name="Java(TM) Platform SE binary" new enable=no
netsh advfirewall firewall set rule name="HTTP 국내IP에서 좀비 차단 (80, 443)" new enable=yes

- 해제
netsh advfirewall firewall set rule name="Java(TM) Platform SE binary" new enable=yes
netsh advfirewall firewall set rule name="HTTP 국내IP에서 좀비 차단 (80, 443)" new enable=no

 

참고로 국내IP는 항상 허용하는 방화벽 규칙이 들어가 있어서 장애 발생하지 않습니다.
HTTP 국내IP만 허용 (80, 443)

 

네트워크 프로그램

윈도우에서 TCP 컨넥션을 Close하는 기능이 있는 네트워크 모니터링 무료 프로그램 입니다.
실제 공격에서 아직 써보지 못해서 유용한지는 모르겠어요.

 

CurrPorts

 

System Informer

 

레지스트리 TCP 파라미터 설정

디도스 공격의 무서운 점이 네트워크 상태가 CLOSE_WAIT 상태로 남아서 컨넥션이 무한대 종료되지 않는다는 점입니다.
검색을 해보니 윈도우 레지스트리 설정 방법도 있던데, 이것으로 해결 안됩니다.


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters


TCPFinWait2Delay와 TcpTimedWaitDelay를 조정하면 된다고 하는데 이것으로 CLOSE_WAIT 타임아웃이 되지 않습니다.
혹시 몰라 다른 파라미터로 TCPFinWaitDelay, TCPFinWait1Delay, TCPCloseWaitDelay 다 해봤는데 안됩니다.
마이크로소프트 공식 문서에도 저게 된다는 글 없습니다.


카카오에서 작성한 내용이 맞았습니다.
"CLOSE_WAIT는 포트를 잡고 있는 프로세스의 종료 또는 네트워크 재시작 외에는 제거할 방법이 없습니다."

 

https://tech.kakao.com/posts/321

 

CLOSE_WAIT & TIME_WAIT 최종 분석 - tech.kakao.com

트래픽이 많은 웹 서비스를 운영하다보면 CPU는 여유가 있지만 웹서버가 응답을 ...

tech.kakao.com

 

이것 아무리 생각해봐도 타임아웃이 안된다는 것은 이해가 가지 않네요.
그리고 참고로 웹서버를 CLOSE_WAIT 상태로 만드는 것은 쉽지 않습니다.
해커 정도 되야 가능한가봐요.

 

디도스 공격시 자동으로 톰캣 재기동

위에서 얘기했듯이 디도스 공격을 받으면 CLOSE_WAIT 상태에서 빠져나오지 않아서 톰캣을 재기동 시켜줘야 합니다.
사람이 하기 번거로우니 배치파일로 자동화 했습니다.

CLOSE_WIAT 커넥션이 1000개 이상인 경우 자동으로 톰캣을 재기동 합니다.

@echo off

set CATALINA_HOME=C:\apache-tomcat-9.0.70

:LOOP
echo Check CLOSE_WAIT Connection
for /f %%a in ('netstat -an ^| findstr /c:"192.168.50.8:8080" /c:"192.168.50.8:8443" ^| find /c "CLOSE_WAIT"') do set connections=%%a

echo CLOSE_WAIT : %connections%

if %connections% GEQ 1000 (
	echo Restarting Tomcat...

	echo Tomcat shutdown
	call C:\apache-tomcat-9.0.70\bin\shutdown.bat

	echo sleep 10 seconds...
	timeout /t 10 /nobreak

	echo Tomcat process kill...
	taskkill /F /IM java.exe

	echo sleep 10 seconds...
	timeout /t 10 /nobreak

	echo Tomcat startup...
	call C:\apache-tomcat-9.0.70\bin\startup.bat
	
	echo Save log...
	echo %date% %time% - DDoS attack occurred. CLOSE_WAIT[%connections%] >> c:\cmd\batch.log
)

echo sleep 30 seconds...
timeout /t 30 /nobreak

goto LOOP

 

관리자에게 디도스IP 조치하라고 메일 발송

대부분 디도스 공격 당하면 차단하고 끝나고 말아서, 좀비PC들이 줄지가 않습니다.
좀비PC가 공격자의 비용이기 때문에 조금이라도 공격자에게 타격을 주기 위해서 각 기관 관리자에 메일 보냈습니다.

- 네이버클라우드주식회사(NCP)
- 한국과학기술정보연구원
- 문경대학교

해킹 문제가 우려되는 기관 3곳에 조치하라고 메일 발송

 

Cloudflare

근본적인 해결방법으로 클라우드 플레어 사용하면 디도스 공격 막을 수 있다고 하는데
이거 공부하고, 적용하려면 시간이 오래 걸릴 것 같아서 해보지는 않았습니다.

 

이후 경과

3일째는 공격이 없었습니다.
해외IP 차단 해놔서 그럴 수도 있고, 공격 비용 대비 별 타격이 없어서 그만뒀을 수도 있다는 생각입니다.
공격 패턴을 보면 한국 사람 같고, 재미로 하는 것은 아니고 사주 받아서 하는 것으로 추측 됩니다.
공격 할 때마다 비용이 발생한다고 하면, 돈 안드는 쪽이 이기지 않을까요?