Chặn truy cập website từ 1 quốc gia (thành phố) với nginx và GeoLite2


Hướng dẫn cách chặn truy cập từ 1 quốc gia, hoặc 1 thành phố nhất định đến website của mình.

Tại sao bạn phải dùng cách này khi nhà mạng đã cung cấp tính năng chặn IP nước ngoài?
=> Vì cách của nhà mạng sẽ chặn tất cả request đến và đi (2 chiều) từ server của bạn đến IP nước ngoài, vi vậy nó cũng chặn luôn request API từ dịch vụ của bạn đến API có IP nước ngoài, hoặc từ API nước ngoài vào IP dịch vụ của bạn.

Sử dung cách chặn từ nginx, cho phép bạn lựa chọn chỉ chặn từ 1 domain hoặc 1 đường dẫn nhất định đến dịch vụ của bạn mà thôi.

I - Yêu cầu môi trường: 

    - ubuntu 20.04
    - nginx 1.18.0
    - Tạo tài khoản free trên: https://maxmind.com

II - Thực hiện

 2.1 - cài đặt nginx và GeoIP2 module

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

 2.2 - tải file GeoLite2-Country.mmdb lên server của

- đăng nhập trang https://www.maxmind.com/en/accounts/997548/geoip/downloads


- tải file danh sách quốc gia GeoLite2-Country_20240405.tar.gz về máy tính
- giải nén file tải về bằng phần mềm 7zip để được file GeoLite2-Country.mmdb
-
Upload file GeoLite2-Country.mmdb lên server. Ví dụ: /opt/GeoLite2-Country.mmdb

* Lưu ý: nếu muốn chặn theo thành phố, thì download file GeoLite2 City 

2.3 - Cấu hình nginx với Geolite2 Country

Sửa cấu hình file nginx.conf

vi /etc/nginx/nginx.conf

    Thêm vào dưới thẻ http { trong file nginx.conf

http {

geoip2 /opt/GeoLite2-Country.mmdb{

       auto_reload 5m; 

$geoip2_data_country_iso_code country iso_code;

}

map $geoip2_data_country_iso_code $allowed_country {

default no;

VN yes;

}

...

 

* Xem danh sách mã quốc gia ở đây: https://www.geonames.org/countries/
* Danh sách mã thành phố: https://www.geonames.org/search.html?q=&country=VN 

 2.4 - Cấu hình nginx cho website bạn muốn chặn truy cập từ nước ngoài

server {
listen 80 default_server;
listen [::]:80 default_server;
        if ($allowed_country = no) {
return 444;
}                  .... }

2.5 - Restart nginx của bạn

2.6 - Kiểm tra kết quả tại https://check-host.net/check-http


Nhận xét

Bài đăng phổ biến từ blog này

How to Build NodeJS REST API with Express and PostgreSQL

Cài đặt Let's Encrypt trên CentOS 7

Password so với SSH key – sử dụng cách xác thực nào tốt hơn?