มีการเพิ่มการห้ามเคลือบเงา แต่วัตถุเก่าจะถูกส่งคืน

Jan 08 2021

ฉันใช้วานิชหน้าเซิร์ฟเวอร์ไทล์เพื่อแคชไทล์ mapbox ในการลบกระเบื้องเก่าฉันตั้งใจจะใช้เรย์แบนเพื่อลบกระเบื้องแคชจำนวนมากอย่างมีประสิทธิภาพ ปัญหาของฉันคือวานิชยังคงใช้อ็อบเจ็กต์ที่แคชไว้ (อย่างน้อยageในการตอบกลับระบุสิ่งนี้) และไม่ได้ติดต่อกับแบ็กเอนด์

ก่อนอื่นฉันขอ http: //varnish/5/3/4.pbf จากนั้นเพิ่มการแบนด้วยcurl -X BAN -H 'X-Purge-Regex: 5/3/4.pbf' varnishหรืออีกวิธีหนึ่งvarnishadmจากนั้นจึงban obj.http.url ~ 5/3/4.pbfขอ http: //varnish/5/3/4.pbf อีกครั้ง

ในตอนแรกรายการห้ามของฉันว่างเปล่า:

Present bans:
1610117471.434488     1 C

เพิ่มการห้ามสำเร็จด้วย curl -X BAN -H 'X-Purge-Regex: 5/3/4.pbf' varnish

<!DOCTYPE html>
<html>
  <head>
    <title>200 Ban added</title>
  </head>
  <body>
    <h1>Error 200 Ban added</h1>
    <p>Ban added</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 8</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>

และปรากฏในรายการห้าม

Present bans:
1610117369.028870     0 -  obj.http.url ~ 5/3/4.pbf
1610117307.220739     1 C  

หลังจากขอ http: //varnish/5/3/4.pbf อีกครั้งรายการแบนระบุว่ามีการใช้แบน

Present bans:
1610117471.434488     1 -  obj.http.url ~ 5/3/4.pbf

แต่อายุของการตอบกลับไม่ใช่ 0 เนื่องจากยังคงเป็นวัตถุจากคำขอแรก

หลังจากนั้นไม่นานการแบนจะถูกลบออก:

Present bans:
1610117471.434488     1 C  

ของฉันvcl_recvมีลักษณะเช่นนี้ แต่ข้อผิดพลาดอาจอยู่ที่อื่นเนื่องจากใช้ไม่ได้กับvarnishadm:

sub vcl_recv {
    unset req.http.cookie;

    # Allowing PURGE from localhost
    if (req.method == "BAN"||req.method == "PURGE") {
                if (!client.ip ~ purge) {
                        return(synth(405,"Not allowed."));
                }
                if (req.method == "BAN") {
                    ban("obj.http.url ~ " + req.http.X-Purge-Regex);

                    # Throw a synthetic page so the
                    # request won't go to the backend.
                    return(synth(200, "Ban added"));
                }
                if (req.method == "PURGE") {
                    return (purge);
                }
        }
}

ฉันยังพยายามที่จะใช้vcl_purgeจากhttps://stackoverflow.com/a/61507014 แต่ดูเหมือนจะไม่ช่วยอะไรสำหรับการแบน (?)

ฉันใช้X-Purge-Regexส่วนหัวเพื่อไม่ต้องกังวลว่าจะต้องหนีอักขระพิเศษเช่นในhttps://stackoverflow.com/a/38526921แต่แค่การห้ามชอบobj.http.url ~ 0ไม่ได้ผล

ฉันใช้วานิช 6.5 กับ vcl 4.0

คำขอแบน

