Nginx – Blocking access từ một quốc gia
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