Shell script cấm IP


8

Một số IP đang mở hàng ngàn kết nối máy chủ của tôi. Tôi có một máy chủ Ubuntu 14. Tôi kiểm tra tổng số kết nối bằng lệnh sau:

netstat -an | grep tcp | awk '{in $ 5}' | cắt -f 1 -d: | sắp xếp | uniq -c | sắp xếp

Sau đó, tôi sử dụng quy tắc iptables sau để chặn IP thủ phạm.

iptables -I VÀO 1 -s xxxx -j DROP

Nó hoạt động tốt và chặn địa chỉ IP. Tuy nhiên, tôi không thể trực tuyến 24/7 để theo dõi máy chủ. Tôi đã tự hỏi nếu có bất kỳ kịch bản Shell nào tôi có thể sử dụng để làm điều đó tự động? Ví dụ: nếu một IP mở nhiều hơn số lượng kết nối X bất cứ lúc nào, thì nó sẽ tự động bị cấm theo quy tắc iptables ở trên.


6
Bạn đã xem liệu fail2ban có đáp ứng nhu cầu của bạn không?
John1024

Xin lỗi kiến ​​thức hạn chế của tôi. Không phải fail2ban để xác thực ssh? Tôi không chắc chắn sử dụng nó trên cổng 80. Ngoài ra, máy chủ của tôi là máy chủ trò chuyện, vì vậy người dùng có thể thử kết nối / ping nhiều lần. Trong trường hợp này, fail2ban sẽ tạo ra nhiều báo động dương tính giả và cấm lưu lượng truy cập hợp pháp. Bất cứ suy nghĩ nào?
dùng3404047

Câu trả lời:


10

Trước hết, đừng phát minh lại bánh xe. Đó chính xác là những gì denyhostsdành cho:

   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.

Theo như tôi biết, denyhostschỉ dành cho các sshkết nối nhưng cũng fail2bancó liên quan đến khá nhiều thứ:

   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.

Cả hai đều có sẵn trong kho:

sudo apt-get install denyhosts fail2ban

Bạn cũng có thể kịch bản này, nếu bạn muốn. Cái gì đó như:

#!/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

Các awksẽ trích xuất các KCN và đếm chúng và chỉ in những xuất hiện nhiều hơn maxlần (ở đây, -vmax=100, thay đổi nó cho phù hợp). Các IP sau đó được đưa vào một vòng lặp while chạy iptablesquy tắc có liên quan .

Để chạy 24/7, tôi sẽ tạo một cronjob chạy lệnh trên mỗi phút hoặc lâu hơn. Thêm dòng này vào/etc/crontab

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

Cảm ơn terdon cho một câu trả lời chính xác. AFAIK, fail2ban là để xác thực ssh. Tất cả các kết nối đang được mở trên cổng 80. Tôi sẽ khám phá nếu tôi có thể sử dụng fail2ban trên cổng 80. Đối với tập lệnh tùy chỉnh, làm cách nào tôi có thể chạy nó 24/7 trong nền? lệnh màn hình? Hoặc cài đặt cron? BTW. Tôi đang sử dụng máy chủ làm máy chủ trò chuyện để một người có thể ping nhiều lần (hoặc mở nhiều kết nối) để tôi có thể sử dụng tập lệnh tùy chỉnh mà bạn cung cấp.
dùng3404047

2
@ user3404047 bạn có thể chạy nó dưới dạng cronjob, vâng. Xem câu trả lời cập nhật. Tuy nhiên, fail2bankhông chỉ cho ssh. Nó cũng hoạt động tốt cho cổng 80. Xem, ví dụ ở đây , đâyđây .
terdon

1

Một tùy chọn thay thế khả thi là xác định và xử lý tất cả các địa chỉ IP có vấn đề trong bộ quy tắc iptables, sử dụng recentmô-đun. Thách thức với phương pháp này là giới hạn số lần truy cập mặc định là 20, do đó, người ta cần phải đi chệch khỏi mặc định hoặc tạo các bộ đếm mang cấp cao hơn để đạt được điểm kích hoạt số lần truy cập cao hơn.

Ví dụ dưới đây là từ bộ quy tắc iptables của tôi và sẽ cấm địa chỉ IP chỉ hơn 1 ngày nếu nó tạo ra 80 kết nối TCP mới trên cổng 80 trong vòng chưa đầy 12 phút. Khi đã vào danh sách kẻ xấu, mọi nỗ lực kết nối sẽ đặt lại bộ đếm 1 ngày về 0. Phương pháp này có thể đạt tối đa 400 lần truy cập trước khi mở rộng sang một vật mang khác (và tôi đã thử nghiệm một chuỗi mang khác). Lưu ý rằng mã như được đăng có cơ sở hạ tầng được sử dụng để chỉ cấm trong một thời gian dài khi nhiều kích hoạt thời gian ngắn hơn. Hiện tại, tôi đã thiết lập nó chỉ cấm trong một thời gian dài khi kích hoạt đầu tiên.

#######################################################################
# 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.