IP를 금지하는 쉘 스크립트


8

일부 IP가 내 서버의 수천 개의 연결을 열고 있습니다. 우분투 14 서버가 있습니다. 다음 명령을 사용하여 총 연결을 확인합니다.

netstat -an | grep tcp | awk '{print $ 5}'| cut -f 1 -d : | 정렬 | uniq -c | 정렬 -n

그런 다음 다음 iptables 규칙을 사용하여 범인 IP를 차단합니다.

iptables -I 입력 1 -s xxxx -j DROP

그것은 모두 잘 작동하고 IP 주소를 차단합니다. 그러나 서버를 모니터링하기 위해 연중 무휴 온라인 상태를 유지할 수 없습니다. 자동으로 수행하는 데 사용할 수있는 셸 스크립트가 있는지 궁금합니다. 예를 들어, IP가 언제든지 X 개 이상의 연결을 여는 경우 위의 iptables 규칙에 따라 자동으로 차단되어야합니다.


6
fail2ban이 귀하의 요구를 충족시키는 지 살펴 보셨습니까 ?
John1024

제한된 지식을 실례합니다. ssh 인증에 실패하지 않습니까? 포트 80에서 사용하지 않을 수도 있습니다. 또한 내 서버는 채팅 서버이므로 사용자가 여러 번 연결 / ping을 시도 할 수 있습니다. 이 경우 fail2ban은 많은 오 탐지 경보를 생성하고 합법적 인 트래픽을 금지합니다. 어떤 생각?
user3404047

답변:


10

우선, 바퀴를 재발 명하지 마십시오. 그것은 정확히 무엇 denyhosts을위한 것입니다 :

   DenyHosts  is a python program that automatically blocks ssh attacks by
   adding entries to /etc/hosts.deny.  DenyHosts will  also  inform  Linux
   administrators  about  offending  hosts,  attacked users and suspicious
   logins.

내가 아는 한, 연결 denyhosts전용 ssh이지만 fail2ban거의 모든 것을 처리하는 것도 있습니다.

   Fail2Ban consists of a client, server and configuration files to  limit
   brute force authentication attempts.

   The  server  program  fail2ban-server is responsible for monitoring log
   files and issuing ban/unban commands.  It  gets  configured  through  a
   simple  protocol  by fail2ban-client, which can also read configuration
   files and issue corresponding configuration commands to the server.

둘 다 리포지토리에서 사용할 수 있습니다.

sudo apt-get install denyhosts fail2ban

원하는 경우 스크립트를 작성할 수도 있습니다. 다음과 같은 것 :

#!/usr/bin/env sh
netstat -an | 
    awk -vmax=100 '/tcp/{split($5,a,":"); if(a[1] > 0 && a[1]!="0.0.0.0"){c[a[1]]++}}
    END{for(ip in c){if(c[ip]>max){print ip}}}' |
        while read ip; do iptables -I INPUT 1 -s "$ip" -j DROP; done

awkIP에를 추출하여 계산 만 개 이상의 나타나는 그 인쇄됩니다 max(여기 번 -vmax=100, 그에 따라 변경). 그런 다음 IP는 관련 iptables규칙 을 실행하는 while 루프로 공급됩니다 .

이 연중 무휴를 실행하려면 매분 정도 명령을 실행하는 cronjob을 만듭니다. 이 줄을 추가/etc/crontab

* * * * * root /path/to/script.sh

정확한 답변을 주셔서 감사합니다. AFAIK, fail2ban은 ssh 인증을위한 것입니다. 모든 연결은 포트 80에서 열립니다. 포트 80에서 fail2ban을 사용할 수 있는지 살펴 보겠습니다. 사용자 지정 스크립트의 경우 백그라운드에서 24/7로 어떻게 실행할 수 있습니까? 화면 명령? 아니면 크론을 설치 하시겠습니까? BTW. 서버를 채팅 서버로 사용하여 사람이 여러 번 핑 (또는 여러 연결을 열 수 있음) 할 수 있으므로 제공 한 사용자 지정 스크립트를 사용할 수 있습니다.
user3404047

2
@ user3404047 cronjob으로 실행할 수 있습니다. 업데이트 된 답변을 참조하십시오. 그러나 fail2banssh만을위한 것은 아닙니다. 포트 80에서도 잘 작동합니다. 예를 들어 여기 , 여기여기를 참조하십시오 .
terdon

1

가능한 대안 옵션은 recent모듈을 사용하여 iptables 규칙 세트 내의 모든 문제 IP 주소를 식별하고 처리하는 것 입니다. 이 방법의 문제점은 기본 적중 횟수 제한 인 20이므로 더 높은 적중 횟수 트리거 포인트를 달성하려면 기본값에서 벗어나거나 더 높은 수준의 캐리 카운터를 만들어야합니다.

