
![UFW Firewall](/images/blog/ufw-ile-geoip-tabanli-kural-yapilandirmasi.jpg)

## Giriş

Linux dağıtımlarında kullanılan ve bir güvenlik duvarı olan **UFW, IPtables** güvenlik duvarının yapılandırmasını kolaylaştırmak için geliştirilmiştir.

*Ayrıca* ***UFW’nin*** *varsayılan olarak kapalı olduğunu, kurulumdan sonra etkinleştirmek gerektiğini hatırlatmakta fayda vardır.*

Bu noktadan sonra işletim sistemimiz **Debian** sunucu, **GeoIP** Database için de **MaxMind DB** olarak yazımıza devam edeceğiz.

**MaxMind,** internet üzerindeki IP adreslerinin coğrafi konumlarını belirlemek için kullanılan bir teknoloji sağlayıcısı olduğundan; geliştirici ve işletmeler ürünlerini optimize etmekte bu teknolojiden yararlanırlar.

## Debian ve CentOS sunucularda UFW Kurulumu

## Debian için UFW Kurulumu:

**Debian** sunucularda **main** repoda UFW paketini doğrudan kurabilirsiniz:

![](/images/blog/ufw-ile-geoip-tabanli-kural-yapilandirmasi-1.gif)

## CentOS için UFW Kurulumu:

**UFW** **RedHat** tabanlı dağıtımlarda default repolarda bulunmadığından. **EPEL** reposunun eklenmesi gerekmektedir.

> **EPEL** reposunun eklenmesi sonrası **UFW** kurulumu gerçekleştirebilir.

- <https://docs.fedoraproject.org/en-US/epel/>
- <https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/sec-using_firewalls>

## UFW’nin Temel Kullanımı

**UFW**‘yi kullanarak, belirli portları açmak veya kapatmak, belirli IP adreslerine izin vermek veya engellemek gibi işlemler yapabilirsiniz.

> Örneğin, 21 portunu açmak için **ufw allow 21** komutunu, kapatmak için **ufw deny 21** komutunu kullanabilirsiniz

Bir IP adresini veya IP bloğunu **Whitelist**’e alıp sınırlamalara takılmamak için ufw allow from <IP> komutunu kullanabilirsiniz.

> Bağlantı kesintisi yaşamamak için kurulum sonrasında etkin olmayan **UFW**’yi etkinleştirmeden önce **IP** adresinizi **Whitelist**’e alabilirsiniz.

Kurallar eklendikten sonra ufw enable komutu ile **UFW**‘yi aktif hale getirebilirsiniz.

**Örnek:**

![](/images/blog/ufw-ile-geoip-tabanli-kural-yapilandirmasi-2.gif)

## GeoIP Yapılandırması

## Gerekli Paketlerin Kurulumu:

GeoIP tabanlı kuralların yapılandırılması için bir takım paketlerin kurulması gerekiyor, bu paketler CSV okuma, Iptables için pluginleri içeriyor.

```
apt install perl xtables-addons-common libtext-csv-xs-perl libmoosex-types-netaddr-ip-perl
```

Ayrıca MaxMind DB’den alacağımız CSV dosyalarını tutmak ve derlemek için bir dizin oluşturacağız:

```
mkdir /usr/share/xt_geoip
```

## MaxMind GeoIP CSV indirilmesi

MaxMind CSV formatında hazırladığı Database’i sürekli olarak yenilendiğinden dolayı bunu bir betik ile indirip ilgili dizine dosyaları aktaracağız.

**Betik:**

```
#!/bin/bash
LICENSE_KEY="your_license_key"
url="https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=$LICENSE_KEY&suffix=zip"
local_zip_path="/usr/share/xt_geoip/GeoLite2-Country-CSV.zip"
curl -o "$local_zip_path" "$url"
unzip "$local_zip_path" -d "/usr/share/xt_geoip/"
extracted_folder=$(ls /usr/share/xt_geoip/ | grep 'GeoLite2-Country-CSV_')
mv "/usr/share/xt_geoip/${extracted_folder}"/* /usr/share/xt_geoip/
rm -r "/usr/share/xt_geoip/${extracted_folder}/"
rm "$local_zip_path"
```

Yukarıdaki betikte **LICENSE_KEY** değişkenine lisans keyinizi girerek güncel GeoIP Database’ini alabilirsiniz.

*Database sürekli olarak yenilendiği için betiğin bir Cronjob ile çalıştırmasında fayda var. Eğer çalıştırılmazsa Database’e eklenen yeni IP’ler için erişim problemleri yaşayabilirsiniz.*

Lisans ile ilgili detaylar: <https://support.maxmind.com/hc/en-us/articles/4407111582235-Generate-a-License-Key>

## Betiğin çalıştırılması:

![](/images/blog/ufw-ile-geoip-tabanli-kural-yapilandirmasi-3.gif)

## UFW için veritabanının Build Edilmesi

**CSV** formatında bulunan **Database’in** **UFW** ile kullanılabilir hale getirilmesi için build işleminin yapılması gerekiyor:

```
/usr/libexec/xtables-addons/xt_geoip_build_maxmind -D /usr/share/xt_geoip/ -S /usr/share/xt_geoip/
```

Burada çalışan bash kodunu açıklamamız gerekir:

