Merhaba arkadaşlar, bugün sizlere Nginx web sunucunuzda, ziyaretçilerinizin hangi ülkeden bağlandığını tespit edip buna göre özel içerik göstermeyi veya erişimi tamamen engellemeyi nasıl yapacağınızı anlatacağım. Bu yöntem, lisanslı içerik dağıtımı yapıyorsanız, bölgesel kampanyalar düzenliyorsanız veya belirli ülkelerden gelen saldırı trafiğini kesmek istiyorsanız oldukça faydalıdır. Benim sunucularda genelde güvenlik ve içerik lokalizasyonu için sıkça kullandığım bir yöntem.
Ön Hazırlık ve Gereksinimler
Öncelikle, bu işlemi yapabilmek için Nginx'inizin http_geoip2_module dinamik modülü ile derlenmiş olması veya sizin bu modülü ekleyebileceğiniz bir kuruluma sahip olmanız gerekiyor. Ayrıca, MaxMind'ın ücretsiz GeoLite2 veritabanlarını indirip güncel tutmalısınız.
İlk adım olarak, gerekli paketleri kuralım ve veritabanlarını indirelim. Ben örnekleri Ubuntu/Debian tabanlı sistemler üzerinden vereceğim.
Şimdi, MaxMind GeoLite2 veritabanlarını indireceğimiz bir dizin oluşturalım ve içine indirelim.
Burada dikkat etmelisiniz: MaxMind, ücretsiz veritabanları için artık bir lisans anahtarı (license key) istiyor. YOUR_LICENSE_KEY yazan yere, MaxMind'in sitesinden ücretsiz kayıt olarak alacağınız anahtarı yazmalısınız. Ayrıca bu veritabanlarını düzenli (örneğin ayda bir) güncellemek için bir cron job oluşturmanızı şiddetle tavsiye ederim.
Nginx Modülünün Yüklenmesi ve Konfigürasyonu
Eğer Nginx'iniz bu modülle birlikte gelmediyse, dinamik modül olarak yükleyebilir veya Nginx'i baştan bu modülle derleyebilirsiniz. En kolay yolu, dağıtımınızın paket deposundan modülü aramaktır. Örneğin:
Paketi yükledikten sonra, Nginx ana konfigürasyon dosyasında (/etc/nginx/nginx.conf) bu modülü yüklememiz gerekiyor. http bloğunun en üstüne aşağıdaki satırı ekleyin.
Ardından, yine http bloğu içinde, indirdiğimiz veritabanını kullanacak şekilde geoip2 ayarlarını yapılandıralım.
Bu konfigürasyon, $geoip2_country_code değişkenine ülke kodunu (ör: TR, US, DE) ve $geoip2_country_name değişkenine de İngilizce ülke ismini atayacak.
Erişim Kısıtlama Örneği
Diyelim ki sadece Türkiye'den gelen trafiğe izin vermek istiyorsunuz. Bunun için bir server veya location bloğu içinde aşağıdaki gibi bir kontrol yazabilirsiniz.
Bu kural, ülke kodu "TR" olmayan tüm istekleri 403 Forbidden hatası ile engeller. Şu ayara çok dikkat etmelisiniz: if kullanımı Nginx'te genelde önerilmez ama bu basit kontrol için kullanılabilir. Daha karmaşık kurallar için map direktifini araştırmanızı öneririm.
Coğrafi Konuma Göre İçerik Sunma
Engellemek yerine, farklı ülkeler için farklı içerik (örneğin farklı dilde bir sayfa veya bölgesel bir kampanya banner'ı) göstermek isterseniz, bunu da değişkenleri kullanarak yapabilirsiniz.
Öncelikle, http bloğunda bir map oluşturarak, ülke koduna göre hangi kök dizinin (root) kullanılacağını belirleyelim.
Daha sonra, server bloğunuzda root direktifini bu değişkene ayarlayın.
Bu şekilde, Türkiye'den giren bir kullanıcı /var/www/site/tr dizinindeki, Almanya'dan giren /var/www/site/de dizinindeki içeriği görecektir. Diğer tüm ülkeler ise default dizindeki içeriği görecek.
Test ve Sorun Giderme
Konfigürasyonları yaptıktan sonra mutlaka Nginx'i test edin ve yeniden başlatın.
Test etmek için, farklı bir ülke IP'sinden bağlanıyormuş gibi yapmanız gerekebilir. Bunun için tarayıcı eklentileri (GeoProxy gibi) veya komut satırından curl ile özel header'lar göndermeyi araştırabilirsiniz. Ayrıca, Nginx erişim loglarınıza $geoip2_country_code değişkenini ekleyerek hangi ülkeden ne kadar trafik geldiğini de takip edebilirsiniz.
Son olarak, veritabanının doğru çalıştığını komut satırından kontrol etmek için mmdblookup aracını kullanabilirsiniz.
Bu komut, Google'ın DNS IP'si (8.8.8.8) için ülke kodunu (US) göstermelidir.
Umarım bu rehber faydalı olmuştur. Bu yapılandırma sayesinde sunucunuzun güvenliğini artırabilir ve kullanıcı deneyimini kişiselleştirebilirsiniz. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı kullanım senaryolarınız var mı? Ya da takıldığınız bir nokta olursa aşağıya yazmaktan çekinmeyin, beraber çözelim.
Öncelikle, bu işlemi yapabilmek için Nginx'inizin http_geoip2_module dinamik modülü ile derlenmiş olması veya sizin bu modülü ekleyebileceğiniz bir kuruluma sahip olmanız gerekiyor. Ayrıca, MaxMind'ın ücretsiz GeoLite2 veritabanlarını indirip güncel tutmalısınız.
İlk adım olarak, gerekli paketleri kuralım ve veritabanlarını indirelim. Ben örnekleri Ubuntu/Debian tabanlı sistemler üzerinden vereceğim.
Bash:
sudo apt-get update
sudo apt-get install libmaxminddb0 libmaxminddb-dev mmdb-bin -y
Şimdi, MaxMind GeoLite2 veritabanlarını indireceğimiz bir dizin oluşturalım ve içine indirelim.
Bash:
sudo mkdir -p /usr/share/GeoIP
cd /usr/share/GeoIP
sudo wget -O GeoLite2-Country.tar.gz "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=YOUR_LICENSE_KEY&suffix=tar.gz"
sudo tar -xzf GeoLite2-Country.tar.gz --strip-components=1
sudo mv GeoLite2-Country.mmdb GeoIP2-Country.mmdb
Burada dikkat etmelisiniz: MaxMind, ücretsiz veritabanları için artık bir lisans anahtarı (license key) istiyor. YOUR_LICENSE_KEY yazan yere, MaxMind'in sitesinden ücretsiz kayıt olarak alacağınız anahtarı yazmalısınız. Ayrıca bu veritabanlarını düzenli (örneğin ayda bir) güncellemek için bir cron job oluşturmanızı şiddetle tavsiye ederim.
Eğer Nginx'iniz bu modülle birlikte gelmediyse, dinamik modül olarak yükleyebilir veya Nginx'i baştan bu modülle derleyebilirsiniz. En kolay yolu, dağıtımınızın paket deposundan modülü aramaktır. Örneğin:
Bash:
sudo apt-get install nginx-module-geoip2
Paketi yükledikten sonra, Nginx ana konfigürasyon dosyasında (/etc/nginx/nginx.conf) bu modülü yüklememiz gerekiyor. http bloğunun en üstüne aşağıdaki satırı ekleyin.
NGINX:
load_module modules/ngx_http_geoip2_module.so;
Ardından, yine http bloğu içinde, indirdiğimiz veritabanını kullanacak şekilde geoip2 ayarlarını yapılandıralım.
NGINX:
http {
...
geoip2 /usr/share/GeoIP/GeoIP2-Country.mmdb {
$geoip2_country_code country iso_code;
$geoip2_country_name country names en;
}
...
}
Bu konfigürasyon, $geoip2_country_code değişkenine ülke kodunu (ör: TR, US, DE) ve $geoip2_country_name değişkenine de İngilizce ülke ismini atayacak.
Diyelim ki sadece Türkiye'den gelen trafiğe izin vermek istiyorsunuz. Bunun için bir server veya location bloğu içinde aşağıdaki gibi bir kontrol yazabilirsiniz.
NGINX:
server {
listen 80;
server_name sitem.com;
if ($geoip2_country_code != "TR") {
return 403;
# veya başka bir sayfaya yönlendirebilirsiniz:
# return 301 https://ornek.com/erisim-reddedildi;
}
... # Diğer sunucu ayarları
}
Bu kural, ülke kodu "TR" olmayan tüm istekleri 403 Forbidden hatası ile engeller. Şu ayara çok dikkat etmelisiniz: if kullanımı Nginx'te genelde önerilmez ama bu basit kontrol için kullanılabilir. Daha karmaşık kurallar için map direktifini araştırmanızı öneririm.
Engellemek yerine, farklı ülkeler için farklı içerik (örneğin farklı dilde bir sayfa veya bölgesel bir kampanya banner'ı) göstermek isterseniz, bunu da değişkenleri kullanarak yapabilirsiniz.
Öncelikle, http bloğunda bir map oluşturarak, ülke koduna göre hangi kök dizinin (root) kullanılacağını belirleyelim.
NGINX:
http {
...
map $geoip2_country_code $site_root {
default /var/www/site/default;
TR /var/www/site/tr;
DE /var/www/site/de;
FR /var/www/site/fr;
}
...
}
Daha sonra, server bloğunuzda root direktifini bu değişkene ayarlayın.
NGINX:
server {
listen 80;
server_name sitem.com;
root $site_root;
location / {
index index.html;
}
}
Bu şekilde, Türkiye'den giren bir kullanıcı /var/www/site/tr dizinindeki, Almanya'dan giren /var/www/site/de dizinindeki içeriği görecektir. Diğer tüm ülkeler ise default dizindeki içeriği görecek.
Konfigürasyonları yaptıktan sonra mutlaka Nginx'i test edin ve yeniden başlatın.
Bash:
sudo nginx -t
sudo systemctl reload nginx
Test etmek için, farklı bir ülke IP'sinden bağlanıyormuş gibi yapmanız gerekebilir. Bunun için tarayıcı eklentileri (GeoProxy gibi) veya komut satırından curl ile özel header'lar göndermeyi araştırabilirsiniz. Ayrıca, Nginx erişim loglarınıza $geoip2_country_code değişkenini ekleyerek hangi ülkeden ne kadar trafik geldiğini de takip edebilirsiniz.
Son olarak, veritabanının doğru çalıştığını komut satırından kontrol etmek için mmdblookup aracını kullanabilirsiniz.
Bash:
mmdblookup --file /usr/share/GeoIP/GeoIP2-Country.mmdb --ip 8.8.8.8 country iso_code
Bu komut, Google'ın DNS IP'si (8.8.8.8) için ülke kodunu (US) göstermelidir.
Umarım bu rehber faydalı olmuştur. Bu yapılandırma sayesinde sunucunuzun güvenliğini artırabilir ve kullanıcı deneyimini kişiselleştirebilirsiniz. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı kullanım senaryolarınız var mı? Ya da takıldığınız bir nokta olursa aşağıya yazmaktan çekinmeyin, beraber çözelim.