2026年11月12日
2026年11月12日
Nginx GeoIP2 ile Ülkeye Göre Erişimi Kısıtlama: GeoLite2 ve WordPress
Bu makale, Japonca orijinalin yerelleştirilmiş sürümüdür. Japonca orijinali oku
Nginx'te ülkeye göre erişimi kısıtlamak için GeoIP2 modülünü (ngx_http_geoip2_module) ve MaxMind'in GeoLite2 veritabanını kullanıp, geoip2 bloğuyla ülke kodunu bir değişkene koymak ve map ile izin ya da reddi belirlemek, Kasım 2026 itibarıyla güncel yöntemdir. Eski yazılardaki "GeoLite'ın .dat dosyasını wget ile indir" adımı, veri dağıtımı sona erdiği için çalışmaz.
Önce sonucu özetleyelim.
- Eski
ngx_http_geoip_module(GeoIP Legacy), MaxMind eski biçimdeki veri dağıtımını bitirdiği için yeni kurulumlarda kullanılamaz. GeoIP2'ye (.mmdbbiçimi) geçilir. - GeoLite2 ücretsizdir, ancak MaxMind hesabı kaydı ve lisans anahtarı gerekir; indirme ve güncelleme
geoipupdateile yapılır. - Nginx tarafında
geoip2bloğuyla$geoip2_country_codegibi bir değişken oluşturulur,mapileallow/denykarşılığı olan 0 / 1 belirlenir velocationiçindereturn 403verilir. - Cloudflare gibi bir CDN'den geçen sitelerde, önce
real_ip_headerile ziyaretçinin gerçek IP'si geri getirilmezse hepsi CDN'in ülkesi olarak değerlendirilir. - Ülkeye göre kısıtlama "saldırıları azaltan yardımcı bir önlemdir" ve VPN veya aktarıcılarla aşılabilir. Tüm herkese açık sayfalara değil, giriş ekranına ve yönetim ekranına odaklanarak kullanmak gerçekçidir.
Eski geoip ile GeoIP2 arasındaki fark
| Öğe | ngx_http_geoip_module (eski) | ngx_http_geoip2_module (GeoIP2) |
|---|---|---|
| Veri biçimi | GeoIP Legacy (.dat) |
GeoIP2 (.mmdb) |
| Ücretsiz veri sunumu | Sona erdi (2019'da dağıtım bitti) | GeoLite2 (hesap kaydı ve lisans anahtarı gerekir) |
| Gerekli kütüphane | libGeoIP | libmaxminddb |
| Modülün edinilmesi | Nginx standardı (--with-http_geoip_module) |
Üçüncü taraf modül leev/ngx_http_geoip2_module. Debian / Ubuntu'da paketi var |
| Değişkenler | $geoip_country_code gibi sabit |
geoip2 bloğunda adını kendiniz verirsiniz |
Mevcut ayarınızda geoip_country kullanılıyorsa, veritabanı güncellemesi durduğu için değerlendirme eskimiştir. Bu vesileyle GeoIP2'ye geçin.
Adım 1: MaxMind’e kaydolun ve lisans anahtarı oluşturun
- MaxMind'in GeoLite2 sayfasından ücretsiz bir hesap açın.
- Giriş yaptıktan sonra, hesap yönetim ekranında bir License Key oluşturun (anahtar yalnızca oluşturulurken gösterildiği için not edin).
- Kullanılacak veritabanı, yalnızca ülke için
GeoLite2-Country, şehre kadar gerekiyorsaGeoLite2-City'dir. Ülkeye göre kısıtlama için Country yeterlidir.
Kullanım koşullarında (GeoLite2 End User License Agreement) verinin yeniden dağıtımı ve gösterimi ile ilgili kurallar vardır. Yalnızca kurum içi sunucuda değerlendirme için kullanmak normal kapsamdadır, ancak koşulları kayıt sırasında kontrol edin.
Adım 2: geoipupdate ile veritabanını alın ve güncelleyin
GeoLite2 düzenli olarak güncellendiğinden, elle indirmek yerine geoipupdate kullanın (geoipupdate belgeleri).
# Debian / Ubuntu
sudo apt install geoipupdate
# RHEL ailesi (AlmaLinux / Rocky Linux) için EPEL'den
sudo dnf install geoipupdate
Ayar dosyası /etc/GeoIP.conf içine hesap kimliğini ve lisans anahtarını yazın.
AccountID 123456
LicenseKey buraya oluşturduğunuz anahtar
EditionIDs GeoLite2-Country
# Kayıt yeri dağıtımın varsayılanıdır (Debian / Ubuntu'da /var/lib/GeoIP, diğerlerinde çoğunlukla /usr/share/GeoIP).
# Değiştirirken DatabaseDirectory /var/lib/GeoIP
sudo geoipupdate -v
ls -l /var/lib/GeoIP/ # GeoLite2-Country.mmdb varsa başarılıdır
Paket sürümündeki geoipupdate, systemd zamanlayıcısı veya cron ile düzenli çalışacak şekilde ayarlıdır (systemctl list-timers | grep geoip ile kontrol edin). Yoksa haftada bir kadar bir cron ekleyin.
Adım 3: Nginx’e GeoIP2 modülünü kurun
Debian / Ubuntu (apt ile kurulan Nginx)
sudo apt install libnginx-mod-http-geoip2
ls /etc/nginx/modules-enabled/ # 50-mod-http-geoip2.conf yerleştirilir
nginx -t
nginx.org paketleri veya kaynaktan derlenmiş Nginx
libmaxminddb'yi kurduktan sonra, çalışan Nginx ile aynı sürümün kaynağından dinamik modülü derleyin.
sudo apt install libmaxminddb-dev # RHEL ailesinde libmaxminddb-devel
cd /usr/local/src
git clone https://github.com/leev/ngx_http_geoip2_module
curl -LO https://nginx.org/download/nginx-1.26.3.tar.gz # sürümü nginx -v'ye göre ayarlayın
tar xzf nginx-1.26.3.tar.gz && cd nginx-1.26.3
./configure --with-compat --add-dynamic-module=../ngx_http_geoip2_module
make modules
sudo cp objs/ngx_http_geoip2_module.so /etc/nginx/modules/
nginx.conf dosyasının başında yükleyin (paket sürümünde otomatik yerleştirilir).
load_module modules/ngx_http_geoip2_module.so;
Adım 4: Ülke kodunu değişkene koyup izin veya reddi belirleyin
http bloğuna yazın. geoip2 bloğuyla ülke kodunu değişkene koyun, map ile izin verilecek ülkeyi 1, diğerlerini 0 yapın.
http {
geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {
auto_reload 60m;
$geoip2_country_code country iso_code;
}
# Yönetim ekranına izin verilen ülke (ISO 3166-1'in 2 harfli kodu)
map $geoip2_country_code $admin_allowed {
default 0;
JP 1;
"" 1; # Belirlenemeyenlere (özel IP vb.) izin ver. Reddetmek istiyorsanız 0
}
}
auto_reload, geoipupdate'in değiştirdiği veritabanını yeniden başlatmadan tekrar okuma aralığıdır.
Adım 5: Yalnızca WordPress giriş ve yönetim ekranını kısıtlayın
Herkese açık sayfaları kısıtlamadan, yalnızca wp-login.php ve /wp-admin/'i ülkeye göre daraltan bir örnektir. server bloğuna yazın.
server {
# ... mevcut ayarlar ...
location = /wp-login.php {
if ($admin_allowed = 0) { return 403; }
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ^~ /wp-admin/ {
if ($admin_allowed = 0) { return 403; }
# admin-ajax.php'yi harici eklentiler kullanıyorsa ayrı bir location ile izin verin
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
}
if ile return birleşimi, Nginx'in güvenle işleyebildiği bir biçimdir. /wp-admin/admin-ajax.php'yi herkese açık sayfaların işlevleri (form, sonsuz kaydırma vb.) oturum açmadan çağırabildiğinden, kısıtlamadan çıkarıp çıkarmamayı sitenin işlevlerine göre belirleyin.
Uygulama ve kontrol:
sudo nginx -t && sudo systemctl reload nginx
# Kendi ülkenizden: 200 veya 302 döner
curl -sI https://example.com/wp-login.php | head -1
# Değerlendirmenin kontrolü (günlüğe ülke kodunu yazdırma örneği)
# log_format geo '$remote_addr $geoip2_country_code "$request" $status';
Yurt dışından görünümü kontrol etmek için, yurt dışı noktalı bir VPN'den veya ülke dışındaki bir izleme hizmetinden wp-login.php'ye erişip 403 aldığınızı görün.
CDN (Cloudflare vb.) kullanılıyorsa
CDN üzerinden geçince $remote_addr CDN'in IP'si olur ve herkes CDN'in ülkesi olarak değerlendirilir. Önce ngx_http_realip_module ile ziyaretçinin gerçek IP'sini geri getirin (realip modülü).
# Cloudflare örneği. IP listesini Cloudflare resmî IP Ranges'ten düzenli olarak güncelleyin
set_real_ip_from 173.245.48.0/20;
# ... Cloudflare'in tüm aralıklarını sıralayın ...
real_ip_header CF-Connecting-IP;
geoip2 varsayılan olarak $remote_addr'e bakar; bu yüzden realip ile değiştirildikten sonraki gerçek IP üzerinden değerlendirilir. Cloudflare'in kendisinde de ülkeye göre erişim denetimi (WAF özel kuralları) olduğundan, Cloudflare kullanıyorsanız kısıtlamayı Nginx yerine Cloudflare tarafında yapmak ayar olarak daha kolaydır. WordPress'e Cloudflare kurma yazısına da bakın.
Ülkeye göre kısıtlamanın sınırları
- GeoIP değerlendirmesi, IP adresinin kayıt bilgisine dayanan bir tahmindir; VPN, proxy ve yurt dışı bulutlardan aktarımla aşılabilir.
- Mobil hatlarda ve kurumsal ağlarda, gerçek konumdan farklı bir ülke olarak değerlendirilebilir. Yurt dışı seyahatindeki bir yöneticinin dışarıda kalması gibi işletme sorunları da çıkar.
- Bu nedenle ülke kısıtlaması, giriş denemelerindeki kaba kuvvet saldırılarını azaltan bir yardımcı olarak; iki adımlı doğrulama, giriş sayısı sınırlaması ve Basic kimlik doğrulamayla wp-admin'in korunması ile birlikte kullanılır.
Sık sorulan sorular
Nginx’in geoip modülü ile geoip2 modülü arasındaki fark nedir
Eski geoip modülü GeoIP Legacy biçimindeki (.dat) veriyi okur, ancak MaxMind bu biçimin dağıtımını bitirmiştir. geoip2 modülü (ngx_http_geoip2_module) güncel .mmdb biçimini okur ve GeoLite2'nin ücretsiz verisi kullanılabilir. Yeni ayarları geoip2 ile yapın.
GeoLite2 ücretsiz mi? Kayıt gerekli mi
Ücretsizdir, ancak MaxMind hesabı kaydı ve lisans anahtarı oluşturulması gerekir. İndirme ve düzenli güncelleme geoipupdate ile yapılır. Anahtar kullanmadan doğrudan indirme yapan eski adımlar çalışmaz.
Ülkeye göre kısıtlarsam WordPress’e yetkisiz girişi önleyebilir miyim
Kaba kuvvet denemelerini azaltma etkisi vardır; ancak VPN veya yurt dışı sunucudan aktarımla aşılabildiği için önleyeceği söylenemez. Giriş sayısı sınırlaması, iki adımlı doğrulama, Basic kimlik doğrulama vb. ile birlikte kullanın.
Cloudflare kullanınca herkes aynı ülke oluyor
CDN üzerinden geçince bağlantı kaynağı CDN'in IP'si olduğu içindir. set_real_ip_from ve real_ip_header CF-Connecting-IP ile gerçek IP'yi geri getirdikten sonra değerlendirin. Cloudflare WAF ile ülkeye göre kısıtlama yöntemi de vardır.
GeoLite2-City kullanırsam şehre kadar kısıtlayabilir miyim
Şehir ve bölge kodları da değişkene konabilir, ancak şehir düzeyindeki doğruluk ülkeden düşüktür ve yanlış değerlendirmeyle meşru kullanıcıları dışarıda bırakmak kolaylaşır. Erişim denetimi için ülke düzeyinde kalmak daha güvenlidir.
Özet
- Güncel Nginx ülke kısıtlaması GeoIP2 (ngx_http_geoip2_module + GeoLite2
.mmdb) ile yapılır, verigeoipupdateile güncellenir. geoip2ile ülke kodunu değişkene koyun,mapile izin veya reddi belirleyin,wp-login.phpve/wp-admin/içinlocationiçindereturn 403verin.- CDN üzerindeyse önce gerçek IP'yi geri getirin; ülke kısıtlamasını iki adımlı doğrulama vb. ile birlikte kullanılan yardımcı bir önlem olarak kullanın.
İlgili yazılar
- WordPress REST API erişimini kısıtlama yöntemi
- htpasswd ile Apache Basic kimlik doğrulama parolası oluşturma: wp-admin'in korunması
- WordPress'e Cloudflare kurulumu için eksiksiz rehber
Kaynaklar: ngx_http_geoip2_module (GitHub), MaxMind GeoLite2 Free Geolocation Data, MaxMind – Updating Databases (geoipupdate), Nginx ngx_http_realip_module
Güncelleme geçmişi: 2026-11-09 kapsamlı revizyon (dağıtımı biten eski GeoLite adımı GeoIP2 ve geoipupdate adımlarıyla değiştirildi, WordPress yönetim ekranı kısıtlama örneği ve CDN uyarısı eklendi). Bu yazı WordPress Hakase (Lightscend Inc.) tarafından işletilmektedir.
WordPress hakkında sorunuz mu var? Bu sitenin yayıncısı Japonya'dadır ve Japonca yanıt verir. İletişim (Japonca)