Block country trên Nginx miễn phí

Mình chia sẻ lại các bước cấu hình Nginx để chặn truy cập từ một quốc gia nào đó hoàn toàn miễn phí dùng GeoIP module.

Cách này sẽ sử dụng cơ sở dữ liệu IP của MaxMind GeoIP để xác định quốc gia của khách truy cập. Yêu cầu Nginx phải được kích hoạt module nginx-module-geoip thì mới dùng được.

Trong bài mình sử dụng CentOS 7, phiên bản CentOS khác hoặc hệ điều hành khác thao tác cũng tương tự.

Cài đặt Nginx với GeoIP module

Nginx kể từ phiên bản v. 1.9.11 đã hỗ trợ dynamic module nên chúng ta không còn phải compile lại Nginx từ đầu như trước nữa.

– Đảm bảo server kích hoạt EPEL và Nginx repository.

– Cài đặt nginx-module-geoip

yum install nginx-module-geoip

– Thêm dòng sau vào đoạn đầu file /etc/nginx/nginx.conf

load_module "modules/ngx_http_geoip_module.so";

– Kiểm tra Nginx và khởi động lại nếu không có vấn đề gì:

nginx -t
service nginx restart

Lấy dữ liệu GeoLite2

– Đăng ký tài khoản MaxMind miễn phí: https://www.maxmind.com/en/geolite2/signup

– Đặt mật khẩu cho tài khoản rồi lấy AccountID và LicenseKey, chọn versions older than 3.1.1.

– Cập nhật thông tin AccountID và LicenseKey trong file /etc/GeoIP.conf

– Cập nhật cơ sở dữ liệu IP GeoLite2 với lệnh:

geoipupdate

Có thể phải chờ 5 – 10 phút mới chạy được lệnh trên. Nếu như không có output nào xuất hiện tức là bạn đã cập nhật xong, dữ liệu sẽ lưu trong thư mục /usr/share/GeoIP/

Khi cần cài đặt trên server khác bạn chỉ cần copy lại AccountID và LicenseKey là được.

Cấu hình Nginx dùng GeoIP

Chỉnh sửa nội dung file /etc/nginx/nginx.conf, thêm đoạn sau vào block http {}, trước tất cả các dòng include:

    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default yes;
        RU no;
        AO no;
    }

Ý nghĩa đoạn code ví dụ trên là cho phép tất cả các nước truy cập, loại trừ Russia và Angola. Xem thêm danh sách country code.

Tiếp theo, chỉnh file cấu hình tên miền muốn chặn để sử dụng biến $allowed_country đã map, nên sử dụng ngay sau dòng server_name. Đoạn code chặn như sau:

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

Kiểm tra Nginx và khởi động lại nếu không có vấn đề gì:

nginx -t
service nginx restart

Giờ test thử nếu thành công bạn sẽ thấy thông báo chặn truy cập như sau:

Chúc bạn thành công.

5/5 - (2 votes)
Subscribe
Notify of
guest

24 Bình luận
mới nhất
cũ nhất
Inline Feedbacks
View all comments

Duy
22
Duy
2 năm trước

sao em bi loi nay a No match for argument: nginx-module-geoip

Triệu Vỹ
1,929
Triệu Vỹ
2 năm trước

Làm hướng dẫn cho Ubuntu với Luân ơi laugh

Binh Nguyen
1,477
Binh Nguyen
2 năm trước

Nay mình thử cấu hình hocvps mà k thành công, Dòng thử bỏ vào từng dòng server_name nhưng k được, có ae nào dùng ok k?

Binh Nguyen
1,477
Binh Nguyen
2 năm trước
Reply to  Luân Trần

cho mình hỏi cái dòng server_name mình đặt thử từng chỗ r mà khi truy cập nó báo lỗi 520 là sao nhỉ? Mình có dùng ssl của cloudflare và bật đám mây vàng lun.
Dạo này mấy thằng CN, Ấn nó ddos suốt sad

Xuân
635
Xuân
2 năm trước

Ngon cơm smile

Binh Nguyen
1,477
Binh Nguyen
2 năm trước

