Saturday, 18 May 2013

Ddos cách thức phát hiện và xử lý


ddos attack3 copy Ddos cách thức phát hiện và xử lý
Đối với các website hoặc diễn đàn lớn, việc phòng chống và kiểm tra Ddos là một việc làm hết sức thường xuyên. Đặc biệt, các webmaster luôn luôn phải trong tình trạng xử lý khi mình dính phải trường hợp đó. Bạn có thể tìm hiểu thêm về Ddos tại Wikipedia.
Thông thường, việc phát hiện Ddos rất đơn giản khi bạn gặp tình trạng server load chậm một cách bất thường, mọi câu lệnh hoặc tác vụ đều không thể xử lý ngay thì 90% là do những nguyên nhân sau:
1/ Server bị Ddos
2/ Server quá tải do thiếu RAM
3/ Server quá tải do tốc độ xử lý của CPU không đảm bảo
4/ Tốc độ truy xuất dữ liệu của HDD không đáp ứng nhu cầu read/write của data.
Đối với trường hợp 2, 3, 4 thì các bạn có thể xử lý bằng việc can thiệp và nâng cấp phần cứng của server. Còn với vấn đề đầu tiên: Server bị Ddos thì sau đây là một số thủ thuật đơn giản và có hiệu quả mà bạn có thể áp dụng.
ddos Ddos cách thức phát hiện và xử lý
* Cách kiểm tra tình trạng Ddos của server:
Cách 1:
Sử dụng câu lệnh:
netstat -anp |grep ‘tcp|udp’ | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
Kết quả sau khi gõ câu lệnh trên, bạn sẽ thấy những IP được trả về chiếm nhiều kết nối nhất trên server được sắp xếp theo dạng từ ít đến nhiều. Tuy nhiên, cách trên chỉ là một cách cho hiệu quả 50 – 50 vì có thể Ddos vẫn xuất hiện dụng tình trạng kết nối là ít.
Cách 2:
Sử dụng một trong hai câu lệnh sau:
1/ netstat -n | grep :80 |wc -l
2/ netstat -n | grep :80 | grep SYN |wc -l
Ở câu lệnh 1/ sẽ đưa về cho bạn kết quả là những kết nối đang hoạt động. Theo kinh nghiệm, nếu số lượng kết nối trả về trên 500 thì khả năng server bạn đang phải hứng chịu một cuộc tấn công Ddos là rất cao.
Ở câu lệnh 2/ sẽ đưa về cho bạn kết quả trên 100 thì có khả năng server bạn đang trong tình trạng syn attack Ddos.
* Cách xử lý:
Cách 1:
Cách xử lý nhanh nhất và có hiệu quả tức thì là việc block những IP chiếm nhiều kết nối trên server của bạn nhất. Bạn có thể sử dụng câu lệnh sau :
route add địa-chỉ-ip reject
Kiểm tra bằng lệnh: route -n |grep địa-chỉ-ip
Cách 2:
Sử dụng hàm iptables như sau:
Bước 1: iptables -A INPUT 1 -s 25.158.20.55 -j DROP
Bước 2: service iptables save
Bước 3: service iptables restart
Sau đó xóa hết tất cả các kết nối hiện hành và khởi động lại httpd bằng câu lệnh sau:
killall -KILL httpd
service httpd restart
Chúc các bạn thành công!

Làm thế nào để xem Log DirectAdmin - Error Log

Để xem log trên direct admin, chúng ta có thể tham khảo các vị trí như trong nội dung. Ví dụ: Muốn xem tất cả domain trên cùng server, chúng ta có thể vào: dir /var/log/httpd/domains/ -ao, hoặc xem path của domain: cat /var/log/httpd/domains/domain.com.error.log ...

Informations:

The first place you should go when trying to debug a problem is the log file for that program.

The list of Log Files are as follows:

DirectAdmin:

# /var/log/directadmin/error.log
# /var/log/directadmin/errortaskq.log
# /var/log/directadmin/system.log
# /var/log/directadmin/security.log

Apache:

# /var/log/httpd/error_log
# /var/log/httpd/access_log
# /var/log/httpd/suexec_log
# /var/log/httpd/fpexec_log
# /var/log/httpd/domains/domain.com.error.log
# /var/log/httpd/domains/domain.com.log
# /var/log/messages (generic errors)

Proftpd:

# /var/log/proftpd/access.log
# /var/log/proftpd/auth.log
# /var/log/messages (generic errors)

vm-pop3d:

# /var/log/maillog
# /var/log/messages

named (bind):

# /var/log/messages

exim:

# /var/log/exim/mainlog
# /var/log/exim/paniclog
# /var/log/exim/processlog
# /var/log/exim/rejectlog
(on FreeBSD, they have “exim_” in front of the filenames)

mysqld:

RedHat:
# /var/lib/mysql/server.hostname.com.err

FreeBSD:
# /usr/local/mysql/data/server.hostname.com.err

crond:

# /var/log/cron

To view a log file, run:

# less /var/log/filename

Where /var/log/filename is the path of the log you wish to view. If the log is too large you can use the “tail” command:

# tail -n 30 /var/log/filename

Where 30 is the number of lines from the end you wish to view.

Kiểm tra server bị tấn công DDOS trong Linux








