Thông thường Varnish sử dụng chính để làm cache front end, tuy nhiên bạn hoàn toàn có thể cấu hình sử dụng để chống DDoS.

Varnish Cache

Hướng dẫn này viết từ trường hợp thực tế, mình đã chống DDoS thành công cho một người bạn. Nếu bạn cũng đang đau đầu về việc bị DDoS, hãy tham khảo bài viết này biết đâu có thể áp dụng được.

Ngay khi kết nối SSH, mình kiểm tra file access.log thì thấy ngay đúng là server đang bị DDoS.

DDoS access.log

Một loạt request có cách thức giống nhau, cùng một user-agent, IP khác nhau. Tính sơ sơ cũng phải đến cả trăm request mỗi giây, hỏi sao server không bị overload.

Nếu sử dụng CSF để block từng IP thì không ổn, vì quá nhiều IP. May thay các request này đều có một điểm chung là user-agent trong header giống nhau, như vậy có thể block lại được toàn bộ những request này dễ dàng.

Do CSF không hỗ trợ block theo header, nên mình phải sử dụng Varnish để filter riêng những request này ra và trả về Error 403. Với một đoạn code ngắn bên dưới để trong block sub vcl_recv { ... }, mình đã khống chế hoàn toàn được vụ DDoS.

sub vcl_recv {
        if (req.http.user-agent ~ "Hotbar") {
                return(synth(403,"Not allowed."));
        }

Ý nghĩa của đoạn code trên là filter những request có user-agent chứa Hotbar, nếu có thì trả lại lỗi 403, ngược lại thì pass cho Nginx webserver xử lý.

Varnish quả thật tuyệt vời 😀

Update: bạn có thể block request trực tiếp với Nginx.

Comment của bạn

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.

54 Comments

  1. sinhle 54 comment

    Chào admin.
    Mình mở file varnish với lệnh “nano /etc/varnish/default.vcl”.
    Trong đó điều có dấu # trước code.
    Mình nên thêm theo cách 1 ( trong link demo bên dưới ) hay cách 2 ạ.

    Link: https://pastebin.com/5GyZFA1q
    Cảm ơn admin.

  2. Nguyên Hao 22 comment

    Mọi người cho mình hỏi , mình dùng Varnish làm Reverse Proxy Server để ẩn danh server chính thì cái Reverse Proxy server này cần phải cấu hính mạnh để chạy ko hay chỉ cần server tầm tầm , còn chịu tải nằm ở phần Server chính vậy mọi người

  3. Trung 4 comment

    Chào anh, hiện tại mình đang sdụng vps dùng varnish + nginx + apache
    Mình muốn hỏi là có cách nào chống được số kết nối từ 1 ip đến (mình sự dụng Apache Benchmark để tạo kết nối đến website) thì web đơ cứng ngay
    Mình có cấu hình cfs, iptable, nginx…. cả rồi nhưng vẫn không thể đỡ nổi cái đó

    1. Việt Phương Moderator

      Nếu ip thay đổi ít thì bạn block theo IP còn không lần nổi IP thì bạn block theo header

        1. Việt Phương Moderator

          Bạn dùng iptables hay gì để block. Cấu hình block như thế nào.
          CSF có block ip mà.

          1. Trung 4 comment

            mình thử cả varnish và csf rồi nhưng tạo 1000kết nối + 1000truy vấn cùng 1 lúc trên 1 ip mà không thấy nó block

          2. Việt Phương Moderator

            Thế chắc bạn cấu hình có vấn đề. Bạn thử tự block chính mình xem có hoạt động không

  4. Jay Ngố 7 comment

    Ok mình upgrade luôn nhưng ko bật ssl 443 ở đoạn
    listen 443 ssl http2; Vẫn để 80 như bình thường là chưa kích hoạt phải ko ạ.

    1. Việt Phương Moderator

      Uhm, kiểu nó chỉ ở trong bản Nginx nhưng không dùng đến đó. Bạn chỉ cần build Nginx với nó còn không cần cấu hình trong Nginx Conf

  5. Jay Ngố 7 comment

    Ok vậy mình chưa có nhu cầu dùng ssl, như vậy có cần copy source sbin ko ạ? Hay Mình copy code cũ và thêm module geo thôi. Sorry mình hỏi cho chắc sợ bị lỗi thì khổ m…

    1. Việt Phương Moderator

      Bạn vẫn phải upgrade openssl thôi. Bạn chưa dùng nhưng module trong Nginx vẫn cần upgrade, trừ phi bạn loại hết module ssl

  6. Jay Ngố 7 comment

    Hơi ngoài lề nhưng mình đang tiếp tục cmt ở trên đấy bạn, mình đang thêm modules để block ip geo đấy bạn.

    1. Việt Phương Moderator

      À. Vì các module gốc của Nginx có module ssl/https (bạn Ctrl F đám module cũ là thấy). Nên khi rebuild bạn cân tích hợp thêm OpenSSL bản mới (nếu trc đó bạn tưng cài HTTP2 thì k cần)Nó như thế này : https://hocvps.com/http2-nginx/
      Tức là cùng 1 lần compile, bạn tích hợp cả geo và openssl

  7. Jay Ngố 7 comment

    /configure: error: SSL modules require the OpenSSL library.
    You can either do not enable the modules, or install the OpenSSL library
    into the system, or build the OpenSSL library statically from the source
    with nginx by using –with-openssl= option.

    Build dính lỗi này thì sao ạ? Mình không xài ssl, có bật cloudflare, thì có config gì thêm ko? Để biết mình make íntall hic hic bị spam quá rồi

  8. Jay Ngố 1 comment

    Xin bác VP hướng dẫn mình từ bước 1 được không? Là phải vào thư mục nào để chạy configure hay là dơnload nginx 1.12.1 về thư mục gốc rồi configure lại? Mình đang băn khoăn? Bài tren lỗi là do mình xài từ source down về thư mục root rồi chạy. Với cho mình hỏi là nếu chạy qua cloudflare thì có cần làm thêm bước gì để lấy IP nữa ko?

    Tình hình là đang bị dính spam mail nặng nên mình sẽ chặn tạm thời. Thanks

  9. Jay Ngố 7 comment

    https://pastebin.com/TuHRhTE9

    Nằm trong link này bạn ơi. Mình cài tùm lum luôn chả nhớ cài gì nữa, nhưng nginx vẫn reload bình thương ko lỗi. Ko biết có bài nào kích hoạt moudle này ko nữa hic hic

    Thanks bạn

    1. Việt Phương Moderator

      Nó thông báo đúng rồi. Bạn make rồi make install
      Tuy vậy, bạn cài thế là remove hết configure gốc của Nginx trong VPS. Bạn phải configure cùng với toàn bộ các configure gốc
      Bạn xem nginx -V để xem các config gốc

  10. Đào Công Thương 4 comment

    Có phần mềm nào phân biệt và chặn IP nước ngoài vào VPS không admin. Mình làm server game trên VPS ubuntu mà ngày nào cũng bị ddos hết .

    1. Đào Công Thương 4 comment

      Mình chỉ chạy server ở VN nên mình muốn chặn hết tất cả các IP nước ngoài pijng vào.

        1. Jay Ngố 7 comment

          Mình đang dùng Hocvps 1.8, làm như hướng dẫn trong bài nhưng bước chạy ./configure –with-http_geoip_module thì bị lỗi và không biết ntn là thành công cả. Mình đang muốn chặn tất cả các IP khác chỉ cho VN truy cập. VPS mình dang bị dính malware và spam mail liên tục. Mình đang muốn khắc phục trình trạng xấu trước sau, bạn nào có kinh nghiệm giúp mình với được ko?

  11. Trường 5 comment

    Admin cho hỏi mình có mua gói DDoS-Filtered IP Address của Ramnode. Sau khi mua xong thì sử dụng thế nào vậy?

    1. Luân Trần Admin

      Bạn truy cập thằng vào IP đã mua coi ok không, nếu ổn rồi thì trỏ domain về IP này, không dùng IP gốc.

  12. Sinh Viên Nghèo 5 comment

    104.224.145.75 – – [31/Mar/2017:11:53:44 +0700] “GET / HTTP/1.1” 403 467 “-” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36”
    158.69.209.181 – – [31/Mar/2017:11:53:44 +0700] “GET / HTTP/1.1” 403 524 “-” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36”

    của mình như này thì user-agent là cái nào thế bạn?

    1. Việt Phương Moderator

      Header này không có URL đặc biệt, không có agent gì có thể filter nên không tìm được đặc điểm chung theo cách này để block rồi

  13. sine68 1 comment

    cái ddos này là chống ddos proxy qua url domain…chống ddos với varnish là chống ddos trên domain url ..còn nếu ddos proxy thẵng vào ip server thì conect vẫn vào như thường vì port 80 lúc đó mở …có thể sử dụng iptables filter để chặn từ đầu lọc request và band ip không cho vào server…

  14. An 5 comment

    Em bị DDOS và chỉ có thông tin trong file log như sau:
    “GET / HTTP/1.0” 500 251 “-” “Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36”
    Có cách nào để chặn nó không bác?

    1. An 5 comment

      Em cài đặt VESTA ạ :D, có cài thêm cả csf nữa nhưng cứ chặn 1 IP thì nó lại dùng IP khác tấn công.

    2. Luân Trần Admin

      Header này không có URL đặc biệt, không có agent gì có thể filter. Khó rồi.

      1. An 5 comment

        Vâng, cũng may mỗi lần tấn công nó chỉ dùng 1 IP đơn lẻ, nên thấy là lại chặn, chỉ ức chế kiểu cứ lai rai mệt mỏi ạ 😀

        1. Luân Trần Admin

          Thường thì mình phân tích URI hoặc header để tìm ra đặc điểm chung, sau đó block lại.
          Với trường hợp không có thông tin gì chung thì hơi khó, bạn đăng ký thêm các dịch vụ theo dõi uptime như https://uptimerobot.com/ để theo dõi site, khi nào bị tấn công thì biết ngay

  15. quangnhut123 19 comment

    Hi bác LT qua kinh nghiệm làm việc của em thì kết hợp nginx block header dạng này bên trong trả về 444 và bên ngoài dùng CSF block theo connections/s và chỉnh lại thời gian lấy mẫu là ok.
    Thêm vào đó enable CDN là biện pháp chia nhỏ request tốt nhất vì sẽ được filter phần cứng của CDN provider nó làm bớt cho mình !

  16. noname 2 comment

    anh hướng dẫn chi tiết được không ạ, code đấy đặt ở file nào hả anh

    1. noname 2 comment

      Cái code sub vcl_recv {
      if (req.http.user-agent ~ “Hotbar”) {
      return(synth(403,”Not allowed.”));
      } này đặt ở đâu hả anh. em chưa rõ lắm

    1. Luân Trần Admin

      Bạn cần đảm bảo đang ở đúng thư mục và file access.log có tồn tại nhé.

      1. longdhb 1 comment

        kiếm nữa ngày mới ra là vì cài vestacp nên nó ko phài tên access.log, dùng lênh locate logs hay locate cái domain để kiếm

    1. Luân Trần Admin

      Mình đang để dạng comment trong file cấu hình domain.conf đó, nếu cần dùng thì bạn bỏ comment đi là ok.

  17. Hưng Nguyễn 1 comment

    Dùng Nginx là có thể block đc theo user-agent và trả về 403 rồi
    Mà tốt hơn thì nên trả về 444 🙂

  18. Pentester84 1 comment

    Nếu request sử dụng nhiều User agent thì không thể filter theo User agent được nữa. Do vậy cách này cũng chỉ là biện pháp tạm thời.

    1. Luân Trần Admin

      Trường hợp đó thì phải tìm cách xử lý khác, còn ví dụ trong bài này có thể đoán được user-agent giống nhau nên mới block được.

  19. Steve Diện 21 comment

    Bị yêu SSL nên site nào của mình cũng dùng SSL. Mà mình lại k biết cấu hình cái SSL Termination để Varnish chạy với SSL nên đành từ bỏ varnish nhưng tốc độ vẫn nhanh chán, một kinh nghiệm tăng tôca khi dùng SSL trên Nginx là dùng cái LibreSSL thay cho OpenSSl cho tốc độ nhanh hơn mà lại hỗ trợ các cipher mới nhất như chacha20_poly1305
    😀 https://www.crazytut.com