GNU/Linux >> Linux の 問題 >  >> Linux

IPSetとIPTablesを使用して個々の国からのすべてのトラフィックをブロックする

はじめに:
syslogを調べたところ、SSHログイン攻撃が中国またはロシアのいずれかから発生していることがよくわかりました。 fail2ban を使用していますが、それで十分であり、とにかくこれらの国からのトラフィックを期待していません。 それでも私はこれら2カ国からのトラフィックをブロックすることにしました。 Fail2ban ログインの失敗をブロックするための優れたツールです。しかし、1日あたり多くの試み(数千)がまだ行われているようです。攻撃者が並列送信を使用していて、Fail2ban(認証ログに基づく)が反応するまで、多くの人が反応したと推測できます。
IP範囲のプリロードされたリストを使用してIPを完全にブロックするには、まず iptables IP範囲ごとに1つのルールがありますが、ルールの読み込みに時間がかかりすぎ、さらに重要なことに、純粋なiptablesルールとしてすべてのIP範囲を読み込むと、サーバーが不安定になり、クラッシュしました。最大以上と言われています。 iptablesの25,000のルール、特に27,000を超えるルールは、カーネルを不安定な状態にする可能性があります。
これを修正するには、 ipsetを使用します。 iptables ipset 特に、最大65536のエントリを含むことができる大きなIP範囲リスト(高速アクセスハッシュテーブル)を処理するように考案されています。

注: 以下のスクリプトは、DebianベースのLinuxディストリビューションでのみ有効です。他のディストリビューションの場合は、それに応じてスクリプトを調整する必要があります。

この国の原則による保護のブロック
CIDR形式のIP範囲は、Webサイトhttp://www.ipdeny.com/ipblocks/data/countries/から取得され、国コードで名前が付けられて参照されるIPSetの個々のリストに入力されます。 iptablesを使用してTARGETを定義します(一致するIPをどうするか: DROP
注: この例では、スクリプトはiptablesルールのターゲットを DROPに設定します 拒否の代わりに TCP/IPスタック拒否応答の大量のトラフィックを回避するため。 ドロップ 何も応答しません。

重要な注意: 以下のこのスクリプトは、で実行する必要があります 通常のファイアウォールルールをロードしました。 挿入 新しいiptablesは、これらの定義された国からの着信パケットがにブロックされるようにルールを設定します ファイアウォールでのそれ以上の処理。

