国ごとの IP アドレスリストを取得する
先日、FirewallD で MaxMind DB (geoip)みたいに国ごとでのアクセス制限を行う方法を模索していました。
結論としては、FirewallD にモジュールを組み込む方法は見つからなかったのですが、国ごとの IP アドレスリストを公表しているサイトを発見しました。
しかも利用しやすい一般的なマスク形式(例:192.168.0.0/16)で記述されていました。
この形式ならば、ACL(Access Control List)にも適用しやすいのでご紹介します。
IPdeny
IPdeny(https://www.ipdeny.com/)は ACL のためのアクセス制限リストとして提供しているみたいで、しかも IPV4 形式(https://www.ipdeny.com/ipblocks/)と IPV6 形式(https://www.ipdeny.com/ipv6/ipaddresses/blocks/)で公開されており、タイムスタンプで確認した限りでは、ほぼ毎日の間隔で更新されているようです。
ファイル名の形式は ISO 3166-1国名コード に「.zone」を付け加える形式で記述されています。(例:中国の場合は「cn.zone」)
FirewallD での利用例
中国の IP アドレスリストを取得する。
# wget https://www.ipdeny.com/ipblocks/data/countries/cn.zone -O /tmp/cn.zone.ipv4
# wget https://www.ipdeny.com/ipv6/ipaddresses/blocks/cn.zone -O /tmp/cn.zone.ipv6
ipset を追加する。
# firewall-cmd --permanent --new-ipset=cn.zone.ipv4 --type=hash:net
# firewall-cmd --permanent --new-ipset=cn.zone.ipv6 --type=hash:net --option=family=inet6
ipset をファイルから読み込む
# firewall-cmd --permanent --ipset=cn.zone.ipv4 --add-entries-from-file=/tmp/cn.zone.ipv4
# firewall-cmd --permanent --ipset=cn.zone.ipv6 --add-entries-from-file=/tmp/cn.zone.ipv6
DROP ゾーンに ipset を追加
# firewall-cmd --permanent --zone=drop --add-source ipset:cn.zone.ipv4
# firewall-cmd --permanent --zone=drop --add-source ipset:cn.zone.ipv6
FirewallD のリロードと確認
# firewall-cmd --reload
# systemctl restart firewalld
# systemctl status firewalld
DROP ゾーンの確認
# firewall-cmd --zone=drop --list-all
drop (active)
target: DROP
ingress-priority: 0
egress-priority: 0
icmp-block-inversion: no
interfaces:
sources: ipset:DROPLIST ipset:cn.zone.ipv4 ipset:cn.zone.ipv6
services:
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
問題ない様です。
作業ファイルの削除
# rm -f /tmp/cn.zone.*
通常運用するには
運用するのであれば、アドレスリストの更新が1週間に一度くらいは必要になるかと思います。
シェルファイルなどを作成し、「/etc/cron.weekly/」などに格納すれば良いのではないでしょうか。