** 説明:** 以前、ブロックしたい国の IP を一括でブロックする方法についてのチュートリアルを投稿しましたが、特定の国からのウェブサイトへのアクセスや CC 攻撃を防ぐためには、ホワイトリストの設定方法も必要です。そこで、ipset を使用して設定する方法を調査しました。現在、問題なく動作しています。
方法#
まず、国の IP 範囲を取得する必要があります。ダウンロード先:http://www.ipdeny.com/ipblocks/。ここでは、中国を例に説明します。
1. ipset のインストール
# Debian/Ubuntuシステム
apt-get -y install ipset
# CentOSシステム
yum -y install ipset
CentOS 7 では、ファイアウォールを停止する必要があります。
systemctl stop firewalld.service
systemctl disable firewalld.service
2. 以前のルールをクリア
# ルールが適用されないことを防ぐため、以前のファイアウォールルールをクリアすることをお勧めします
iptables -P INPUT ACCEPT
iptables -F
3. 新しいルールの作成
# cnipという名前のルールを作成
ipset -N cnip hash:net
# 国のIP範囲をダウンロードし、ここでは中国を例にします
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone
# IP範囲をcnipルールに追加
for i in $(cat /root/cn.zone ); do ipset -A cnip $i; done
4. IP 範囲のホワイトリストの設定
# IP範囲を許可する
iptables -A INPUT -p tcp -m set --match-set cnip src -j ACCEPT
# すべてのポートを閉じる
iptables -P INPUT DROP
これにより、指定された国の IP のみがサーバーにアクセスできるようになります。
国内にいる場合、ウェブサイトが国内の人によるアクセスを許可しない場合、すべてのポートを閉じないようにしてください。そうすると、SSH にアクセスできなくなります。代わりに、80/443 ポートのみを閉じることができます。
# 特定のポートを閉じる(例:80/443)
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 443 -j DROP
これにより、他の国の IP はサーバーの 80/443 ポートにアクセスできず、ウェブサイトにアクセスできなくなりますが、他のポートにはアクセスできます。
5. ルールの削除
# -Aを-Dに変更すると、ルールが削除されます。例:
iptables -D INPUT -p tcp -m set --match-set cnip src -j ACCEPT
iptables -D INPUT -p tcp --dport 443 -j DROP
説明#
ファイアウォールを設定すると、一部のサーバーではシステムの再起動後にファイアウォールルールがクリアされ、設定が無効になる場合があります。したがって、ルールを設定した後は、iptables コマンドを使用して保存する必要があります。保存コマンドは、多くのシステムで一般的ではないため、ここでは説明しません。各自で検索して解決する必要があります。また、再起動時にファイアウォールを再設定するために、毎回手動で設定することもできます。