netstat -an | grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' | sort -n| uniq -c | sort -n

--> xem ip với nhiều request



netstat -ant | grep SYN
 
--> request với syn

csf -d xxxx.xxxx.xxxx.xxx

---block ip

- Kiểm tra số connection trên port 80:
Mã:
netstat -n | grep :80 |wc -l
- Kiểm tra số lượng connection đang ở trạng thái SYN_RECV:
Mã:
netstat -n | grep :80 | grep SYN_RECV|wc -l
- Hiển thị tất cả các IP đang kết nối và số lượng kết nối từ mỗi IP:
Mã:
netstat -an|grep :80 |awk '{print $5}'|cut -d":" -f1|sort|uniq -c|sort -rn
Nếu muốn kiểm tra IP nào mở nhiều SYN thì thêm vào:
Mã:
netstat -an|grep :80|grep SYN |awk '{print $5}'|cut -d":" -f1|sort|uniq -c|sort -rn
- Đối với server có nhiều IP, để kiểm tra IP nào đang bị tấn công:
Mã:
netstat -plan  | grep  :80 | awk '{print $4}'| cut -d: -f1 |sort |uniq -c
Bài viết trên sẽ có vài trường hợp ra kết quả không đúng nếu như sử dụng kernel mới , IP có dạng '::ffff:192.168.1.1:80' . Để tổng quát hơn các bạn nên dùng như sau cho mọi trường hợp :

- Hiển thị tất cả các IP đang kết nối và số lượng kết nối từ mỗi IP:
Mã:
[root@localhost~]# netstat -an | grep ':80' | awk '{print $5}' | sed s/'::ffff:'// | cut -d":" -f1 | sort | uniq -c
Đồng thời mình bổ xung thêm :
- Hiển thị số lượng kết nối mỗi loại (kiểm tra xem có phải bị SYN_FLOOD hay DDoS hay ko) :
Mã:
root@localhost [~]# netstat -an | grep :80 | awk '{print $6}' | sort | uniq -c
     61 ESTABLISHED
     13 FIN_WAIT1
     17 FIN_WAIT2
      1 LISTEN
     25 SYN_RECV
    298 TIME_WAIT

Trong trường hợp đang bị tấn công , cần phải quan sát các tham số trên một các real time => dùng lệnh 'watch' :

- Hiển thị tất cả các IP đang kết nối và số lượng kết nối từ mỗi IP:
Mã:
[root@localhost~]#watch  "netstat -an | grep ':80' | awk '{print \$5}' | sed s/'::ffff:'// | cut -d\":\" -f1 | sort | uniq -c"
- Hiển thị số lượng kết nối mỗi loại :
Mã:
root@localhost [~]# watch "netstat -an | grep :80 | awk '{print \$6}' | sort | uniq -c"

Tự động lock ip khi bị ddos attack

Cơ chế:
Khi 1 ip gửi 1 request tới site của bạn. code sẽ tạo ra 1 file log ghi lại ip đó, và url mà ip đó truy cập.

Ví dụ : 113.22.70.69 - http://mydomain.com/4rum/index.php
nếu ip 113.22.70.69 truy cập nhanh và liên tiếp 5 lần vào cùng 1 url như trên thì code sẽ lock ip 113.22.70.69 bằng cách tạo ra 1 file htaccess 
và ghi lệnh deny from 113.22.70.69 


Soạn thảo 1 file : banip.php

<?php$n = 5; // Chặn ip nếu 5 lần nhanh và liên tiếp truy cập vào 1 URL$ban = strpos($_SERVER***91;'REQUEST_URI'***93;, "vbshout.php")?0:1;$in = "\n".$_SERVER***91;'REMOTE_ADDR'***93;." - ".$_SERVER***91;'REQUEST_URI'***93;;$log = fopen('banip.log','a'); fwrite($log, $in); fclose($log);$list = file('banip.log',FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);$last = count($list) - 1;if($last >1000) { $in = "Deny from all"."\n";$lock = fopen('.htaccess','a'); fwrite($lock, $in); fclose($lock); }elseif($last > $n) { for($i = 1; $i < $n; $i++) if($list***91;$last - $i***93; != $list***91;$last***93[IMG] $ban = 0;} else { $ban = 0; }if($ban) { $in = "Deny from ".$_SERVER***91;'REMOTE_ADDR'***93;."\n";$lock = fopen('.htaccess','a'); fwrite($lock, $in); fclose($lock);}?> 


Edit :global.php ( Nếu là Forum) thêm vào
include 'banip.php'; 


Đoạn code này :
if($last >1000) { $in = "Deny from all"."\n";
........
Khi 1 ip truy cập vào site. code sẽ ghi ip đó vào 1 dòng
Sau đó sẽ đếm tổng số dòng trong file log. nếu lớn hơn 1000 dòng trong 1 thời gian nhất định (Dấu hiệu bị tấn công bonet) thì sẽ ghi vào file 
htaccess lệnh deny from all.Các bạn có thể lập lịch xoá file htaccess và file log theo 1 thời gian quy định bằng cron job trong cpanel của host 


reset.php
<?php
if(file_exists('.htaccess')) unlink('.htaccess');if(file_exists('banip.log')) unlink('banip.log');?>