Agora Metin2 1
Agora Metin2
Bvural41 1
Bvural41
romegames 1
romegames
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Best Studio 1
Best Studio
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
InfernoShade 1
InfernoShade
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

DDOS saldırısına çözüm!

  • Konuyu başlatan Konuyu başlatan Cartoon Network
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 3
  • Görüntüleme Görüntüleme 912

Cartoon Network

Level 5
TM Üye
Katılım
5 Nis 2012
Konular
190
Mesajlar
649
Online süresi
2d 20h
Reaksiyon Skoru
26
Altın Konu
0
TM Yaşı
14 Yıl 2 Ay 10 Gün
Başarım Puanı
126
Yaş
33
MmoLira
50
DevLira
6
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

Kendi sunucularımızda benzerini kullandığımız ddostan korunma yöntemini sizinle paylaşmak istedim. Oyun sunucularındada işe yaradığı test edilerek onaylanmıştır örnek : metin2

ilk olarak iptables'ı istediğimiz an sıfırlayıp bizim istediğimiz default ayarları yapacak bash scripti yazacağız. Ardından belirli periyodalara, gelen trafiği kontrol edip şüpheli ipleri banlayan programı tanıtacağım. Bu işlemlerin ardından sadece port 80 açık kalacak. Port 80 in önüne de gelen bağlantıları filtre eden nginx webserverin ip filtre özelliğini tanıtacağım.

1 -) iptables sıfırlama
iptables varsayılan kurallarımız
-Tüm gelen ve giden portları kapa
-Sadece localden gelen SSH bağlantılarına izin ver
-80. portu internet bağlantıları için aç
-ayrı makinede bulunan mysql sunucusu için gerekli portları aç
-Tüm portların kapandığından emin ol

Bu işlevi yapan scripti aşağıda veriyorum.

iptables scripti


Kod:
#!/bin/sh # buradaki ip adresini serverinizin ip adresi ile degistirin SERVER_IP="xxx.xxx.xxx.xxx" # Tüm kurallari sifirla iptables -F iptables -X # varsayilan filtre iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # loopback arabiriminde sinirsiz trafik iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # local networkde sinirsiz trafik iptables -A INPUT -i eth1 -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT iptables -A OUTPUT -o eth1 -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT # Allow incoming ssh only 0/0 degisecek , # 0/0 ssh internete acik # 192.168.1.0/24 ssh sadece yerel agda acik iptables -A INPUT -p tcp -s 0/0 -d $SERVER_IP --sport 513:65535 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp -s $SERVER_IP -d 0/0 --sport 22 --dport 513:65535 -m state --state ESTABLISHED -j ACCEPT #80. porttan gelen ve gidene izin ver iptables -A INPUT -p tcp -s 0/0 -d $SERVER_IP --sport 513:65535 --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp -s $SERVER_IP -d 0/0 --sport 80 --dport 513:65535 -m state --state ESTABLISHED -j ACCEPT #remote mysqle bagalanmak icin local network 3306 portunu ac #iptables -A INPUT -p tcp -s 192.168.1.0/24 --sport 3306 -d $SERVER_IP --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT #iptables -A OUTPUT -p tcp -s 192.168.1.0/24 --sport 1024:65535 -d 0/0 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT #yukaridakiler haric tum portlarin kapali oldugundan emin ol iptables -A INPUT -j DROP iptables -A OUTPUT -j DROP


Copy paste ile bir dosyaya uygun bir isimle kayıt edin.
Örnek: iptables-default.sh


Kod:
chmod +x iptables-default.sh


iptables ayarlarını her sıfırlamak istediğimizde bu scripti kullanacağız.
Kullanım şekli : scriptin bulunduğu dizine girip (ssh kullanarak yada command line dan)

Alıntı:
sh iptables-default.sh
2 -) Şüpheli ipleri iptables, cron ve netstat kullanarak banlama

adresinden yükleme programını indirin ver ardından scripti çalıştırın
Örnek


Kod:
wget sh install.sh


Kurulum isleminin ardından /usr/local/ddos dizinine script dosayaları yüklenecektir.

