vps'inizde firewall üzerinden ülke bazlı yasaklama

ubuntu, debian ve türevlerinde ve hatta komutlarda bir iki değişiklik olsa da diğerlerinde de çalışacak bir firewall yapılandırmasından bahsedeyim dedim. malum çin, rusya, hindistan gibi ülkeler üzerinden sunuculara sürekli port tarama ve buna benzer ataklar yapılıyor. en azından bu üç ülkeden bu işlerin yapılmasını engellemenin yolunu anlatacağım.

VPS'iniz üzerinde firewall işlemleri yapacağımızdan herhangi bir aksiliğe karşı vps'inizin snapshot'ını önceden alın. eğer snapshot desteği yoksa en azından vps hizmeti aldığınız yerde recovery console olduğuna ve root veya sudoer bir başka kullanıcının şifresinin elinizde olduğuna ve bu kullanıcı adı ve şifre ile sisteme login olabildiğinize emin olun. aksi halde bu makaleyi es geçin.

önce vps üzerine ufw açık mı ona bakıyoruz;

[email protected]:~# ufw status
Status: active

aktif değilse;

[email protected]:~# apt install ufw

ufw'yi aktif etmeden önce 22 no'lu ssh portunu iptables'a ekleyelim ki, sonradan başımız ağrımasın;

[email protected]:~# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

artık ufw'yi aktif edebiliriz;

[email protected]:~# ufw enabled

ufw zaten aktif ise yukarıdaki adımları tamamen atlayabiliriz.

şimdi gerekli uygulamaları kuruyoruz;

[email protected]:~# apt install curl unzip perl

[email protected]:~# apt install xtables-addons-common

[email protected]:~# apt install libtext-csv-xs-perl libmoosex-types-netaddr-ip-perl

şimdi geoip database'i için klasör oluşturalım;

[email protected]:~# mkdir /usr/share/xt_geoip

sıra geldi geoip database'ini indirip ilgili klasöre açan script'imizi oluşturmaya, bunun için nano isimli editörü kullanıyoruz;

[email protected]:~# nano /usr/local/bin/geo-update.sh

şimdi aşağıdakileri kopyalayıp sağ mouse tuşu ile paste ediyoruz;

#!/bin/bash

MON=$(date +"%m")
YR=$(date +"%Y")

wget https://download.db-ip.com/free/dbip-country-lite-${YR}-${MON}.csv.gz -O /usr/share/xt_geoip/dbip-country-lite.csv.gz

gunzip /usr/share/xt_geoip/dbip-country-lite.csv.gz

perl /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip/ -S /usr/share/xt_geoip/

rm /usr/share/xt_geoip/dbip-country-lite.csv

ctrl + x ve y diyerek kaydedip editörden çıkalım.

geo-update.sh isimli script dosyamızın çalıştırılabilir bir dosya olduğunu sisteme belirtiyoruz;

[email protected]:~# chmod +x /usr/local/bin/geo-update.sh

[email protected]:~# chmod 755 /usr/local/bin/geo-update.sh

artık script'imiz çalıştırabiliriz;

[email protected]:~# /usr/local/bin/geo-update.sh

aşağıdaki çıktıyı almamız gerekiyor;

--2022-07-23 00:49:34-- https://download.db-ip.com/free/dbip-country-lite-2022-07.csv.gz
Resolving download.db-ip.com (download.db-ip.com)... 104.26.4.15, 172.67.75.166, 104.26.5.15
Connecting to download.db-ip.com (download.db-ip.com)|104.26.4.15|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3966188 (3.8M) [application/octet-stream]
Saving to: ‘/usr/share/xt_geoip/dbip-country-lite.csv.gz’

/usr/share/xt_geoip/dbip-country 100%[=======================================================>] 3.78M --.-KB/s in 0.06s

2022-07-23 00:49:34 (67.1 MB/s) - ‘/usr/share/xt_geoip/dbip-country-lite.csv.gz’ saved [3966188/3966188]

641333 entries total

ve bu mesajın altında tüm ülkelere ait ip bloklarının olduğu liste uzanıp gidecektir.

