ブラックリストに載っている悪質なIPアドレスからのアクセスを遮断する方法
世の中にはスパムや攻撃といったことを繰り返す悪質なIPアドレスのリストが存在しています。
有名なものではstopforumspamがあり、スパム行為をするIPアドレスのリストが提供されています。
今回はインターネットに存在する複数のIPアドレスリストを自動的に収集し、ファイアウォールで掲載されているIPアドレスからのアクセスを遮断する方法を紹介します。
IPアドレス一覧の一覧
IPアドレスのリストのリストを提供するFireHOL IP Listsというウェブサイトがあります。
これはインターネット上のIPアドレス一覧をまとめているサイトです。
また、これらのIPアドレスを自動的に収集するupdate-ipsets.shというスクリプトも提供されています。
初期設定
update-ipsets.sh
update-ipsets.shは指定されたIPアドレス一覧を取得し、ipsetに取り込むスクリプトです。
このスクリプトの動作にはipsetとiprangeというソフトウェアが必要なのでインストールしてください。
ipsetとiprangeのビルドに必要なパッケージはこのコマンドでインストールできます:
1 |
sudo apt-get install zlib1g-dev gcc make git autoconf autogen automake pkg-config curl ipset |
1 |
sudo yum install zlib-devel gcc make git autoconf autogen automake pkgconfig curl ipset |
iprangeは自力でビルドします。
1 2 3 4 5 6 7 8 |
cd /tmp git clone https://github.com/firehol/iprange.git iprange.git cd iprange.git ./autogen.sh ./configure --prefix=/usr CFLAGS="-march=native -O3" --disable-man make sudo make install |
update-ipsets.shは単なるシェルスクリプトなので/usr/local/bin
に直置きでいいでしょう。
1 2 |
sudo curl 'https://raw.githubusercontent.com/firehol/firehol/master/sbin/update-ipsets' > /usr/local/bin/update-ipsets sudo chmod 0755 /usr/local/bin/update-ipsets |
ipeset-apply.sh
update-ipsets.shは存在するipsetを自動でアップデートしますが、最初の初期設定を行うのがipset-apply.shです。
これはipsetのsetの作成とIPアドレスの反映をするスクリプトです。
手動でやってもいいですが、あると簡単に進められるのでダウンロードしておきましょう。
1 2 |
sudo curl 'https://raw.githubusercontent.com/firehol/firehol/master/contrib/ipset-apply.sh' > /usr/lcoal/bin/ipset-apply sudo chmod 0755 /usr/lcoal/bin/ipset-apply |
ipsetの永続化
ipsetは再起動するたびに設定が消滅します。
起動時にipsetが復元されるように設定してください。
1 |
sudo apt install ipset-persistent |
1 2 |
sudo yum install ipset-service sudo systemctl enable ipset |
iptablesの永続化
iptablesの設定も再起動で消えるので永続化。
CentOSはデフォルトでfirewalldですが、firewalldは--permanent
オプションで消えなくなるので何もしなくていいです。
1 |
sudo apt install iptables-persistent |
1 2 |
sudo yum install iptables-services sudo systemctl enable iptables |
定期アップデート
リストは定期的にアップデートされるのでcronで定期的にアップデートしてきます。
1 |
*/9 * * * * root /usr/local/update-ipsets >/dev/null 2>&1 |
ダウンロードとリストの反映
初期設定が終わったので、実際にリストをダウンロードしてipsetに入れましょう。
まずはリストの選定ですが、ここに書いてあるので参考にしてください。
すべてのリストの一覧はFireHOL IP Listsにあります。
1 2 3 4 5 6 |
# リストの有効化 sudo update-ipsets enable LIST_NAME # 最新のリストをダウンロード sudo update-ipsets # ipset有効化 sudo ipset-apply LIST_NAME |
ファイアウォールの設定
ipsetに取り込んだだけではアクセスの拒否はできないのでファイアウォールを設定します。
iptables
iptablesの設定ファイルを直接編集していきます。
Debian/Ubuntuは/etc/iptables/rules.v4
、CentOSは/etc/sysconfig/iptables
です。
入ってくるパケットに対してipsetの特定のリストに入っているIPアドレスからのアクセスを遮断する場合はリストごとに以下を記述します。
1 |
-A INPUT -m set --match-set LIST_NAME src -j DROP |
iptablesは先のルールが優先的に処理されます。
後に追加しても先のルールで処理されると遮断できなくなるので注意してください。
実際にどのくらいファイアウォールで遮断されたかを確認したい場合はログに出すように設定します。
1 2 3 4 5 |
-N LOGDROP -A LOGDROP -m limit --limit 5/m -j LOG --log-prefix "[IPTABLES DROP]" -A LOGDROP -j DROP -A INPUT -m set --match-set LIST_NAME src -j LOGDROP |
編集が終わったら設定ファイルを再ロードされます。
1 |
sudo netfilter-persistent start |
1 |
sudo systemctl reload iptables |
firewalld
--direct
オプションでiptablesを直接触ります。
1 2 |
sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -m set --match-set LIST_NAME src -j DROP sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m set --match-set LIST_NAME src -j DROP |
update-ipsetsを実行すると、Cannot access /usr/local/bin/install.configになります。解決方法がわかれば教えてください。