14 Şubat 2011 Pazartesi

Ddostan korunma yöntemleri

Kendi sunucularımızda benzerini kullandığımız ddostan korunma yöntemini sizinle paylaşmak istedim.

ilk olarak iptables ı istediğimiz an sıfırlayıp bizim istediğimi default ayarları yapacak bash scripti yazacağız. Ardından belirli periyodalara gelen trafiği kontrol edip şüpeli ipleri banlayan programı tanıtacağım. Bu işlemlerin ardından sadece port 80 açık kalacak. Port 80 in önünede gelen bağlantıları filtre eden nginx webserverin reverse proxy ayarlarını yazağı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 beriyorum. 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 kullanacaz.
Kullanım şekli scriptin bulunduğu dizine girip (ssh kullanarak yada command line dan)

Kod:
sh iptables-default.sh
Centos için

Kod:
service iptables save
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

2 -) Şüpheli ipleri iptables, cron ve netstat kullanarak banla

http://www.inetbase.com/scripts/ddos/install.sh adresinden yükleme programını indirin ver ardından scripti çalıştırın
Örnek

Kod:
wget http://www.inetbase.com/scripts/ddos/install.sh
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 eklemeyi sizin le 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ın altını tamamen silin ve aşağıdaki kodu yapıştırın

Kod:
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ğimi 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..

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 degiskenlerimiz server { ile başlayan ve nginx te host tanımlamak için kullandığımız bölümü bulmanı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 http://xxxxxxxxx;
...
...
....
##statik dosyalar için tanımlı limiti uygula
limit_req zone=ddosstatic burst=10;
....
}

location ~ \.php$ {
proxy_pass http://xxxxxxxx;
...
...
....
##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..
Bir çok kişinin ücretli olarak yaptığı bir işlemi sizler için anlatmaya çalıştım. Bir çoğu alıntıdır ve tamamı test edilmiştir, kullanırken kendi sorumluluğunuzla kullanın. Umarım fayadalı olablirim...

Saygılar
Alıntı : r10 / nick : bm_ys

Hiç yorum yok:

Yorum Gönder