본문으로 바로가기

접속시도를 여러번 하는 IP 자동 블락하기

category Linux 2011. 2. 18. 09:51
안녕 리눅스를 아주 잘 쓰고 있는 허접 유저입니다. 매일 도움만 얻어가다가
간단한 스크립트를 하나 만들어서 올립니다.

여건상 어쩔 수 없이 외부에서 접근하는 IP를 모두 블락시켜놓지 못하는 경우
가 있습니다. 예를 들면 웹호스팅 서버의 경우 서버에 입주해 있는 유저들도
ssh등을 써야하기 때문에, 외부에서 접근하는 IP를 모두 막을 수 없는 일이 벌
어집니다.

루트 로그인을 막아놓고 방화벽으로 필요없는 포트를 모두 막아놓는다 하더라
도, 매일매일 무수히 접근시도를 하는 메세지들이 로그에 쌓이는걸 보니(하루
에 수천번 접속 시도를 합니다...) 짜증이 살짝 솟구쳐서-_- 아래와 같은 스크
립트를 만들게 되었습니다.
포트센트리는 의도하지 않았던 결과가 자주나와 아예 염두에 두지 않았습니다-
_-;

간단히 말해 5번 로그인 실패하는 IP를 user.conf에 추가시킵니다.
이것을 crontab에 등록해, 하루에 한번씩 oops-firewall을 리스타트시키는 것
으로 사용하고 있습니다.

----------------------------------------------------------------------
#!/bin/bash
# Script by Yunkiman

days=`date +%d`

for i in $( cat /var/log/messages | grep "Failed password for" | awk '$2
= $days {print $13}' | sort | uniq -c | awk '$1 > 5 {print $2}'); do
echo "%-A INPUT -s $i -j DROP" >> /etc/oops-firewall/user.conf
done
----------------------------------------------------------------------

참고로 for 문이 들어있는 문장은 do 까지가 한문장입니다.

주된 내용은, messages 로그안에서 오늘 날짜에 대한 "Failed password for"
가 들어간 문장을 grep으로 모두 뽑아낸 다음, awk로 오늘 날짜에 해당하는 라
인의 13번재 인자, 즉 IP주소만을 뽑아냅니다.

그리고 sort하고(안해도 됨) uniq -c 명령으로 중복되는 라인을 싹 제거하고 -
c 옵션으로 중복되는 수를 카운트해서 IP 앞에 표시합니다. 이유는 몇번 로그
인 시도를 실패했는지 수를 헤아리기 위해서입니다.

또 그 결과의 첫번째 인자를(첫번째 인자가 중복 로그인 실패 IP의 카운트 수
가 되므로) awk로 판단하여, 5보다 숫자가 크면 두번째 인자인 IP 주소만 뽑아
냅니다. 숫자 5는 마음대로 설정하셔서 쓰시면 되겠습니다. 5번 로그인 실패했
다는 의미입니다.

그 다음 해당 IP를 /etc/oops-firewall/user.conf 파일에 추가하게 됩니다.


이후에는 크론탭에 밤 11:50분 경에 위의 스크립트를 실행하고, 바로 oops-
firewall을 리스타트 하게 해놓았습니다.

편하신대로 수정해서 쓰시면 되겠습니다.
좀 더 보완하면 깔끔하게도 될 것 같은데 귀찮아서 하루에 한번 등록하는걸로
쓰고 있습니다 -0-;;;;

보완할 점이 있으면 리플달아주시면 알랍붸붸입니다.

안녕 리눅스 만쉐이~ -0-/