Cách kiểm tra VPS bị ddos và cách khắc phục

Đăng bởi Biên Nguyễn
Thứ Bảy,
{ date_from_database($post->created_at, 'M/d/ Y') }}

Câu lện trên sẽ trả về hàng loạt IP chiếm nhiều connection nhất trên server. Cần lưu ý rằng DDOS có thể xuất phát từ một lượng nhỏ connection. Do đó việc kết quả trả về connection thấp bạn vẫn có thể trong tình trạng under attack.

 

netstat -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

Một phương pháp khác:
 

netstat -n | grep :80 |wc -l netstat -n | grep :80 | grep SYN |wc -l


Dòng lệnh thứ nhất trả về số lượng active connection (connection đang hoạt động). Rất nhiều kiểu tấn công DDOS bằng cách mở một kết nối connection lên server rồi không làm gì cả khiến cho server chờ đợi cho đến khi timeout. Nến nếu dòng lệnh thứ nhất trả về trên 500 thì server của bạn rất nhiều khả năng bị DDOS.

Dòng lệnh thứ 2 trả về kết quả trên 100 thì rất nhiều khả năng server bạn trong tình trang syn attack DDOS.

Lưu ý: cách tính trên chỉ là tương đối, một số website có lưu lượng truy cập lớn thì phương pháp detect này có thể không chính xác.

Một số phương pháp khắc phục:

Cách khắc phục nhanh nhất là block các IP chiếm nhiều connection nhất trong "giờ cao điểm":

Cách 1:
 

route add địa-chỉ-ip reject


vd: route add 192.168.0.168 reject

Kiểm tra bằng lệnh: 

route -n |grep địa-chỉ-ip


Cách 2: sử dụng iptables
 

iptables -A INPUT 1 -s địa-chỉ-ip -j DROP/REJECT service iptables restart service iptables save


Sau đó xóa hết tất cả connection hiện hành và khơi động lại service httpd
 

killall -KILL httpd service httpd restart


Một số lệnh cơ bản khác

– Đếm lượng connection vào Port 80: 

netstat -n | grep :80 |wc -l


– Kiểm tra số lượng connection đang ở trạng thái SYN_RECV:

 

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:

 

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:

 

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:

 

netstat -plan | grep :80 | awk '{print $4}'| cut -d: -f1 |sort |uniq -c


– 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:

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

 

netstat -an | grep :80 | awk '{print $6}' | sort | uniq -c


Nó sẽ hiển thị như sau
 

61 ESTABLISHED 13 FIN_WAIT1 17 FIN_WAIT2 1 LISTEN 25 SYN_RECV 298 TIME_WAIT


– 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

 

watch "netstat -an | grep ':80' | awk '{print \$5}' | sed s/'::ffff:'// | cut -d\":\" -f1 | sort | uniq -c"
watch "netstat -an | grep :80 | awk '{print \$6}' | sort | uniq -c"


Khi đã phát hiện IP có dấu hiệu bất thường, bạn có thể sử dụng CSF để block IP đó lại.


Tiếp đến, chúng ta cần tham khảo về phân tích Log của VPS

Chú ý: Demo được thực hiện trên CentMinMod những VPS khác thì thay được dẫn File log nhé

Tham khảo thêm: Các dòng lệnh bỏ túi trong Linux

Lệnh tail để liệt kê các dòng cuối cùng trong file, ở đây ví dụ là 10 bạn có thể thay đổi thành 100, 1000… tùy theo muốn xem nhiều hay ít.

I. Đơn giản

Check log chung của Server

tail -10 /usr/local/nginx/logs/access.log
tail -10 /usr/local/nginx/logs/error.log


Nếu sử dụng Webserver như VestaCP thì thêm vào 

tail -10 /usr/local/vestacp/nginx/logs/access.log
tail -10 /usr/local/vestacp/nginx/logs/error.log


Check log từng Domain:

tail -10 /home/nginx/domains/domainname.com/log/access.log
tail -10 /home/nginx/domains/domainname.com/log/error.log


Kiểm tra trong /var/log

ls -lhrt /var/log


Check PHP-FPM

tail -10 /var/log/php-fpm/www-error.log /var/log/php-fpm/www-php.error.log


Kiểm tra log trong cơ sơ dữ liệu MySQL / MariaDB

tail -10 /var/log/mysqld.log


Kiểm tra log trong CSF firewall

tail -10 /var/log/lfd.log


Kiểm tra log trong Mail

tail -10 /var/log/maillog


For Cron job

tail -10 /var/log/cron


II. Nâng cao

Lấy tất cả các log trong 1 ngày

Ví dụ mình lấy các log trong ngày 5/12/2015

grep -w '05/Dec/2015' /home/nginx/domains/domain.com/log/access.log


Lấy log trong nhiều ngày bất kỳ

Lấy tất cả các log trong ngày 5/12/2015 và ngày 4/12/2015

grep -w '05/Dec/2015\|04/Dec/2015' /home/nginx/domains/domain.com/log/access.log


Lấy tất cả IP trong file log

grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' /home/nginx/domains/domain.com/log/access.log


Lấy log trong ngày được và chuyển hướng google

Chỉ lấy các dòng có chuổi là “05/Dec/2015” VÀ “google” (Được hiểu là Log của ngày 5/12/2015 và được chuyển hướng từ google)

grep -w '05/Dec/2015.*google' /home/nginx/domains/domain.com/log/access.log


Xuất ra log trong ngày và điều kiện “hoặc”

Chỉ lấy các dòng có chuổi là “05/Dec/2015” và “google” HOẶC có chuổi là “04/Dec/2015” và “google”

grep -w '05/Dec/2015.*google\|04/Dec/2015.*google' /home/nginx/domains/domain.com/log/access.log


Xuất ra tất cả IP với điều kiện

Xuất tất cả các IP được chuyển hướng từ Google được ghi nhận từ ngày 4 và 5/12/2015

grep -w '05/Dec/2015.*google\|04/Dec/2015.*google' /home/nginx/domains/domain.com/log/access.log | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'


Xuất số kết nối của IP đến server trong ngày

Đếm xem số lần kết nối của một IP được chuyển hướng từ Google trong ngày 5/12/2015

grep -w '05/Dec/2015.*google' /home/nginx/domains/domain.com/log/access.log | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | soft | uniq -cd | sort -nr


Xuất ra tất cả các IP có >10 kết nối trong ngày

Kiểm tra tất cả các IP có > 10 kết nối trong ngày 5/12/2015

grep -w '05/Dec/2015' /home/nginx/domains/domain.com/log/access.log | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort | uniq -cd | sort -nr | grep -v '^ *[1-9] '


Xem toàn bộ chuyển hướng từ google trong 1 tháng

Xuất ra màn hình toàn bộ log được chuyển hướng từ google tháng 12/2015 nhưng không chứa bot.html

grep -w 'Dec/2015.*google.com' /home/nginx/domains/domain.com/log/access.log | grep -v 'bot.html'


Xem link có nhiều lượt truy cập nhất trong tháng

Link có nhiều lượt truy cập nhất từ google trong tháng 12/2015, không tính bot

grep -w 'Dec/2015.*google.com' /home/nginx/domains/domain.com/log/access.log | grep -v 'bot.html' | grep -o