Nginx – Blocking access từ một quốc gia

Tác giả: 04/04/2024

Chào các bạn, hôm nay Nhân Hòa sẽ cùng các bạn cấu hình chặn request từ một quốc gia dựa theo GEOIP2 database

Bước 1 – Đăng ký tài khoản lấy dữ liệu database

Trang chủ đăng ký tài khoản GeoLite2 Sign Up | MaxMind

Sau khi đăng ký các bạn sẽ nhận được thông tin tài khoản, kiểm tra email và đăng nhập đường link đăng ký mật khẩu của tài khoản

Sau khi tạo password chúng ta sẽ login và tạo License Key

Thêm MAXMIND repository vào Ubuntu

add-apt-repository ppa:maxmind/ppa

apt-get update

apt-get install geoipupdate

Chỉnh sửa GEOIPUPDATE configuration file.

vi /etc/GeoIP.conf

Chèn your account ID and license key.

AccountID YOUR_ACCOUNT_ID_HERE
LicenseKey YOUR_LICENSE_KEY_HERE
EditionIDs GeoLite2-Country GeoLite2-City

Các bạn thay YOUR_ACCOUNT_ID_HERE  và YOUR_LICENSE_KEY_HERE bằng thông tin đã tạo bên trên.

Sau đó update database of GEOIP2.

apt update && apt upgrade -y
geoipupdate -v

Xác thực  GEOIP2 database installation

ls -la /usr/share/GeoIP

 

Chúng ta có dữ liệu chặn theo quốc gia và theo thành phố, như vậy là bạn đã hoàn thành task cài đặt DB GEOIP2

Bước 2 – Cài đặt Nginx và module cần thiết

apt-get update
apt-get install nginx libnginx-mod-http-geoip2

Chỉnh sửa file cấu hình nginx.conf

vi /etc/nginx/nginx.conf

Thêm ngay dưới http block

geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
auto_reload 60m;
$geoip2_metadata_country_build metadata build_epoch;
$geoip2_data_country_code country iso_code;
$geoip2_data_country_name country names en;
}
map $geoip2_data_country_code $allowed_country {
default yes;
US no;
}

Ở đây mình sẽ chặn Mỹ mã US nhé

Sau đó chỉnh sửa Nginx configuration của  default website.

vi /etc/nginx/sites-available/default

Thêm vào 1 đoạn

if ($allowed_country = no) {
return 403;
}

Ngay dưới location /

Kiểm tra cấu hình

nginx -t

systemctl restart nginx

systemctl enable nginx

Bước 3 – GEOIP2 – Database update ( Bước này bạn có thể bỏ qua)

Tạo một scheduled task để update the GEOIP2 database.

vi /etc/cron.d/geoip2update

Thêm vào nội dung

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root /usr/bin/geoipupdate

Bước 4 – Tạo log bao gồm mã quốc gia trong request

vi /etc/nginx/nginx.conf

Xóa dòng log sau

access_log /var/log/nginx/access.log;

Sau đó chúng ta sẽ thêm 1 đoạn cấu hình ,file hoàn chỉnh như sau

log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $geoip2_data_country_code';
access_log /var/log/nginx/access.log main;

Khởi động lại nginx

service nginx restart

Kiểm tra thử truy cập từ Việt Nam

Kiểm tra thử truy cập từ Mỹ , ở trên mình đã chặn US

Như vậy Nhân Hòa đã hướng dẫn các bạn cấu hình chặn access theo quốc gia trên Nginx

Hẹn gặp lại các bạn tại các bài viết sau tại wiki.nhanhoa.com

 

Trả lời