Тайлбар: Энэ нийтлэл дэх холбоосууд нь Амазон руу холбогдох холбоосуудыг агуулдаг. Эдгээр холбоосууд дээр дарснаар та ямар нэгэн нэмэлт төлбөр авахгүй, гэхдээ та эдгээр холбоосуудын аль нэгээр дамжуулан ямар нэгэн зүйл худалдаж авахаар шийдсэн бол намайг дэмжих болно. Баярлалаа!
Таны бүртгэлүүд /.DS_Store
, /backup.sql
, /.vscode/sftp.json
болон бусад олон тооны URL-ууд дээр 404 хандалтаар дүүрэн байна. Эдгээр хүсэлтүүд нь ихэвчлэн хор хөнөөлгүй боловч таны сервер эдгээр байршилд санал болгох зүйл байхгүй бол та роботуудыг тайвшруулах хэрэгтэй.
Яагаад?
Серверийг дарах нь маш их нөөц шаарддаг ажил бөгөөд эдгээр роботууд өөр өөр URL-уудын өргөн жагсаалттай байдаг тул танд туслах кэш хийх механизм байхгүй. Үүнээс гадна роботуудыг зогсоох нь үргэлж аюулгүй байдлын арга хэмжээ юм.
Бид өмнө нь HAProxy-г Wordpress-ийн нэвтрэх хуудасны халдлагыг багасгахын тулд ашиглаж байсан бөгөөд энэ аргыг 404 алдааг хамрахаар өргөжүүлэх санаа юм.
Ботууд таны серверийг сүйрүүлэхийн тулд чадах бүхнээ хийх болно
Би Саса Тековичээс санаа авсан, тухайлбал жинхэнэ хайлтын системийн мөлхөгчдийг хаахгүй байх, 404-ийг статик нөөц дээр ашиглахыг зөвшөөрөх нь бодит дутуу нөөцийг урьдчилан сэргийлэх - таны алдаа - хууль ёсны хэрэглэгчдийг хаахгүй байх.
Хэрэгжүүлэхийн өмнө орон нутгийн туршилтын орчинг бий болгох нь үргэлж сайн байдаг. Docker
ашиглан HAProxy
болон Apache
эхлүүлцгээе. Бидэнд эдгээр 404
өгөх жинхэнэ арын сервер хэрэгтэй байна.
version : '3' services: haproxy: image: haproxy:3.1.3-alpine ports: - "8100:80" volumes: - "./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg" networks: - webnet apache: image: httpd:latest container_name: apache1 ports: - "8080:80" volumes: - ./html:/usr/local/apache2/htdocs/ networks: - webnet networks: webnet:
Дараа нь зүгээр л docker-compose up
програмыг ажиллуулснаар та хөтөч дээрээ localhost:8100
хандах боломжтой.
haproxy.cfg
файл нь маш ойлгомжтой юм:
global log stdout format raw daemon debug defaults log global mode http frontend main bind *:80 acl static_file path_end .css .js .jpg .jpeg .gif .ico .png .bmp .webp .csv .ttf .woff .svg .svgz acl excluded_user_agent hdr_reg(user-agent) -i (yahoo|yandex|kagi|(google|bing)bot) # tracks IPs but exclude hits on static files and search engine crawlers http-request track-sc0 src table mock_404_tracking if !static_file !excluded_user_agent # increment gpc0 if response code was 404 http-response sc-inc-gpc0(0) if { status 404 } # checks if the 404 error rate limit was exceeded http-request deny deny_status 403 content-type text/html lf-string "404 abuse" if { sc0_gpc0_rate(mock_404_tracking) ge 5 } # whatever backend you're using use_backend apache_servers backend apache_servers server apache1 apache1:80 maxconn 32 # mock backend to hold a stick table backend mock_404_tracking stick-table type ip size 100k expire 10m store gpc0,gpc0_rate(1m)
Хэрэв та нэг минутын дотор 404 хүсэлтэд 5-аас дээш хандалт авсан бол ботыг 10 минутын турш хориглоно.
Бодвол энэ тохиргоо нь хэт их 404-ийг үүсгэх роботуудын хурдыг үр дүнтэйгээр хязгаарладаг. Гэсэн хэдий ч бид үүнийг өмнөх жишээнтэйгээ нэгтгэхийг хүсч байна, бид HAProxy
ашиглан WordPress
дээр халдлагыг блоклосон.
global log stdout format raw daemon debug defaults log global mode http frontend main bind *:80 # We may, or may not, be running this with Cloudflare acting as a CDN. # If Cloudflare is in front of our servers, user/bot IP will be in # 'CF-Connecting-IP', otherwise user IP with be in 'src'. So we make # sure to set a variable 'txn.actual_ip' that has the IP, no matter what http-request set-var(txn.actual_ip) hdr_ip(CF-Connecting-IP) if { hdr(CF-Connecting-IP) -m found } http-request set-var(txn.actual_ip) src if !{ hdr(CF-Connecting-IP) -m found } # gets the actual IP on logs log-format "%ci\ %hr\ %ft\ %b/%s\ %Tw/%Tc/%Tt\ %B\ %ts\ %r\ %ST\ %Tr IP:%{+Q}[var(txn.actual_ip)]" # common static files where we may get 404 errors and also common search engine # crawlers that we don't want blocked acl static_file path_end .css .js .jpg .jpeg .gif .ico .png .bmp .webp .csv .ttf .woff .svg .svgz acl excluded_user_agent hdr_reg(user-agent) -i (yahoo|yandex|kagi|google|bing) # paths where we will rate limit users to prevent Wordpress abuse acl is_wp_login path_end -i /wp-login.php /xmlrpc.php /xmrlpc.php acl is_post method POST # 404 abuse blocker # track IPs but exclude hits on static files and search engine crawlers # increment gpc0 counter if response status was 404 and deny if rate exceeded http-request track-sc0 var(txn.actual_ip) table mock_404_track if !static_file !excluded_user_agent http-response sc-inc-gpc0(0) if { status 404 } http-request deny deny_status 403 content-type text/html lf-string "404 abuse" if { sc0_gpc0_rate(mock_404_track) ge 5 } # wordpress abuse blocker # track IPs if the request hits one of the monitored paths with a POST request # increment gpc1 counter if path was hit and deny if rate exceeded http-request track-sc1 var(txn.actual_ip) table mock_wplogin_track if is_wp_login is_post http-request sc-inc-gpc1(1) if is_wp_login is_post http-request deny deny_status 403 content-type text/html lf-string "login abuse" if { sc1_gpc1_rate(mock_wplogin_track) ge 5 } # your backend, here using apache for demonstration purposes use_backend apache_servers backend apache_servers server apache1 apache1:80 maxconn 32 # mock backends for storing sticky tables backend mock_404_track stick-table type ip size 100k expire 10m store gpc0,gpc0_rate(1m) backend mock_wplogin_track stick-table type ip size 100k expire 10m store gpc1,gpc1_rate(1m)
Хоёр stick tables
гүйж, хоёр аюулыг зогсооно.
Тэгээд чамд байгаа. HAProxy дахин нэг удаа энгийн урвуу прокси гэхээсээ илүү ихийг ашигласан. Энэ бол бяцхан Швейцарийн хутга!
Энэхүү гар чийдэн нь засварын ажилд маш чухал үүрэг гүйцэтгэдэг.
Надад нэг байсан, гэхдээ тэр нь эвдэрсэн үед солихоос эргэлзэж, утасны гар чийдэн рүү хандав. Мэдээжийн хэрэг, энэ нь ажиллана, гэхдээ та хоёр гараа дахин суллахын тав тухыг мэдэрвэл буцах зам байхгүй. Хэрэв танд найдвартай, гаргүй гэрэлтүүлэг хэрэгтэй бол энэ нь заавал байх ёстой зүйл юм!
Энэ нийтлэлийг https://wasteofserver.com/stop-404-prying-bots-with-haproxy/ дээр анх нийтэлсэн бөгөөд та эндээс шинэ хувилбарууд болон нэмэлт тайлбаруудыг олж болно.