Nginx: Sử dụng GeoIP (v1) chặn truy cập theo quốc gia và whitelist các IP address tin cậy
Sử dụng nginx để chặn truy cập vào trang web / dịch vụ của bạn đối với các khu vực không cần thiết sẽ rất hữu ích, đặc biệt khi phát hiện dịch vụ bị tấn công từ các IP không có user của dịch vụ.
Cấu hình nginx block theo quốc gia
ref: https://stackoverflow.com/a/30930303/2533787
ref: https://www.howtoforge.com/tutorial/how-to-use-geoip-with-nginx-on-ubuntu-16.04/
Kiểm tra phiên bản nginx có phù hợp và cài 1 số module cần thiết.
# kiểm tra nginx có complite với module --with-http_geoip_module
nginx -V
# cài đặt geoip database (thường có sẵn trong ubuntu)
sudo apt-get install geoip-database libgeoip1
# Update GeoIP Database
# /usr/share/GeoIP/GeoIP.dat but it could be outdated, let update
mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bk
cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
- Chú ý:
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
có thể thất bại do dịch vụ đã hết duy trì, ngoài việc bỏ qua dùng file có sẵn (có thể dữ liệu đã outdated), bạn có thể dùng GeoIP2: https://dev.iachieved.it/iachievedit/geoip2-and-nginx/, hoặc download legacy database tại URL https://www.miyuru.lk/geoiplegacy
- IP v4: https://dl.miyuru.lk/geoip/maxmind/country/maxmind4.dat.gz
- IP v6: https://dl.miyuru.lk/geoip/maxmind/country/maxmind6.dat.gz
Tiếp theo, cấu hình nginx với GeoIP:
Mở file /etc/nginx/nginx.conf
, thêm vào nội dụng sau trong http {}
, trước các dòng include
ví dụ cho phép IP từ VN truy cập
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default no;
VN yes;
}
bước này chưa chặn truy cập, chúng ta mới chỉ set giá trị cho biến
$allowed_country
Bước tiếp theo, cấu hình virtualhost của chúng ta, (/etc/nginx/conf.d/YOURDOMAINHERE.conf
) - đặt nội dung sau trong server {}
:
location /testing/ {
if ($allowed_country = no) {
return 403;
}
}
Chạy nginx -t
để kiểm tra nếu có lỗi và service nginx reload
để áp dụng cấu hình.
Tạo whitelist cho các địa chỉ IP tin cậy
Case này áp dụng trong 1 số trường hợp IP cần truy cập server nằm trong vùng bị block
-
Tạo danh sách các whitelist IP và add vào
/etc/nginx/nginx.conf
, sau phần cấu hìnhgeoip_country
, ví dụ whitelist ip: 127.0.0.1 và 8.8.8.8geo $whitelist-ip { default no; 127.0.0.1 yes; 8.8.8.8 yes; }
ngoài một địa chỉ IP, bạn có thể whitelist 1 dải IP bằng format
1.2.3.4/5
, ví dụ các IP trong LAN:192.168.1.0/24
-
Trong cấu hình truy cập của virtualhost tương ứng, ta sẽ ghi đè giá trị của
$allowed_country
thànhyes
nếu IP truy cập nằm trong whitelistnội dung sau cần thêm trước phần chặn truy cập
if ($whitelist-ip = yes) { set $allowed_country yes; } location / { if ($allowed_country = no) { return 403; } ...
Tượng tự, kiểm tra và reload lại nginx.
Đối với các phiên bản nginx mới (vd: 1.18.0), thường không còn bundle sẵn module --with-http_geoip_module
, bạn nên chuyển sang sử dụng module GeoIP v2