手順:
#!/bin/bash
# Description: Uses IPSET and IPTABLES to block full countries from accessing the server for all ports and protocols
# Syntax: countries_firewall.sh countrycode [countrycode] ......
# Use the standard locale country codes to get the proper IP list. eg.
# countries_firewall.sh cn ru ro
# Will create tables that block all requests from China, Russia and Romania
# Changes: 13.11.2016 Initial creation of script
# Note: To get a sorted list of the inserted IPSet IPs for example China list(cn) run the command:
# ipset list cn | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4
# #############################################################################
# Defining some defaults
iptables="/sbin/iptables"
tempdir="/tmp"
sourceURL="http://www.ipdeny.com/ipblocks/data/countries/"
#
# Verifying that the program 'ipset' is installed
if ! (dpkg -l | grep '^ii ipset' &>/dev/null) ; then
echo "ERROR: 'ipset' package is not installed and required."
echo "Please install it with the command 'apt-get install ipset' and start this script again"
exit 1
fi
[ -e /sbin/ipset ] && ipset="/sbin/ipset" || ipset="/usr/sbin/ipset"
#
# Verifying the number of arguments
if [ $# -lt 1 ]; then
echo "ERROR: wrong number of arguments. Must be at least one."
echo "countries_firewall.sh countrycode [countrycode] ......"
echo "Use the standard locale country codes to get the proper IP list. eg."
echo "countries_firewall.sh cn ru ro"
exit 2
fi
#
# Now load the rules for blocking each given countries and insert them into IPSet tables
for country ; do
# Read each line of the list and create the IPSet rules
# Making sure only the valid country codes and lists are loaded
if wget -q -P $tempdir ${sourceURL}${country}.zone ; then
# Destroy the IPSet list if it exists
$ipset flush $country &>/dev/null
# Create the IPSet list name
echo "Creating and filling the IPSet country list: $country"
$ipset create $country hash:net &>/dev/null
(for IP in $(cat $tempdir/${country}.zone) ; do
# Create the IPSet rule from each IP in the list
echo -n "$ipset add $country $IP --exist - "
$ipset add $country $IP -exist && echo "OK" || echo "FAILED"
done) > $tempdir/IPSet-rules.${country}.txt
# Destroy the already existing rule if it exists and insert the new one
$iptables -D INPUT -p tcp -m set --match-set $country src -j DROP &>/dev/null
$iptables -I INPUT -p tcp -m set --match-set $country src -j DROP
# Delete the temporary downloaded counties IP lists
rm $tempdir/${country}.zone
else
echo "Argument $country is invalid or not available as country IP list. Skipping"
fi
done
# Display the result of the iptables rules in INPUT chain
echo "======================================"
echo "IPSet lists registered in iptables:"
$iptables -L INPUT -n -v | grep 'match-set'
# Dispaly the number of IP ranges entered in the IPset lists
echo "--------------------------------------"
for country ; do
echo "Number of ip ranges entered in IPset list '$country' : $($ipset list $country | wc -l)"
done
echo "======================================"
#
#eof

スクリプト操作のログ:

スクリプトでわかるように、IPSetテーブルへのIP範囲の追加はログインしています:$ tempdir/IPSet-rules。${country}.txtこれは、同じ国でスクリプトが実行されるたびに上書きされます。

スクリプトの開始

このファイアウォールアドオンが起動のたびに正しく起動することを確認するために、ユーザー定義のファイアウォールの後で、cron @rebootを介して起動します。 ファイアウォールサービスを含む他のサービスを開始させるために、約40秒の遅延(必要に応じて調整可能)の後にジョブを実行します。スクリプトを開始するこの方法はあまり洗練されていませんが、Sysinit-VベースかSystemdベースかを問わず、Linuxディストリビューションのほとんどすべてのバリエーションに適合します。ルートcronジョブの例:
@reboot /bin/sleep 40 ; /bin/bash -c ". /root/.bashrc ; /root/bin/countries_firewall.sh cn ru"

メールごとにトラフィックレポートを送信する

毎日メールごとにトラフィックレポートを送信するために、私は毎日iptablesからトラフィックデータを収集し、フォーマットして、次のbashスクリプトを使用してメールで送信します。このスクリプトは、cronによって毎日実行され(/etc/cron.daily/に配置)、トラフィックカウンターがリセットされます。
#!/bin/bash
# Purpose: Sends the blocked traffic report per email and resets the counter
# Syntax: iptables_report
# Dependencies: Systems tools: iptables, awk, column, whois, sendmail
# Changes: 13.11.2016 First implementation of script
#----------------------------------------------------------
HOST=$(cat /etc/hostname | tr 'a-z' 'A-Z')
email="[email protected]"
reportsender="cron@$HOST"
subject="BLOCKED Packets report on $(hostname | tr 'a-z' 'A-Z')"
tempdir="/tmp"
file1="iptables_report1.txt"
file2="iptables_report2.txt"
#
#------------ Build the header of the mail to send ------------
echo "From: $reportsender" > $tempdir/$file1
echo "To: $email" >> $tempdir/$file1
echo "Subject: $subject" >> $tempdir/$file1
echo "MIME-Version: 1.0" >> $tempdir/$file1
echo 'Content-Type: text/html; charset="ISO-8859-15"' >> $tempdir/$file1
echo "" >> $tempdir/$file1
echo "<br />" >> $tempdir/$file1
echo -e "<font size=3 FACE='Courier'><pre>" >> $tempdir/$file1
# Formatted message starts here
# Add the country at the end of each line
# Load the header and data to the temporary file 2
echo -e "Packets Bytes Source \n======= ========= ======" >$tempdir/$file2
/sbin/iptables -L -n -v | /bin/grep -v '^ 0' | /bin/grep 'match-set' | /usr/bin/awk '{print $1" "$2" "$11}' >> $tempdir/$file2
#
# Format temp file2 into temp file1
cat $tempdir/$file2 | column -t >> $tempdir/$file1
#
#
# Add the last HTML preformatting End
echo -e "</pre>" >> $tempdir/$file1
echo "" >> $tempdir/$file1
#
#----------------- Send the prepared email ---------------------------
# now format the report and send it by email
cat $tempdir/$file1 | /usr/sbin/sendmail -t
rm $tempdir/$file1 $tempdir/$file2
#
# Reset the iptables counters
/sbin/iptables -Z
#
# eof

定期的な日次レポート用のcronジョブの作成
そのファイルを例に保存します。 /etc/cron.daily/iptables_report
実行可能にする:
chmod 755 /etc/cron.daily/iptables_report
レポートメールの例:
Packets Bytes Source
======= ========= ======
188 7852 ru
19295 1150K cn

手動ステータス:
INPUTチェーンのiptablesルールの手動ステータスを取得するには、次のコマンドを実行します。
iptables -L INPUT -v -n
IPSet IPリストのソートされたリストを取得するには、次のコマンドを実行します(例:ロシアの場合):
ipset list ru | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4


Linux
  1. ホストのブラックリストとiptablesをブロックする

  2. golangを使用してSFTPサーバーからファイルを一覧表示、アップロード、およびダウンロードする方法

  3. GeoIPとiptablesがある国からのIP範囲をブロックする

  1. Fail2Ban Howto:Fail2ban と IPTables を使用して IP アドレスをブロックする

  2. IPTables Flush:RedHat および CentOS Linux でのすべてのルールの削除/削除

  3. Linux でソースから (および YUM を使用して) MongoDB をインストールする方法

  1. CentOS/RHEL で firewalld を使用してサーバーからのすべてのトラフィックを許可する方法

  2. CentOS / RHEL :iptables を使用して受信ポートと送信ポートをブロックする方法

  3. awk を使用して n 番目から最後までのすべての列を出力する