Bu dizinde ddos.conf ve ddos.sh adında iki adet dosya göreceksiniz.

Bu scripti kullanırken belirli ipleri yoksayma ihtiyacı duyabilirsiniz. Örneğin local networkte başka bir makinede çalışan web servis programınızın sunucunuzla aşırı derecede trafiği olabilir. Bu servisi de banlamak istemezsiniz.

Bu nedenle scripete kendi yaptığım bir yamayı sizinle paylaşıyorum.
Önce ddos.conf dosyasının en altına ihmal etmek istediğimiz ipleri yazıyoruz.

Örnek


Kod:
##### Paths of the script and other files PROGDIR="/usr/local/ddos" PROG="/usr/local/ddos/ddos.sh" IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list" CRON="/etc/cron.d/ddos.cron" APF="/etc/apf/apf" IPT="/sbin/iptables" ##### frequency in minutes for running the script ##### Caution: Every time this setting is changed, run the script with --cron ##### option so that the new frequency takes effect FREQ=1 ##### How many connections define a bad IP? Indicate that below. ##### bir ipden kac adet baglanti geldiginde banlansin default 150 NO_OF_CONNECTIONS=150 ##### APF_BAN=1 (Make sure your APF version is atleast 0.96) ##### APF_BAN=0 (Uses iptables for banning ips instead of APF) ##### iptables kullanmak icin bu deger 0 olmali APF_BAN=0 ##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script) ##### KILL=1 (Recommended setting) KILL=1 ##### An email is sent to the following address when an IP is banned. ##### Blank would suppress sending of mails ##### supheli bir ip tespit edildiginden kime email atilsin EMAIL_TO="root" ##### Number of seconds the banned ip should remain in blacklist. ##### ip ne kadar süre ban edilsin saniye cinsinden BAN_PERIOD=600 #bu satırı scripte ben ekledim bosluklara duyarli, bash yuzunden #asagidaki satiri ddos.conf dosyasının sonuna kendi ipadreslerinizi kullanarak yazin PROTECTED_IPS=( "192.168.1.10" "127.0.0.1" "10.0.10.1" "192.168.1.5" )


Daha sonra ddos.sh dosyasının açın ve aşağıdaki satırı bulun


Kod:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST


Bu satırı ve satırın altını tamamen silin ve aşağıdaki kodu yapıştırın


Kod:
#bu bolum synlerden korunmak icin #ard arda 4 adet syn talebi gönderen ip yi banlar BAD_SYN_IP_LIST=`$TMP_FILE` netstat -np | grep SYN_RECV | awk '{print $5}' | cut -d: -f1 | cut -d: -f1 | sort | uniq -c | \ sort -n| awk '{if ($1 > 4) print $2;}' > $BAD_SYN_IP_LIST cat $BAD_SYN_IP_LIST while read SYN_IP; do $IPT -I INPUT -s $SYN_IP -j DROP ; echo $SYN_IP>> $BANNED_IP_LIST echo $SYN_IP>> $IGNORE_IP_LIST done < $BAD_SYN_IP_LIST #bu bolum ddos icin netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST cat $BAD_IP_LIST if [ $KILL -eq 1 ]; then IP_BAN_NOW=0 while read line; do CURR_LINE_CONN=$(echo $line | cut -d" " -f1) CURR_LINE_IP=$(echo $line | cut -d" " -f2) if [ $CURR_LINE_CONN -lt $NO_OF_CONNECTIONS ]; then break fi IGNORE_BAN=`grep -c $CURR_LINE_IP $IGNORE_IP_LIST` if [ $IGNORE_BAN -ge 1 ]; then continue fi IP_BAN_NOW=1 echo "$CURR_LINE_IP with $CURR_LINE_CONN connections" >> $BANNED_IP_MAIL echo $CURR_LINE_IP >> $BANNED_IP_LIST echo $CURR_LINE_IP >> $IGNORE_IP_LIST if [ $APF_BAN -eq 1 ]; then $APF -d $CURR_LINE_IP else NOT_PROTECTED=1 for u in "${PROTECTED_IPS[@]}"; do if [ $CURR_LINE_IP = $u ]; then NOT_PROTECTED=0 break fi done if [ $NOT_PROTECTED -eq 1 && $CURR_LINE_IP != ""]; then $IPT -I INPUT -s $CURR_LINE_IP -j DROP fi fi done < $BAD_IP_LIST if [ $IP_BAN_NOW -eq 1 ]; then dt=`date` if [ $EMAIL_TO != "" ]; then cat $BANNED_IP_MAIL | mail -s "IP addresses banned on $dt" $EMAIL_TO fi unbanip fi fi rm -f $TMP_PREFIX.*


