nftablesを用いたIPアドレス制限(国別)

2024/04/13に公開

nftablesを用いたIPアドレス制限

国ごとに割り振られているIPアドレス一覧を取得する

IPアドレスの一覧を APINIC[1] で公開されているものを取得する。

curl -LO http://ftp.apnic.net/stats/apnic/delegated-apnic-latest

指定した国家のIPアドレスを取り出す

ip_by_country.awk
BEGIN{
    FS="|"
    ipv4="country_whitelist_ipv4"
    ipv6="country_whitelist_ipv6"
    stderr="/dev/stderr"
    print "define country_whitelist_ipv4 = {" > ipv4
    print "define country_whitelist_ipv6 = {" > ipv6
}
{
    if ($2 ~ country) {
        if ($3=="ipv4") {
            ip=$4
            if(and($5,$5-1) == 0) {
                mask=32-log($5)/log(2)
                if (!a[ip,mask]++) print ip"/"mask"," >> ipv4
            } else {
                print "Something is wrong with netmask(CIDR range).\n" ip " / " $5 > stderr
            }
        } else if ($3=="ipv6") {
            ip=$4
            prefix=$5
            if (!b[ip,prefix]++) print ip"/"prefix"," >> ipv6
        }
    }
}
END{
    print "}">> ipv4
    print "}">> ipv6
}

上記スクリプトは、カレントディレクトリにcountry_whitelist_ipv4,country_whitelist_ipv6を作成します。

日本のみ

awk -v country="JP" -f ip_by_country.awk delegated-apnic-latest

複数の国を指定する場合

awk -v country="JP|US|RU" -f ip_by_country.awk delegated-apnic-latest

nftables.confの設定例(抜粋)

/etc/nftablesにコピーしておきます

mkdir -p /etc/nftables
sudo cp country_whitelist_ipv4 /etc/nftables/
sudo cp country_whitelist_ipv6 /etc/nftables/

nftables.confでincludeする。

sshのポートが22の場合の例。

#!/usr/bin/nft -f
# vim:set ts=2 sw=2 et:

include "/etc/nftables/country_whitelist_ipv4"
include "/etc/nftables/country_whitelist_ipv6"

table inet filter {
    set country_accept_ipv4 {
        type ipv4_addr; flags interval;
        elements = $country_whitelist_ipv4
    }
    set country_accept_ipv6 {
        type ipv6_addr; flags interval;
        elements = $country_whitelist_ipv6
    }
        ct state new tcp dport 22 ip saddr @country_accept_ipv4 counter accept
        ct state new tcp dport 22 ip6 saddr @country_accept_ipv6 counter accept

参考サイト

https://inaba-serverdesign.jp/blog/20191219/nftables-country-ipaddress-centos8.html
https://systemexpress.co.jp/centos/ipblock.html
https://www2.filewo.net/wordpress/2019/10/19/2206/

脚注
  1. http://ftp.apnic.net/stats/apnic/delegated-apnic-latest ↩︎

Discussion