아래 예제는 내 iptables 규칙 세트에서 가져온 것으로 12 분 이내에 포트 80에서 80 개의 새 TCP 연결을 만드는 경우 하루 이상 IP 주소를 금지합니다. 불량 사용자 목록에 들어 오면 연결 시도가 1 일 카운터를 0으로 다시 설정합니다.이 방법은 다른 캐리로 확장하기 전에 최대 400 번의 히트로 진행될 수 있습니다 (그리고 다른 캐리 체인을 테스트했습니다). 게시 된 코드에는 여러 개의 더 짧은 시간 트리거에 대해서만 오랫동안 금지하는 인프라가 있습니다. 현재 첫 번째 트리거에서 오랫동안 금지하도록 설정했습니다.

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in4
#
# A NEW Connection on port 80 part 4.
#
# multiple hits on the banned list means you get a one day ban.
# (I re-load the firewall rule set often, so going longer makes
# little sense.)
#
# Custom tables must exist before being referenced, hence the order
# of these sub-toutines.
#
# Place holder routine, but tested. Logs if a day ban would have
# been activated.
#
$IPTABLES -N http-new-in4
#$IPTABLES -A http-new-in4 -m recent --set --name HTTP_BAN_DAY

$IPTABLES -A http-new-in4 -j LOG --log-prefix "DAY80:" --log-level info
$IPTABLES -A http-new-in4 -j DROP

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in3
#
# A NEW Connection on port 80 part 3.
#
# carry forward to the actual banned list:
# Increment this count. Leave the previous count.
#
# Custom tables must exist before being referenced, hence the order
# of these sub-toutines.
#
$IPTABLES -N http-new-in3
$IPTABLES -A http-new-in3 -m recent --remove --name HTTP_02
$IPTABLES -A http-new-in3 -m recent --update --hitcount 1 --seconds 86400 --name HTTP_BAN -j http-new-in4
$IPTABLES -A http-new-in3 -m recent --set --name HTTP_BAN

$IPTABLES -A http-new-in3 -j LOG --log-prefix "BAN80:" --log-level info
$IPTABLES -A http-new-in3 -j DROP

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in2
#
# A NEW Connection on port 80 part 2.
#
# carry forward from previous max new connections per unit time:
# Increment this count and clear the lesser significant count.
#
$IPTABLES -N http-new-in2
$IPTABLES -A http-new-in2 -m recent --remove --name HTTP_01
$IPTABLES -A http-new-in2 -m recent --update --hitcount 3 --seconds 720 --name HTTP_02 -j http-new-in3
$IPTABLES -A http-new-in2 -m recent --set --name HTTP_02

$IPTABLES -A http-new-in2 -j LOG --log-prefix "CARRY80:" --log-level info
$IPTABLES -A http-new-in2 -j ACCEPT

#######################################################################
# USER DEFINED CHAIN SUBROUTINES:
#
# http-new-in
#
# A NEW Connection on port 80:
#
$IPTABLES -N http-new-in

echo Allowing EXTERNAL access to the WWW server

# . check the static blacklist.
#
# http related
$IPTABLES -A http-new-in -i $EXTIF -s 5.248.83.0/24 -j DROP
... delete a bunch on entries ...
$IPTABLES -A http-new-in -i $EXTIF -s 195.211.152.0/22 -j DROP
$IPTABLES -A http-new-in -i $EXTIF -s 198.27.126.38 -j DROP

# . check the dynamic banned list
#
# The 1 Hour banned list (bumped to more than a day):
$IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j LOG --log-prefix "LIM80:" --log-level info
$IPTABLES -A http-new-in -m recent --update --seconds 90000 --name HTTP_BAN --rsource -j DROP

# A generic log entry. Usually only during degugging
#
#$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80ALL:" --log-level info

# Dynamic Badguy List. Least significant hit counter.  Detect and DROP Bad IPs that do excessive connections to port 80.
#
$IPTABLES -A http-new-in -m recent --update --hitcount 20 --seconds 240 --name HTTP_01 -j http-new-in2
$IPTABLES -A http-new-in -m recent --set --name HTTP_01

$IPTABLES -A http-new-in -j LOG --log-prefix "NEW80:" --log-level info
$IPTABLES -A http-new-in -j ACCEPT

... a bunch of stuff not included here

# Allow any related traffic coming back to the server in.
#
#
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT

... the above is needed before the below ...

# If required, go to NEW HTTP connection sub-routine
#
$IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 80 -j http-new-in
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.