ことの経緯
にて記載した続き。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 | コメント |
---|---|---|
maxmind | https://www.maxmind.com/en/home | 情報量多い。GeoIPがここの商標。無料版は精度が落ちるっぽい。$24/月ならありかな。 |
ipgeolocation | https://ipgeolocation.io/db-pricing.html | サーバごとの料金だから割高そう |
ipip | https://en.ipip.net/product/ip.html | 料金がわからない。情報量がすくない。 |
mdigitalelement | https://www.digitalelement.com/geolocation/ | 情報量がすくない。価格表示なし。日本語ページ崩れてる。日本との取引がないのかな。 |
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;
}
参考サイト
参考になりました!ありがとうございました! https://takeshiyako.blogspot.com/2016/10/nginx-ngx-http-geoip-module.htmlhttps://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