**/usr/libexec/xtables-addons/xt_geoip_build_maxmind** binary’si GeoIP Database’inin MaxMind özelinde build edilmesini sağlıyor. Aynı şekilde farklı bir Database kullanılacaksa /**usr/libexec/xtables-addons/xt_geoip_build** binary’si kullanılabilir.

-D parametresi Destination, yani CSV dosyalarının nerede işleneceği

-S parametresi Source ise CSV dosyalarının nereden okunacağı bilgisini alıyor.

## GeoIP için Plugin’in Kernel’e Eklenmesi

GeoIP tabanlı **UFW** kuralları için eklediğimiz **xtables** pluginini Kernel’a tanıtarak kullanılabilir hale getiriyoruz:

```
modprobe xt_geoip
```

## GeoIP için Kural Eklenmesi

Yapılandırmalar tamamlandıktan sonra, ihtiyacınıza göre GeoIP kurallarının eklenmesini sağlayabilirsiniz.

Burada önemli bir noktaya değinmekte fayda var. **UFW’de** **GeoIP** tabanlı kural yaparken bu işlemleri hem kalıcı kılmak adına hem de kolay yönetebilmek adına aşağıdaki dosyaları ekliyoruz:

1\) **/etc/ufw/before.rules**  
2) **/etc/ufw/before6.rules**

Burada ilk dosya IPV4 için işlenecek kurallar, ikinci dosya ise IPV6 için işlenecek kuralların yer aldığı kısım.

> **ÖNEMLİ NOT:**

> Eğer Port kısıtlaması yapacak ve işlem sağlayacağınız IP adresi veya bloğu bu şartın dışarısında kalacak ise GeoIP tabanlı kurallar öncesinde aynı dosyalarda GeoIP tabanlı kuralların öncesinde IP’nizi Whitelist’e eklemeniz gerekmekte. Aynı şekilde bu dosyalar içerisinde eklenecek kuralları, dosyanın sonunda yer alan **COMMIT** satırından önce eklemeniz gerekmekte.

> Örnek olarak: SSH portunu sadece Türkiye IP’lerine vereceksiniz fakat Türkiye dışında bir IP Adresi veya bloğundan bu sunucuya SSH bağlantı yapılması gerekiyor.

> Bunun için sırasıyla şu satırların eklenmesi gerekiyor:

> -A ufw-before-input -s 192.168.1.101 -j ACCEPT -A ufw-before-input -m geoip -p tcp –dport 22 –src-cc TR -j ACCEPT

İlk satırda yer alan:

**-s** parametresi bütün portlara iznin tanımlandığı IP,  
**-j** parametresi vermiş olduğunuz IP adresine uygulayacağınız izin

Burada **ACCEPT** komutu verilecek tanımlanan IP adresine izin verileceği anlamına gelmektedir.

İkinci satırda yer alan:

**-m** parametresi ile kullanacağımız modulün ismi,  
**-p** parametresi ise portun tipi (TCP/UDP/HTTP/s vb.),  
**-dport** parametresi ise kuralın tanımlanacağı port numarası,  
**–src-cc** parametresi kaynağın geldiği ülke bilgisi,  
**-j** parametresi ise bu tanımlanan bilgilere izin verilip verilmeyeceğinin bilgisi

Bu eklemelerden sonra **/etc/ufw/before.rules** dosyasının son görünümü şu şekilde olmalıdır:

```
-A ufw-before-input -s 192.168.1.101 -j ACCEPT
-A ufw-before-input -m geoip -p tcp --dport 22 --src-cc TR -j ACCEPT
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
```

Özetle 22 SSH portu için sadece Türkiye IP’lerine, 192.168.1.101 için ise bütün portlara erişim sağlayacak şekilde izinler tanımlandı.

Eğer spesifik olarak GeoIP bazlı kuralların overwrite edilmesi, bu kuralın dışına çıkılması gerekilirse şu adımlar izlenebilir:

Örneğin 22 (SSH) portu sadece Türkiye IP’lerine izin verilmişti, burada bu kuralın dışına çıkılarak yurtdışında bulunan bir IP’ye izin vereceğiz.

Bunun için **/etc/ufw/before.rules** ve **/etc/ufw/before6.rules** dosyasına GeoIP kuralı öncesi için ekleme yapacağız.

```
-A ufw-before-input -p tcp --dport 22 -s  -j ACCEPT
-A ufw-before-input -m geoip -p tcp --dport 22 --src-cc TR -j ACCEPT
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
```

Daha sonrasında **ufw reload** ile kural tanımlanır.

Aynı şekilde Türkiye IP’leri içerisinde bulunan fakat engellenmesi istenen bir IP içinde benzer işlemler yapılabilir:

```
-A ufw-before-input -p tcp --dport 22 -s  -j DROP
-A ufw-before-input -m geoip -p tcp --dport 22 --src-cc TR -j ACCEPT
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
```

Burada overwrite edilecek spesifik kuralların GeoIP bazlı kural öncesinde yazılmasına dikkat etmek gerekiyor.

Daha detaylı bilgilere ulaşmak ister ve bilginizi geliştirmek isterseniz aşağıdaki kaynaklar sizin içindir.

– <https://people.netfilter.org/peejix/geoip/howto/geoip-HOWTO-3.html>  
– <https://github.com/tinti/xtables-addons>  
– <https://www.maxmind.com/en/geoip-databases>