herşey yolunda mı bir kontrol edelim;

[email protected]:~# modprobe xt_geoip

[email protected]:~# lsmod | grep ^xt_geoip

çıktısı şuna benzer olmalı, 3 yerine 0 yazabilir sıkıntı yok.

xt_geoip 16384 3

artık ülke bazında yasaklama işine girebiliriz, bunun için aşağıdaki dosyayı ediplememiz lazım;

[email protected]:~# nano /etc/ufw/before.rules

page down tuşu vasıtası ile dosyanın en altına inip COMMIT satırından önce şunları ekleyelim;

# GeoIP Rules
-A ufw-before-input -m geoip -p tcp --src-cc CN,RU,IN -j DROP
-A ufw-before-input -m geoip -p udp --src-cc CN,RU,IN -j DROP

ctrl + x ve y ile kaydedip çıkalım.

böylece çin, rusya ve hindistan'a ait ip'lerin tamamını tcp ve udp tüm portlar için yasaklamış olduk.

isterseniz belirli portları sadece tükiye için açabilirsiniz. mesela ben ssh portunu sadece türkiye'ye açtım, geri kalan tüm ülkeler için kapalı. onu da yine before.rules dosyasının sonuna ekliyoruz;

[email protected]:~# nano /etc/ufw/before.rules

dosyanın altına yeni satırı ekleyelim;

# GeoIP Rules
-A ufw-before-input -m geoip -p tcp --src-cc CN,RU,IN -j DROP
-A ufw-before-input -m geoip -p udp --src-cc CN,RU,IN -j DROP
-A ufw-before-input -m geoip -p tcp --dport 22 --src-cc TR -j ACCEPT

ctrl + x ve y diyerek kaydedelim.

şimdi yaptığımız değişikliklerin hayata geçmesi için;

[email protected]:~# ufw reload

hayırlı olsun.

BeğenFavori PaylaşYorum yap
  • Türker Sezer @dirigeant

    Anlatim icin elinize saglik.

    Daha kolay yonetim ve daha iyi guvenlik icin block listesi yerine izin listesi kullanmanizi tavsiye ederim. VPS uzerine bir VPN servisi (openvpn, pptp) kurup, 80, 443 ve VPN portu haricindeki tum portlari dis dunyadan gelen yeni baglantilara kapatabilirsiniz.

    • Ronnie James Dio @ronniejamesdio

      bu bilmediğim bir çözüm ama deneriz bunu da. var mı bunu anlatan bir link?

    • Türker Sezer @dirigeant

      @ronniejamesdio VPN kurulumu icin herhangi bir VPN kurulum belgesi isinizi gorecektir. Sansurlu internet yuzunden bircok belge mevcut olmali.

      VPN'i kurduktan sonra erisim kisitlamak icin iki farkli yol kullanabilirsiniz.
      1- Sizin yazinizdakine benzer sekilde firewall seviyesinde kisitlama uygulayabilirsiniz. Sadece VPN kurulumu sirasinda tanimladiginiz IP bloguna (ornegin 10.1.0.0/24) 22 portunu acip, diger tum istekleri DROP edebilirsiniz.
      2- SSH servisi ayarlarindan (/etc/ssh/sshd_config dosyasindadir) servisin dinledigi IP adresini VPN networkundeki IP adresi olarak tanimlayabilirsiniz. (ornegin ListenAddress 10.1.0.1).

      Bu degisiklikleri yapmadan once VPN'e sorunsuz baglanabildiginizden, VPN servisinin acilista calismak icin ayarli oldugundan ve VPN'e baglandiktan sonra sunucuya VPN IP adresi uzerinden erisebildiginizden emin olun. Aksi halde siz de SSH erisiminizi kaybedebilirsiniz. 🙂

    • Ronnie James Dio @ronniejamesdio

      @dirigeant ha şimdi anladım, bunun benzerini evde uyguluyorum zaten. raspberry pi dünyaya açık durumda ama sadece vpn'den aldığım ip yi görürse router'dan geçebiliyorum.

Tüm blog yazılarını gör