Bu script kurulum esnasında kenidisini dakikada 1 kere çalışacak şekilde sistemin cron'una ekliyor. Süre dolduğunda iptablesi otomatik temizliyor.

3-) Nginx ile port 80 filtreleme

Burada nginxi reverse proxy olarak kullandığınızı ve gerekli ayarları yaptığınızı varsayıyorum.
Nginx te limit_req_zone modülü ile gelen ipleri frekansına göre limitleyebiliyoruz. Aşağıda php dosyaları ve statik dosyaları için kullanacağımız iki adet limit tanımlıyoruz daha sonra istediğimiz nginx virtual host içinde verdiğimiz isimler ile bu limitleri kullanabiliriz.
Ben ddosphp ve ddosstatic isimlerini verdim. 10m lik bir dosya ile 16000 ip state kayıt edebilirsiniz. Buda tek bir sunucu için gayet yeterli..


Bu işlemin ardından 2. maddede kurduğumuz filtreden geçen ve port 80 den gelen talepler, dinamik yada statik sayfalara göre limitleniyor. Örneğin : Dinamik php sayfaları saniyede 1 kere request kabul eder hale geliyor.

Aşağıdaki kodu nginx conf dosyasında http { ile başlayan bölümün içine eklemeniz gerekli.


Kod:
##php dosyaları için tek ipden saniyede max 1 request kabul et limit_req_zone $binary_remote_addr zone=ddosphp:10m rate=1r/s; ### diger dosyalar için tek ipden saniyede 10 request kabul et limit_req_zone $binary_remote_addr zone=ddosstatic:10m rate=10r/s;


Conf dosyasında limitlerimizi tanımladıktan sonra "server {" ile başlayan ve nginx te host tanımlamak için kullandığımız bölümü bulmamız gerekli.
Limitleri vhostumuza uygulamak için hostumuzla ilgili olan server { bölümünü bulup şu şekilde ekleme yapmalıyız


Kod:
server { location / { proxy_pass ... ... .... ##statik dosyalar için tanımlı limiti uygula limit_req zone=ddosstatic burst=10; .... } location ~ \.php$ { proxy_pass ... ... .... ##php dosyaları için tanımlı limiti uygula limit_req zone=ddosphp burst=2; } }


Bu değişiklikleri yaptıktan sonra nginx sunucumuzu kapatıp açmamız gerekli. Restart tavsiye etmiyorum..

Nginxi ben proxy olarak kullanıyorum. Port 80'i nginx dinliyor ve port 81'i dinleyen apache'ye yönlendiriyor. Localde sınırsız trafik tanımladığımız için apache local 81 den talepleri alıyor ve 80. porttan dışarı otomatik gönderiyor.
Port 81 dışarı kapalı olduğu için apache saldırılara karşı güvende oluyor.

Bir çok kişinin ücretli olarak yaptığı bir işlemi sizler için anlatmaya çalıştım. Bu sistemde mail dns vb uygulamaları çalıştırmak isterseniz iptables scriptine gerekli portları açan satırları eklemeniz gerekli. Bu haliyle sadece ssh ve webserver çalışır. Yazının büyük bir bölümü alıntıdır ve tamamı test edilmiştir, kullanırken kendi sorumluluğunuzla kullanın. Umarım fayadalı olablirim...

 
Server kurmaktan bile daha karışık :D Ama yinede teşekkürler :D
 
Videolu Anlatın Olabilir Ama Yinede Saol
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst