ことの経緯

 にて記載した続き。
ARIN、RIPE NCC、APNIC、LACNIC、AfriNICなどの情報をもとにグローバルIPを識別していたが、どうやら情報が古いたため、別IPデータベースを利用することに。

利用DB
  • ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
  • ftp://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest
  • ftp://ftp.apnic.net/pub/stats/apnic/delegated-apnic-extended-latest
  • ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest
  • ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-extended-latest

DB選定

探したら、GeoIPを提供している会社を数社発見。
組織名URLコメント
maxmindhttps://www.maxmind.com/en/home情報量多い。GeoIPがここの商標。無料版は精度が落ちるっぽい。$24/月ならありかな。
ipgeolocationhttps://ipgeolocation.io/db-pricing.htmlサーバごとの料金だから割高そう
ipiphttps://en.ipip.net/product/ip.html料金がわからない。情報量がすくない。
mdigitalelementhttps://www.digitalelement.com/geolocation/情報量がすくない。価格表示なし。日本語ページ崩れてる。日本との取引がないのかな。
nginx もmaxmindを採用しているから、ここがよさそう。
http://nginx.org/en/docs/http/ngx_http_geoip_module.html

実装

自分が利用している環境は、amazonlinux2 arm版とnginxを利用していて、これとmaxmind DBを連携する必要がある。 どうやら、参考サイトを見ていくと、実現方法がありそう。「nginx-module-geoip2」moduleをいれればつかえそうだ。

rpmを探す。

既存rpmで入れれたら幸せとおもい、探すがない。自分が利用しているOSがaarch64ベースだからよけいになかった。。 nginxのサイトにnginxと「nginx-module-geoip-(version).amzn2.ngx.aarch64.rpm 」があったが、これは、古いmoduleだった。 getpagespeed 社がrpmを提供してくれているが、こちらは x86_64だった。

rpmを自前で作成するしかなかった。

# wget http://nginx.org/packages/mainline/amzn2/2/SRPMS/nginx-1.21.3-1.amzn2.ngx.src.rpm

# rpm -ivh nginx-1.21.3-1.amzn2.ngx.src.rpm 

# wget https://github.com/leev/ngx_http_geoip2_module/archive/3.3.tar.gz

# tar zxvf 3.3.tar.gz -C ~/rpmbuild/SOURCES

必要なライブラリを入れます。
# yum install gcc libmaxminddb libmaxminddb-devel pcre-devel zlib-devel

# cd ~/rpmbuild/SPECS/

# cp -p nginx.spec nginx.spec.org
# vi nginx.spec
diff -Naru nginx.spec.org nginx.spec
--- nginx.spec.org  2021-09-08 00:48:26.000000000 +0900
+++ nginx.spec  2021-09-14 09:50:28.118949343 +0900
@@ -64,7 +64,7 @@
 %define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC
 %define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie
 
-%define BASE_CONFIGURE_ARGS $(echo "--prefix=%{_sysconfdir}/nginx --sbin-path=%{_sbindir}/nginx --modules-path=%{_libdir}/nginx/modules --conf-path=%{_sysconfdir}/nginx/nginx.conf --error-log-path=%{_localstatedir}/log/nginx/error.log --http-log-path=%{_localstatedir}/log/nginx/access.log --pid-path=%{_localstatedir}/run/nginx.pid --lock-path=%{_localstatedir}/run/nginx.lock --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp --user=%{nginx_user} --group=%{nginx_group} --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module")
+%define BASE_CONFIGURE_ARGS $(echo "--prefix=%{_sysconfdir}/nginx --sbin-path=%{_sbindir}/nginx --modules-path=%{_libdir}/nginx/modules --conf-path=%{_sysconfdir}/nginx/nginx.conf --error-log-path=%{_localstatedir}/log/nginx/error.log --http-log-path=%{_localstatedir}/log/nginx/access.log --pid-path=%{_localstatedir}/run/nginx.pid --lock-path=%{_localstatedir}/run/nginx.lock --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp --user=%{nginx_user} --group=%{nginx_group} --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --add-dynamic-module=${RPM_SOURCE_DIR}/ngx_http_geoip2_module-3.3 --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module")
 
 Summary: High performance web server
 Name: nginx
@@ -84,6 +84,7 @@
 Source7: nginx-debug.service
 Source8: nginx.copyright
 Source9: nginx.check-reload.sh
+Source10: ngx_http_geoip2_module-3.3

 
@@ -217,6 +218,7 @@
 
 %attr(0755,root,root) %dir %{_libdir}/nginx
 %attr(0755,root,root) %dir %{_libdir}/nginx/modules
+%{_libdir}/nginx/modules/*
 %dir %{_datadir}/nginx
 %dir %{_datadir}/nginx/html
 %{_datadir}/nginx/html/*

# cd ~/
# rpmbuild -bb rpmbuild/SPECS/nginx.spec
パッケージに含まれないファイルの検査中: /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/nginx-1.21.3-1.amzn2.ngx.aarch64
書き込み完了: /root/rpmbuild/RPMS/aarch64/nginx-1.21.3-1.amzn2.ngx.aarch64.rpm
書き込み完了: /root/rpmbuild/RPMS/aarch64/nginx-debuginfo-1.21.3-1.amzn2.ngx.aarch64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.X0e7YT
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd nginx-1.21.3
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/nginx-1.21.3-1.amzn2.ngx.aarch64
+ exit 0
こう出ればOK! nginxにはこのように定義した。
# nginx.confのeventより上に追加
load_module "modules/ngx_http_geoip2_module.so";←GeoIP2を追加

# nginx.conf httpディレクティブ内に追加(GeoLite2-Country.mmdbファイルパスは設置した場所)
geoip2 /etc/nginx/GeoLite2-Country.mmdb {
        auto_reload 5m; 
        $geoip2_metadata_country_build metadata build_epoch;
        $geoip2_data_country_code default=US source=$remote_addr country iso_code;
        $geoip2_data_country_name country names en;
    }
    
    map $geoip2_data_country_code $allowed_country {
        default yes;
        BE no;
        BG no;
        CZ no;
        DK no;
        DE no;
        EE no;
        IE no;
        GR no;
        ES no;
        FR no;
        HR no;
        IT no;
        CY no;
        LV no;
        LT no;
        LU no;
        HU no;
        MT no;
        NL no;
        AT no;
        PL no;
        PT no;
        RO no;
        SI no;
        SK no;
        FI no;
        SE no;
        GB no;
    }

# serverディレクティブに追加 これを追加するとアクセスブロックになります。
if ( $allowed_country = "no" ) {
      return 403;
    }
$geoip2_data_country_code $allowed_countryをaccesslogに出力すれば、状況が終えるようになります。 完了!

参考サイト

参考になりました!ありがとうございました! https://takeshiyako.blogspot.com/2016/10/nginx-ngx-http-geoip-module.html
https://kaede.jp/2019/02/18001437/
https://techexpert.tips/ja/nginx-ja/nginx-%e5%9b%bd%e3%81%8b%e3%82%89%e3%81%ae%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%82%92%e3%83%96%e3%83%ad%e3%83%83%e3%82%af%e3%81%99%e3%82%8b/
https://docs.nginx.com/nginx/admin-guide/dynamic-modules/geoip2/ ホワイトリストを適応するには下記でよさそう
https://serverfault.com/questions/585204/nginx-geoipblocking-allowing-lan-ips
おすすめの記事