*   << Request  >> 54        
-   Begin          req 53 rxreq
-   Timestamp      Start: 1610121483.345437 0.000000 0.000000
-   Timestamp      Req: 1610121483.345437 0.000000 0.000000
-   VCL_use        boot
-   ReqStart       192.168.48.2 50882 http
-   ReqMethod      BAN
-   ReqURL         /
-   ReqProtocol    HTTP/1.1
-   ReqHeader      Host: varnish-volatile
-   ReqHeader      User-Agent: curl/7.64.0
-   ReqHeader      Accept: */*
-   ReqHeader      X-Purge-Regex: 0
-   ReqHeader      X-Forwarded-For: 192.168.48.2
-   VCL_call       RECV
-   VCL_acl        MATCH purge "importer"
-   VCL_return     synth
-   VCL_call       HASH
-   VCL_return     lookup
-   RespProtocol   HTTP/1.1
-   RespStatus     200
-   RespReason     Ban added
-   RespHeader     Date: Fri, 08 Jan 2021 15:58:03 GMT
-   RespHeader     Server: Varnish
-   RespHeader     X-Varnish: 54
-   VCL_call       SYNTH
-   RespHeader     Content-Type: text/html; charset=utf-8
-   RespHeader     Retry-After: 5
-   VCL_return     deliver
-   Timestamp      Process: 1610121483.347281 0.001844 0.001844
-   RespHeader     Content-Length: 246
-   Storage        malloc Transient
-   Filters        
-   RespHeader     Accept-Ranges: bytes
-   RespHeader     Connection: keep-alive
-   Timestamp      Resp: 1610121483.347557 0.002120 0.000276
-   ReqAcct        98 0 98 218 246 464
-   End            

รับหลังจากเพิ่มการห้าม

*   << Request  >> 32806     
-   Begin          req 32805 rxreq
-   Timestamp      Start: 1610121552.733872 0.000000 0.000000
-   Timestamp      Req: 1610121552.733872 0.000000 0.000000
-   VCL_use        boot
-   ReqStart       192.168.48.1 55176 http
-   ReqMethod      GET
-   ReqURL         /public.snow_db/0/0/0.pbf
-   ReqProtocol    HTTP/1.1
-   ReqHeader      Host: localhost:8090
-   ReqHeader      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0
-   ReqHeader      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
-   ReqHeader      Accept-Language: en-US,en;q=0.5
-   ReqHeader      Accept-Encoding: gzip, deflate
-   ReqHeader      DNT: 1
-   ReqHeader      Connection: keep-alive
-   ReqHeader      Upgrade-Insecure-Requests: 1
-   ReqHeader      Pragma: no-cache
-   ReqHeader      Cache-Control: no-cache
-   ReqHeader      X-Forwarded-For: 192.168.48.1
-   VCL_call       RECV
-   ReqUnset       Host: localhost:8090
-   ReqHeader      host: localhost:8090
-   VCL_return     hash
-   ReqUnset       Accept-Encoding: gzip, deflate
-   ReqHeader      Accept-Encoding: gzip
-   VCL_call       HASH
-   VCL_return     lookup
-   Hit            28 601789.331504 10.000000 0.000000
-   VCL_call       HIT
-   VCL_return     deliver
-   RespProtocol   HTTP/1.1
-   RespStatus     200
-   RespReason     OK
-   RespHeader     content-encoding: gzip
-   RespHeader     content-type: application/x-protobuf
-   RespHeader     date: Fri, 08 Jan 2021 15:09:02 GMT
-   RespHeader     Vary: Accept-Encoding
-   RespHeader     X-Varnish: 32806 28
-   RespHeader     Age: 3010
-   RespHeader     Via: 1.1 varnish (Varnish/6.5)
-   VCL_call       DELIVER
-   VCL_return     deliver
-   Timestamp      Process: 1610121552.734070 0.000197 0.000197
-   Filters        
-   RespHeader     Accept-Ranges: bytes
-   RespHeader     Content-Length: 295
-   RespHeader     Connection: keep-alive
-   Timestamp      Resp: 1610121552.734217 0.000345 0.000147
-   ReqAcct        414 0 414 272 295 567
-   End  

ทำซ้ำปัญหา

ในการทำให้เกิดข้อผิดพลาด:

  • git clone https://github.com/Baschdl/varnish-ban-setup.git && cd varnish-ban-setup
  • docker-compose up
  • เปิด http: // localhost: 8092/5/3 / 1.pbf
  • docker-compose exec varnish varnishadm ban obj.http.url ~ pbf
  • เปิด http: // localhost: 8092/5/3 / 1.pbf อีกครั้งและคุณจะได้รับวัตถุเก่า

คำตอบ

2 ThijsFeryn Jan 09 2021 at 00:23

การobj.http.url ~ 5/3/4.pbfแบนที่คุณกำลังออกกำลังตรงกับurlส่วนหัวการตอบกลับ

ข้อควรจำ: URL เป็นส่วนหัวของคำขอไม่ใช่ส่วนหัวของการตอบกลับ ไม่มีเหตุผลที่จะต้องตื่นตระหนกสิ่งที่คุณกำลังทำนั้นสมเหตุสมผลและเกี่ยวข้องกับขอบเขตของสิ่งที่เรียกว่าการห้ามซุ่มซ่อน

บ้าน lurker

lurker ห้ามเป็นหัวข้อที่ถ่ายทอดสดกระบวนการเรย์แบนในรายการบ้านและตรงกับวัตถุที่ห้ามเพื่อที่จะเอารูปแบบของวัตถุจากแคช

การห้ามผู้แอบแฝงไม่ทำงานภายในขอบเขตคำขอ แต่รับทราบเฉพาะขอบเขตของวัตถุเท่านั้น

เพื่อให้จับคู่ข้อมูลคำขอได้สำเร็จสามารถเพิ่มบริบทคำขอเป็นส่วนหัวการตอบกลับได้ และนั่นคือสิ่งที่คุณทำผ่านobj.http.url

เหตุใดการห้ามจึงไม่ได้ผล?

สาเหตุที่การแบนของคุณไม่ทำงานเป็นเพราะคุณไม่ได้ตั้งค่าไว้obj.http.urlในไฟล์ VCL เป็นผลให้แบนนักซุ่มโจมตีไม่สามารถจับคู่วัตถุใด ๆ กับมันได้

วิธีแก้ไขปัญหา

วิธีแก้ปัญหานั้นง่ายมาก: ตั้งค่าส่วนหัวที่ขาดหายไปในบริบทการตอบกลับแบ็กเอนด์ดังภาพประกอบด้านล่าง:

sub vcl_backend_response {
    set beresp.http.url = bereq.url;
    set beresp.http.host = bereq.http.host;
}

เมื่อแบ็กเอนด์ตอบสนองและก่อนที่วัตถุจะถูกเก็บไว้ในแคชเราสามารถตั้งค่าส่วนหัวที่ขาดหายไปได้

หลังจากนั้น ban lurker จะสามารถจับคู่นิพจน์แบนกับอ็อบเจ็กต์ที่ถูกต้องและลบออกจากแคช

อย่าลืมว่าวัตถุไม่ได้จับคู่ทันที: จะถูกลบออกก็ต่อเมื่อถึงวัตถุban_lurker_ageเท่านั้นซึ่งจะตั้งไว้ที่ 1 นาทีตามค่าเริ่มต้น