IPを禁止するシェルスクリプト


8

一部のIPは私のサーバーの何千もの接続を開いています。Ubuntu 14サーバーがあります。次のコマンドを使用して合計接続を確認します。

netstat -an | grep tcp | awk '{print $ 5}' | カット-f 1 -d:| 並べ替え| uniq -c | ソート-n

次に、次のiptablesルールを使用して原因のIPをブロックします。

iptables -I INPUT 1 -s xxxx -j DROP

すべて正常に動作し、IPアドレスをブロックします。ただし、サーバーを監視するために24時間年中無休でオンラインにすることはできません。自動的に実行するために使用できるシェルスクリプトがあるかどうか疑問に思っていましたか?たとえば、IPが常にXを超える数の接続を開く場合、上記のiptablesルールによって自動的に禁止されます。


6
あなたがどうかを確認するために見ているfail2banのは、あなたのニーズを満たしていますか?
John1024

私の限られた知識を失礼します。ssh認証のfail2banではないですか?ポート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ループに送られます。

これを24時間年中無休で実行するには、上記のコマンドを毎分程度実行するcronジョブを作成します。この行を追加/etc/crontab

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

正確な答えを提供してくれたterdonに感謝します。AFAIK、fail2banはssh認証用です。ポート80ですべての接続が開かれています。ポート80でfail2banを使用できるかどうかを調べます。カスタムスクリプトの場合、24時間年中無休で実行するにはどうすればよいですか?画面コマンド?またはcronをインストールしますか?ところで。私はサーバーをチャットサーバーとして使用しているため、人が何度もpingを実行できる(または複数の接続を開くことができる)ため、指定したカスタムスクリプトを使用する場合があります。
user3404047

2
@ user3404047あなたはそれをcronjobとして実行できます、はい。更新された回答を参照してください。ただし、fail2bansshだけではありません。それはまた、例えば、ポート80を参照してください罰金を作品ここここここ
terdon 2015年

1

可能な代替オプションは、recentモジュールを使用して、すべてのiptablesルールセット内の問題のあるIPアドレスを識別して処理することです。このメソッドの課題は、デフォルトのヒットカウント制限20であるため、デフォルトから逸脱するか、より高いヒットカウントトリガーポイントを達成するために、より高いレベルのキャリーカウンターを作成する必要があります。

以下の例は、私のiptablesルールセットからのもので、12分以内にポート80で80の新しいTCP接続を行う場合、1日ちょっとの間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.