mình mới cài thử cập nhật ID vs key vô chạy lệnh : geoipupdate nó báo lỗi ” Received an unexpected HTTP status code of 401 from https://updates.maxmind.com/app/update_secure?db_md5=00000000000000000000000000000000&challenge_md5=XXXXX0e8a6c93&user_id=XXXX&edition_id=GeoLite2-Country:
Invalid account ID or license key”
có ai gặp tình trạng lỗi như mình k

Nam Luu
27
Nam Luu
2 năm trước
Reply to  Binh Nguyen

Edit file GeoIP.conf theo dạng ( for versions < 3.1.1. )

# UserId is from your MaxMind account.
UserId

# LicenseKey is from your MaxMind account
LicenseKey

# ProductIds is from your MaxMind account.
ProductIds GeoLite2-ASN GeoLite2-City GeoLite2-Country

Binh Nguyen
1,477
Binh Nguyen
2 năm trước
Reply to  Nam Luu

Mình có làm theo hướng dẫn của 1 bạn trên github giống như bạn, nhưng vẫn báo lỗi

Nam Luu
27
Nam Luu
2 năm trước
Reply to  Binh Nguyen

Khi tạo Licensekey:
Old versions of our GeoIP Update program use a different license key format. Will this key be used for GeoIP Update?
Chọn: Yes

Chọn tiếp vào :

Generate a license key and config file for use with geoipupdate versions older than 3.1.1.
This key will be stored in an unhashed format.

Rồi Confirm để nó tạo mã cho phiên bản thấp hơn 3.1

Rồi làm theo bước ở trên là được

Binh Nguyen
1,477
Binh Nguyen
2 năm trước
Reply to  Nam Luu

Lúc đầu mình tích chọn mục đầu, giờ mới tạo cái mục dưới như bạn nói thì vẫn báo lỗi như trên..k bít bị j nữa

Nam Luu
27
Nam Luu
2 năm trước
Reply to  Binh Nguyen

Chú ý ở bản > 3.1 của GeoIP.conf

UserId sẽ thay là AccountID

ProductIds sẽ thay là EditionIDs

Lưu ý: Nên tạo Licen mới

Binh Nguyen
1,477
Binh Nguyen
2 năm trước
Reply to  Nam Luu

cám ơn bạn đã thành công laugh

Dương
1,340
Dương
2 năm trước

HocVPS đã hoạt động ngon lành lại chưa anh Luân ? Mới vào lại thì thấy đã support Rocky Linux 8, Ubuntu 18.04 hoặc Ubuntu 20.04 rồi laugh

Nguyen Van Dang
173
Nguyen Van Dang
2 năm trước
Reply to  Dương

Bên Nhân Hòa phát triển thấy cũng ổn đó bác

Dương
1,340
Dương
2 năm trước

Là Nhân Hoà đang phát triển trên nền tảng của Hocvps hả bác?

Nguyen Van Dang
173
Nguyen Van Dang
2 năm trước
Reply to  Dương

Đúng rồi bác. Bác Luân chuyển nhượng lại Hocvps cho Nhân Hoà phát triển

Binh Nguyen
1,477
Binh Nguyen
2 năm trước
Reply to  Dương

ngon rồi bạn, mình xài hocvps cho các site chính khá ok

Dương
1,340
Dương
2 năm trước
Reply to  Binh Nguyen

Chắc phải test thử rồi, hồi trước xài Hocvps bao nhẹ laugh

Hoàng Nhân
48
Hoàng Nhân
2 năm trước
Reply to  Dương

Vậy có Bác nào dùng hocvps trên Ubuntu chưa cho xin ít review nào … từ cài hocvps trên CentOS bị mình ko dùng hocvps .. giờ thấy phát triển trên Ubuntu nên muốn quay lại nhưng vẫn còn ngại smile

Last edited 2 năm trước by Hoàng Nhân
Mai Thi Hien
19
Mai Thi Hien
2 năm trước

Em là chặn china với ấn độ, hai thằng này chẳng được gì mà request vào site em suốt.

Kiều Trường
29
Kiều Trường
2 năm trước
Reply to  Mai Thi Hien

Mình cũng chặn TQ. Toàn vào tìm lỗi WP phá Web . sleepy