Nota: Pautan dalam artikel ini termasuk pautan gabungan ke Amazon. Anda tidak akan dikenakan bayaran tambahan untuk mengklik pada pautan ini, tetapi anda akan menyokong saya jika anda memilih untuk membeli sesuatu melalui salah satu pautan ini. Terima kasih!
Log anda diisi dengan 404 hits pada /.DS_Store
, /backup.sql
, /.vscode/sftp.json
dan banyak lagi URL lain. Walaupun permintaan ini kebanyakannya tidak berbahaya, melainkan sudah tentu, pelayan anda sebenarnya mempunyai sesuatu untuk ditawarkan di lokasi tersebut, anda harus menenangkan bot.
kenapa?
Memukul pelayan ialah tugas intensif sumber dan, memandangkan bot tersebut mempunyai senarai luas URL yang berbeza, tiada mekanisme caching yang boleh membantu anda. Selain itu, menghentikan bot sentiasa merupakan langkah keselamatan.
Kami sebelum ini telah menggunakan HAProxy untuk mengurangkan serangan pada halaman log masuk Wordpress , ideanya adalah untuk melanjutkan pendekatan itu untuk turut meliputi 404 ralat.
Bot akan cuba sedaya upaya untuk membuat malapetaka dalam pelayan anda
Saya telah mengambil inspirasi daripada Sasa Tekovic , iaitu untuk tidak menyekat perangkak enjin carian sebenar dan membenarkan 404 pada sumber statik untuk menghalang sumber sebenar yang hilang - ralat di pihak anda - daripada tidak menyekat pengguna yang sah.
Sebelum melaksanakan, adalah baik untuk mengubah persekitaran ujian setempat. Mari mulakan HAProxy
dan Apache
menggunakan Docker
. Kami memerlukan pelayan bahagian belakang yang sebenar untuk memberikan kami 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:
Kemudian, jalankan docker-compose up
, dan anda boleh mengakses localhost:8100
dalam penyemak imbas anda.
Fail haproxy.cfg
cukup jelas:
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)
Jika anda mendapat lebih daripada 5 hits pada 404 permintaan dalam satu minit, bot akan disekat selama 10 minit.
Seperti sedia ada, persediaan ini mengehadkan kadar bot dengan berkesan menjana 404s yang berlebihan. Walau bagaimanapun, kami juga ingin menyepadukannya dengan contoh kami yang terdahulu, di mana kami menggunakan HAProxy
untuk menyekat serangan pada 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)
Berlari dengan dua stick tables
, dan menghentikan kedua-dua ancaman.
Dan di sana anda mempunyainya. HAProxy sekali lagi digunakan untuk lebih daripada sebagai proksi terbalik yang mudah. Ia adalah Pisau Swiss kecil!
Lampu depan ini telah menjadi penukar permainan semasa melakukan pembaikan.
Saya mempunyai satu, tetapi apabila ia rosak, teragak-agak untuk menggantikannya, menggunakan lampu suluh telefon. Dan pastinya, ia berfungsi - tetapi setelah anda mengalami kemudahan untuk mempunyai kedua-dua tangan bebas semula - tidak akan kembali. Jika anda memerlukan pencahayaan bebas tangan yang boleh dipercayai, ini mesti dimiliki!
Siaran ini pada asalnya disiarkan di https://wasteofserver.com/stop-404-prying-bots-with-haproxy/ , anda mungkin mendapati semakan yang lebih baharu dan ulasan tambahan di sana.