
使ってみようこのソリューション。
私はCentos 7とiptables v1.4.21を実行しています。
なぜ必要ですか? 複数のWordPressブログがあります。私は毎日4,000から20,000の無差別ログイン、存在しないファイル、そして後で悪用するために脆弱なプラグインとファイルを見つけようとする自動化された試みを受けます。彼らはすべて中国出身です。他の国もありますが、1日1,000人未満です。したがって、ハードウェアリソースを節約するためにセキュリティを支援し、これらの要求がWebサーバーまたはPHPエンジンに到達する前にブロックしたいと思います。 Security StackExchangeに質問をしようとしましたが、ここでより良いと思います。しかし、わかりません。重複した質問を避けたい。
私のスクリプトは次のとおりです
# Create the ipset list
ipset -N china hash:net
# remove any old list that might exist from previous runs of this script
rm cn.zone
# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone
# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done
# Restore iptables
/sbin/iptables-restore < /etc/sysconfig/iptables
ルールファイルは次のとおりです(空白なし、新しい行なし)。
[root@myserver etc]# cat /etc/sysconfig/iptables
-A INPUT -p tcp -m set --match-set china src -j DROP
[root@myserver etc]#
スクリプトを実行すると、次のエラーが発生します。
ipset v7.1: Element cannot be added to the set: it's already added
ipset v7.1: Element cannot be added to the set: it's already added
ipset v7.1: Element cannot be added to the set: it's already added
ipset v7.1: Element cannot be added to the set: it's already added
(a plenty of the same lines)
ここに2つの3つの質問があります。
- IPset に IP を追加すると、その IP はすでに存在します。中国のブラックリストからすべてのIPを削除するには、スクリプトの先頭に何かを追加する方が良いでしょうか?
- では、どうすればよいですか?
- 再起動後にipsetを復元する方法は?たぶん起動時に同じスクリプトを実行する必要がありますか?
これを追加した後、これを見ました。これは問題ないようですが、まだ上記の問題を解決したいと思います。
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere match-set china src
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
答え1
ipset
swap
2つのセット(または-W
)を自動的に交換するサブコマンドがあります。これにより、新しいセットを埋め、古いセットに置き換えることができ、廃止されたセットを新しい名前で削除できます。ipset flush china
これは、システムを一時的に公開して削除せずにコレクションを他のパラメータに置き換えることができるため、コレクションを更新するよりも優れています。iptables参照ルール(参照中はコレクションを削除できないため)私も切り替えています。IPセット最新の構文。最近保持された唯一の構文です。マンページ(両方の構文は有効です.)
# -exist for idempotence: don't trigger an error the 2nd time this script is run
ipset -exist create china hash:net
# old cn.zone will stay around if download fails
wget -O /etc/cn.zone.tmp http://www.ipdeny.com/ipblocks/data/countries/cn.zone && \
mv /etc/cn.zone.tmp /etc/cn.zone
ipset create china.tmp hash:net
sed 's/^/add china.tmp /' /etc/cn.zone | ipset -exist restore
ipset swap china china.tmp # new set atomically replaces older set
ipset destroy china.tmp
/sbin/iptables-restore < /etc/sysconfig/iptables
ループを(正しい形式の入力)に置き換えると、アイテムのロードがipset -exist restore
2倍になりました(ここでループテストは約6秒から約0.06秒に短縮されました)。-exist
ここで、入力リスト自体に重複が含まれている場合はこれを無視し、アイテムのロード時の早期中断を防ぎます。入力リストに解析できないコンテンツがあると思われる場合は、フィルタリングして解析可能にする(空白行を削除するなど)、ループに戻すことができますが、次のような構造を使用することをお勧めしますfor
。while read
while read net; do
ipset -exist add china.tmp "$net"
done < /etc/cn.zone
iptables-restore
現在のスクリプトに滞在するか、別のスクリプト(iptablesルールは生成されたセットに依存するため、現在のスクリプトによって異なります)に入れて、セット更新機能とiptablesルール更新機能を別々に保持できます。
スクリプトがさらに改善される可能性があると確信しています(特にcn.zone
全体の結果に影響を与えない場合でも、起動時に失敗すると予想されるファイルのロード。おそらくこの部分も分離する必要があります)。
答え2
これを行う
# IPSET BLOCKZONE (select country to block and ip/range) ###
# http://www.ipdeny.com/ipblocks/
ipset=/usr/sbin/ipset
iptables=/usr/sbin/iptables
zone=/path_to_folder/zones
if [ ! -d $zone ]; then mkdir -p $zone; fi
$ipset flush blockzone
$ipset -N -! blockzone hash:net maxelem 1000000
for ip in $(cat $zone/{cn,ru}.zone /path_to/blackip.txt); do
$ipset -A blockzone $ip
done
$iptables -t mangle -A PREROUTING -m set --match-set blockzone src -j NFLOG --nflog-prefix 'Blockzone'
$iptables -t mangle -A PREROUTING -m set --match-set blockzone src -j DROP
$iptables -A INPUT -m set --match-set blockzone dst -j NFLOG --nflog-prefix 'Blockzone'
$iptables -A INPUT -m set --match-set blockzone dst -j DROP
$iptables -A FORWARD -m set --match-set blockzone dst -j NFLOG --nflog-prefix 'Blockzone'
$iptables -A FORWARD -m set --match-set blockzone dst -j DROP
源泉:ブラックプール