Khi sử dụng Nginx, bạn có thể dễ dàng block request GET / POST bất kỳ dựa theo User Agent.

gun

Mình tìm hiểu phương pháp này khi website thường xuyên bị spam mail với nhiều IP khác nhau, tuy nhiên điểm chung là header của chúng giống hệt nhau. Nginx block rất hiệu quả.

Ngoài ra, bạn có thể ứng dụng để block Bot, Spider, chống crawl…

Hướng dẫn block User Agent với Nginx

Mở file cấu hình tên miền (nếu dùng HocVPS Script file cấu hình ở đường dẫn /etc/nginx/conf.d/), trong section server, hãy thêm đoạn code if sau:

server {
    listen       80 default_server;

    root         /home/hocvps.com/public_html;
    index index.php index.html index.htm;
    server_name hocvps.com;

    # case sensitive matching
    if ($http_user_agent ~ (Antivirx|Arian)) {
        return 403;
    }

    # case insensitive matching
    if ($http_user_agent ~* (netcrawl|npbot|malicious)) {
        return 403;
    }

    ....
}

Sau đó nhớ restart lại Nginx.

Tùy bạn lựa chọn:

  • case sensitive matching: phân biệt chữ in hoa, chữ in thường
  • case insensitive matching: không phân biệt in hoa, in thường

Để tìm được header cần filter, tất nhiên bạn sẽ phải phân tích file access.log trước.

Để test kết quả bạn có thể dùng lệnh wget kèm theo option --user-agent, ví dụ:

wget --spider --user-agent "malicious bot" http://domain.com

Đây là đoạn code mình dùng để block request spam comment các bạn có  thể tham khảo thêm:

    #Block Spam comment
    location ~* /wp-comments-post\.php$ {
        if ($http_user_agent ~* "x11; linux i686; rv:17" ) {
            return 403;
        }
    }

Chúc bạn thành công.

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.

