네트워크 [FAQ57] 넘버원 리눅스로 웹서버를 운영하고 있습니다. 웹 서버가 느려져서 네트워크 접속 상태를 체크해 보니 Syn_recv 패킷이 많습니다. 어떻게 처리하면 될까요?
FAQ내용 | [FAQ57] 넘버원 리눅스로 웹서버를 운영하고 있습니다. 웹 서버가 느려져서 네트워크 접속 상태를 체크해 보니 Syn_recv 패킷이 많습니다. 어떻게 처리하면 될까요? Syn_Recv DDOS Attack |
---|---|
참고URL | |
참고URL | |
메뉴분류 | 보안 |
netstat -nat | grep syn_recv 명령을 실행하였을 때 여러 개의 동일한 아이피로부터 syn_revc 패킷이 있다면 Syn_recv 패킷을 이용한 DDos 공격일 가능성이 높습니다. 이런 패킷이 많아질수록 서버가 느려지고, 결국엔 서버가 다운될 수 있으므로, 다음과 같이 조치를 하는 것이 좋습니다.
sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.conf.all.rp_filter=1
상기 두 명령을 루트 권한으로 실행해 주면 패킷수가 상당히 줄어 들 것입니다. 그런 후에 DDOS 공격하는 아이피를 방화벽에서 차단하는 조치를 하는 것이 좋습니다.
넘버원 리눅스에서 지원하는 shorewall 방화벽을 통해 특정 아이피 또는 특정 네트워크대를 차단하는 방법을 알려 드립니다.
먼저 /etc/shorewall/interfaces 설정에서 옵션으로 blacklist를 다음과 같은 형식으로 추가합니다.
net eth0 detect blacklist
그런 다음에 /etc/shorewall/blacklist 빈 파일을 생성합니다(touch /etc/shorewall/blacklist)
마지막으로 네트워크 접속 상태를 체크하여 공격자의 아이피를 추출하여 blacklist 파일이 기록되게 끔 하는 스크립트를 생성합니다.
#!/bin/bash
syn_check=$(netstat -nat | grep SYN_RECV | wc -l)
if [ $syn_check -gt '5' ]; then
netstat -nat | grep SYN_RECV | awk '{print $5}' | sed 's/:.*$//g' | sort -u > /etc/shorewall/syn_blacklist
else
cat /dev/null > /etc/shorewall/syn_blacklist
fi
syn_blacklist=$(cat /etc/shorewall/syn_blacklist)
for i in $syn_blacklist; do
black_ck=`cat /etc/shorewall/blacklist | grep $i`
if [ ! $black_ck ]; then
echo $i >> /etc/shorewall/blacklist
echo `date` $i BlackList로 등록 >> /etc/shorewall/blacklist.log
/etc/init.d/shorewall restart
fi
done
상기 내용으로 만든 스크립트에 실행 권한을 준 후 실행해 주면 blacklist 파일에 공격자의 아이피가 등록됩니다. 공격자의 아이피가 실제로 공격자 아이피가 아닌 오류가 있을 수도 있습니다. 등록된 아이피가 이전에도 남용된 아이피인지를 정확하게 판단하기 위해서는 다음과 같은 사이트에서 아이피를 확인해 보면 됩니다.
https://www.abuseipdb.com/
[주의] 상기 스크립트는 완벽하지 않은 것이기 때문에 다소 주의해서 사용해야 합니다. 스크립트 내용을 보면 syn_recv 패킷을 보낸 대상 아이피에 대해서 차단하고 있는데, 공격자가 아닌 일반 사용자의 아이피도 포함될 수 있기 때문에 공격자의 남용 아이피와 비공격자의 아이피를 확인해 봐야 합니다. 이에 맞게 스크립트를 수정해서 사용하면 DDOS syn 공격을 최소화할 수 있을 것입니다.
[TIP] 방화벽에서 blacklist 정책이 적용되고 있는지는 shorewall list blacklst 명령으로 확인해 볼 수 있습니다.
# shorewall list blacklst
Shorewall 4.4.11 Chain blacklst at localhost - 2019. 08. 14. (수) 01:34:10 KST
Counters reset 2019. 08. 14. (수) 01:20:08 KST
Chain blacklst (4 references)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 103.196.240.0/24 0.0.0.0/0
0 0 DROP all -- * * 103.196.241.0/24 0.0.0.0/0
상기 예제의 경우 103.196.240.0 네트웍 대와 103.196.241.0 네트웤대의 모든 호스트들에 대해서 차단하고 있음을 보여 줍니다.
No1.Linux 2019 SE의 Shorewall v5.0.15 버전에선 기존 버전과 차이가 있어 상기 내용으로는 적용되지 않음을 확인되었으므로, No1.Linux 2019 SE 버전에서 적용하려면 내용을 수정해야 함을 주의하기 바랍니다.
기존 shorewall v4.4 버전에선 상기 내용대로 적용되지만, v5.0.15 버전에선 blacklist 옵션을 지원하지 않기 때문에 기존 blacklist 파일을 blrules 파일로 변환한 후에 이 파일 규칙에 맞게 새로운 정보가 추가되도록 해 주어야 합니다. /etc/shorewall/interfaces 옵션에서 blacklist를 추가하지 않아도 됩니다.
적용1. 기존 blacklist 파일을 blrules 파일로 변환하는 방법
적용2. 스크립트 수정
blacklist 규칙인 blrules이 적용되는지 여부는
상기 명령으로 확인할 수 있습니다.