Khi sử dụng Nginx, bạn có thể dễ dàng block request GET / POST bất kỳ dựa theo User Agent.
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.
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 ạ!
Mình không rõ vấn đề này rồi. Vừa search thì bạn thử cách này xem: https://www.knthost.com/nginx/blocking-bots-nginx
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
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 à
Chống ăn ifreame các file php kiểu gì vậy ad?
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
Cảm ơn ad nhìu nhé! mình mới học vps nên còn gà lắm
em mua vps của azdigi cài hocvps script rồi và cài 1 site wordpress theme mua bản quyền mà vẫn bị spam email như ảnh thì giải quyết như thế nào ạ
https://scontent-hkg3-1.xx.fbcdn.net/v/t35.0-12/14876035_869464823190839_1782041130_o.png?oh=4161ec3c2a893728cb1fa73aaf583d1c&oe=5816A658
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.
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ị ạ
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 đó
em muốn disable hàm gửi mail đi ạ, thì làm thế nào ạ
Bạn chỉnh sửa file cấu hình PHP: /etc/php.ini
Có disable_functions đó nhé.
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?
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
Mà sao bạn ko dùng robots.txt?
Link: http://www.baidu.com/search/robots_english.html
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.
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é 😛
Chào bác Luân.
Em có sử dụng HocVPS Script cho Vulrt VPS nhưng website của em cứ bị block content hiển thị trên iframe của bên thứ 3 trên Firefox trên Chrome hoặc Safari thì nó tự động remove cái iframe http://themeforest.net/item/valey-fashion-woocommerce-wordpress-theme/full_screen_preview/15245161
Bác check giúp em với e cảm ơn!
Bạn mở file
/etc/nginx/nginx.conf
xóa dòngadd_header X-Frame-Options SAMEORIGIN;
, khởi động lại nginx là ok nhé.Thank bác! Của em chạy rồi
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 ~~
Bạn dùng CSF giới hạn số lượng connection/request với mỗi IP được ko?
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