ipsetで大量のIPをブロック
不正なアクセス試行の多い国を
CIDRで丸っとブロックしたい
ただCIDRが1万以上存在し、
Ansibleの
ufwモジュールとwith_itemsループだと1時間では終わらないくらいめちゃくちゃ時間がかかる
あとサーバの負荷がだいぶ上がる
main.yml- name: Install packages
package:
name:
- ufw
- ipset
update_cache: true
なので、仕方なくshellモジュールで作成する
エラーを防ぐために、
grepで検索して、存在しないときだけ作成・IP/CIDRの登録をするというシェルにする
また、IPの一覧が1万以上あり、それらをwith_itemsのループ変数にセットするとdryrunにもめちゃくちゃ時間がかかるようになる
shellモジュールを使わざるを得ない次点で差分チェックとかは期待できない
YAMLとは別ファイルに分離し、scpしてからサーバ上でwhileループで処理するようにした
少なくともこれでdryrunは一瞬で終わる
main.yml---
- name: Put blacklist file
copy:
src: tmp/blacklist.ip
dest: /tmp/blacklist.ip
- name: Initialize config
ufw:
state: reset
- name: Set logging
ufw:
logging: 'on'
- name: Create ipset
shell: "ipset list blacklist || ipset create blacklist hash:net"
- name: Add entries
shell: "while read -r ip; do ipset list blacklist | grep $ip || ipset add blacklist $ip; done < /tmp/blacklist.ip"
- name: Set iptables
shell: "iptables -A INPUT -m set --match-set blacklist src -j DROP"
- name: Delete blacklist file
file:
path: /tmp/blacklist.ip
state: absent
結果
3分~5分くらいで終わった
ちゃんとブロックされてるかの確認
shgrep BLOCK /var/log/kern.log