中国をブロックして再起動した後でもブロック状態を維持する方法は?実行中に発生した問題

中国をブロックして再起動した後でもブロック状態を維持する方法は?実行中に発生した問題

使ってみようこのソリューション

私は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

ipsetswap2つのセット(または-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 restore2倍になりました(ここでループテストは約6秒から約0.06秒に短縮されました)。-existここで、入力リスト自体に重複が含まれている場合はこれを無視し、アイテムのロード時の早期中断を防ぎます。入力リストに解析できないコンテンツがあると思われる場合は、フィルタリングして解析可能にする(空白行を削除するなど)、ループに戻すことができますが、次のような構造を使用することをお勧めしますforwhile read

while read net; do
    ipset -exist add china.tmp "$net"
done < /etc/cn.zone

iptables-restore現在のスクリプトに滞在するか、別のスクリプト(iptablesルールは生成されたセットに依存するため、現在のスクリプトによって異なります)に入れて、セット更新機能とiptablesルール更新機能を別々に保持できます。

スクリプトがさらに改善される可能性があると確信しています(特にcn.zone全体の結果に影響を与えない場合でも、起動時に失敗すると予想されるファイルのロード。おそらくこの部分も分離する必要があります)。

おすすめ記事