24 Comments

  1. my pham lily white 1 comment

    Hi anh Luân,

    Anh có bao giờ thử block bot của Ahref trên nginx chưa anh, em đã thử nhiều cách từ robot.txt và head trong code php nhưng vẫn k triệt để.

    Em cảm ơn anh ạ!

  2. long 16 comment

    mình có nhiều site, làm cách nào để chặn 1 phát được tất cả thay vì phải vào từng file domain không

    1. Việt Phương Moderator

      Vì cái này chặn khi khách truy cập theo server_name và port tương ứng nên không bạn à

    1. Việt Phương Moderator

      HocVPS Script khi cài đặt có disable iframe rồi. Đó là dòng này trong file Nginx conf. Bạn có thể thêm vào nếu dùng hệ thống khác

      	#Disable IFRAME
      	add_header X-Frame-Options SAMEORIGIN;
    1. Luân Trần Admin

      Bạn cần kiểm tra lại toàn bộ plugin nữa, plugin lậu rất dễ dính chưởng. Ngoài ra, có thể website của bạn đã bị dính mã độc từ trước, nó up lên các thư mục con, không remove hết nên vẫn còn lỗi.

      1. Hùng Phạm Ngọc 13 comment

        cacs plugin theo theme và cài trực tiếp trên wp.org ạ. Với lại em xóa hết đi làm lại rồi mà vẫn bị ạ

        1. Luân Trần Admin

          Vậy trên site khả năng dính malware ở đâu đó rồi, kiểm tra ở các thư mục khác nhau nhé, có thể trong wp-admin, wp-includes, uploads…. nữa đó

          1. Hùng Phạm Ngọc 13 comment

            em muốn disable hàm gửi mail đi ạ, thì làm thế nào ạ

          2. Luân Trần Admin

            Bạn chỉnh sửa file cấu hình PHP: /etc/php.ini
            Có disable_functions đó nhé.

  3. Thư giãn một tí 13 comment

    Mình xài server cài nginx bằng centminmod, chặn IP của BaiduSpider bằng lệnh csf -d xxx.xxx.xxx.xxx, rồi chặn user agent trong file: /usr/local/nginx/conf/block.conf như sau:

    # Baiduspider
    if ($http_user_agent ~* “Baiduspider”) {
    set $block_user_agents 1;
    }

    if ($block_user_agents = 1) {
    return 403;
    }

    hoặc:

    map $http_user_agent $limit_bots {
    default 0;
    ~*(google|bing|yandex|msnbot) 1;
    ~*(AltaVista|Googlebot|Slurp|BlackWidow|Bot|ChinaClaw|Custo|DISCo|Download|Demon|eCatch|EirGrabber|EmailSiphon|EmailWolf|SuperHTTP|Surfbot|WebWhacker) 1;
    ~*(Express|WebPictures|ExtractorPro|EyeNetIE|FlashGet|GetRight|GetWeb!|Go!Zilla|Go-Ahead-Got-It|GrabNet|Grafula|HMView|Go!Zilla|Go-Ahead-Got-It) 1;
    ~*(rafula|HMView|HTTrack|Stripper|Sucker|Indy|InterGET|Ninja|JetCar|Spider|larbin|LeechFTP|Downloader|tool|Navroad|NearSite|NetAnts|tAkeOut|WWWOFFLE) 1;
    ~*(GrabNet|NetSpider|Vampire|NetZIP|Octopus|Offline|PageGrabber|Foto|pavuk|pcBrowser|RealDownload|ReGet|SiteSnagger|SmartDownload|SuperBot|WebSpider) 1;
    ~*(Teleport|VoidEYE|Collector|WebAuto|WebCopier|WebFetch|WebGo|WebLeacher|WebReaper|WebSauger|eXtractor|Quester|WebStripper|WebZIP|Wget|Widow|Zeus) 1;
    ~*(Twengabot|htmlparser|libwww|Python|perl|urllib|scan|Curl|email|PycURL|Pyth|PyQ|WebCollector|WebCopy|webcraw) 1;
    }

    if ($limit_bots = 1) {
    return 403;
    }

    hoặc:

    if ($http_user_agent ~* (httrack|htmlparser|libwww|JikeSpider|proximic|Sosospider|AhrefsBot|MJ12bot|Baiduspider|msnbot|BBBike|WWWOFFLE|Widow|SuperHTTP|BlackWidow|HTTrack|Java|Pixray|CPython|Spinn3r|Abonti|MSIECrawler|Baiduspider|Siteimprove|Aboundex|80legs|360Spider|^Java|Cogentbot|^Alexibot|^asterias|^attach|^BackDoorBot|^BackWeb|Bandit|^BatchFTP|^Bigfoot|^Black.Hole|^BlackWidow|^BlowFish|^BotALot|Buddy|^BuiltBotTough|^Bullseye|^BunnySlippers|^Cegbfeieh|^CheeseBot|^CherryPicker|^ChinaClaw|Collector|Copier|^CopyRightCheck|^cosmos|^Crescent|^Custo|^AIBOT|Mozilla/4.0|ZmEu|MJ12bot|MegaIndex|OpenLinkProfiler|spbot)) {
    return 403;
    }

    restart lại nginx , restart csf rồi mà con bot baidu nó cứ vào ầm ầm, bác luân có thể xem giúp mình trường hợp này được không?

    1. Luân Trần Admin

      Bạn hãy thử test với lệnh bên dưới xem output trả về đã bị block 403 chưa?

      wget --user-agent "header here" https://hocvps.com

      1. Thư giãn một tí 13 comment

        Mình có nhiều site , sửa rất nhiều, đọc trên mạng thì thấy nhiều tài liệu nói về chặn IP & user agent, mình muốn chặn trực tiếp trong nginx để khỏi phải mất công vào từng site sửa, cái lệnh wget ở trên mình chạy ok, trả về 200.

        1. Luân Trần Admin

          200 tức là bộ lọc chưa hoạt động rồi, bạn kiểm tra lại cấu hình. Nó phải trả về 403 mới chuẩn. Mà nhớ thay header here đấy nhé 😛

    1. Luân Trần Admin

      Bạn mở file /etc/nginx/nginx.conf xóa dòng add_header X-Frame-Options SAMEORIGIN;, khởi động lại nginx là ok nhé.

  4. Việt Đan 2 comment

    Có cách nào block UA với Apache mà không dùng .htaccess không vậy bác Luân.
    Dùng Iptables hay CSF cũng được
    Em cứ bị 1 kiểu UA gởi cả ngàn request vào, xong ngay sau đó nó đổi UA khác và lại tiếp tục ~~

    1. Luân Trần Admin

      Bạn dùng CSF giới hạn số lượng connection/request với mỗi IP được ko?

      1. Việt Đan 2 comment

        Cái này em không rõ lắm nên xin nhờ bác chỉ giáo thêm.
        Em thử nhưng ko hiệu quả lắm
        iptables -A FORWARD -m state –state NEW -m recent –rcheck –seconds 1 –hitcount 5 –name ATACK –rsource -j REJECT –reject-with icmp-port-unreachable
        iptables -A FORWARD -d 127.0.0.1 -o eth1 -p tcp -m tcp –dport 80 -m recent –set –name ATACK –rsource -j ACCEPT