Banjir pengikis pada pelan Percuma Cloudflare: apa yang menghentikannya, dan apa yang kami biarkan dimatikan
Operasi
Pada suatu pagi, sebuah laman senarai produk kami berhenti dibuka. Cloudflare memaparkan ralat 524 kepada pengunjung, pelayan asal mengambil masa dua hingga enam minit setiap halaman, dan tiada apa yang memaklumkan kami selama kira-kira sepuluh jam. Punca masalah ialah pengikis yang menggunakan proksi kediaman pada kadar kira-kira 225 permintaan sesaat.
Bentuk banjir tersebut
- Beribu-ribu alamat, satu hingga tiga permintaan setiap satu. Sambungan jalur lebar rumah di AS, Sepanyol, Perancis, Brazil, UK dan tempat lain, iaitu jenis trafik yang disewakan oleh rangkaian proksi kediaman.
- Ejen pengguna Chrome pada Mac, dengan nombor versi daripada 103 hingga 151.
- Hampir tiada kuki atau Referer. Daripada 2,697 permintaan yang kami sampelkan di pelayan, 4 membawa kuki dan 4 membawa Referer.
- Dua jenis klien. Kira-kira separuh tidak menghantar pengepala
Sec-Fetch-*dan tiada petunjuk klien: skrip dengan rentetan ejen pengguna yang disalin. Separuh lagi menghantar pengepala pelayar penuh: pelayar tanpa kepala.
Setiap halaman dipaparkan untuk setiap permintaan, jadi setiap pekerja memasukkan beratus-ratus paparan ke dalam barisan dan mencapai had CPU-nya.
Mengapa had setiap alamat tidak dapat membantu
Had kadar mengira permintaan setiap alamat. Dengan satu hingga tiga permintaan daripada setiap beribu-ribu alamat, tiada satu pun alamat yang menghampiri had. Menyekat negara akan menyekat pengunjung kami. Apa yang pengikis tidak mampu palsukan dengan murah ialah berkelakuan seperti pelayar yang pernah melawat laman tersebut.
Di tepi Cloudflare: tiga peraturan percuma
Pelan Percuma membenarkan lima peraturan tersuai WAF setiap zon. Kami menggunakan tiga, kesemuanya dengan cabaran terkawal dan bukan sekatan, supaya orang yang tersilap tangkap boleh klik untuk melepasi:
- Pelayar palsu: permintaan GET yang ejen penggunanya mengandungi
Chrome/dan tiada pengepalaSec-Fetch-Mode. Setiap Chrome sejak 2019 menghantarnya. - Awan pengikis: permintaan halaman daripada rangkaian Alibaba, Tencent dan Huawei Cloud, tempat kebanyakan yang kami cabarkan berasal.
- Kecemasan, dimatikan secara lalai: permintaan GET tanpa sebarang kuki dan tanpa Referer. Orang yang pernah melawat laman tersebut, atau yang tiba melalui pautan, akan melepasi tanpa gangguan; pengikis yang tidak menyimpan kuki akan berdepan cabaran pada setiap permintaan. Kami mengaktifkannya hanya semasa banjir, kerana ia juga mencabar seseorang yang menaip alamat ke dalam pelayar baharu.
Ketiga-tiganya membenarkan bot yang disahkan Cloudflare, agen pengguna yang memperkenalkan diri sebagai robot, alamat kami sendiri, laluan API dan webhook, serta fail yang bukan halaman. Dua hari kemudian, banjir itu masih berterusan: dalam satu jam, peraturan pelayar palsu mencabar lebih daripada 10,000 permintaan. 10,000 peristiwa yang dikembalikan Cloudflare setiap pertanyaan berasal daripada 9,627 alamat, tiada satu pun melebihi 4.
Di asal: satu pintu masuk dalam aplikasi
Separuh tanpa kepala mempunyai kepala pelayar penuh, jadi peraturan tepi sahaja tidak menangkapnya semasa peraturan kecemasan dimatikan. Dalam aplikasi itu sendiri, kami meletakkan perisian perantara kecil di hadapan perender halaman:
- agen pengguna Chrome tanpa
Sec-Fetch-Modemahupun petunjuk klien mendapat 403 sebelum sebarang kerja dilakukan; - orang asing, tanpa sebarang kuki kami dan tanpa Referer, hanya dilayan apabila pekerja mempunyai kapasiti lebih, pada beberapa halaman sesaat. Lebih daripada itu, halaman 503 bersaiz 400 bait menetapkan kuki dan memuat semula selepas dua saat. Orang sebenar mendapat halaman pada percubaan kedua; pengikis yang tidak menyimpan kuki tidak pernah mendapatnya.
Pada minit pertama, pintu masuk itu menolak kira-kira 6,700 pelayar palsu dan menghalau kira-kira 6,700 orang asing, sambil melayan orang asing pada kira-kira 9 halaman sesaat. Permintaan perlahan jatuh kepada sifar, CPU pekerja turun daripada had mereka kepada 12 hingga 15 peratus, dan memori mereka daripada 4 hingga 5 GB setiap satu kepada 0.65 GB.
Apa yang kami biarkan dimatikan
- Bot Fight Mode. Ia mencabar trafik automatik dan tidak boleh dilangkau dengan peraturan tersuai pada pelan Percuma, dan ia menangkap webhook pembayar pembayar kami.
- Under Attack mode untuk seluruh zon. Ia meletakkan setiap pelawat, klien API dan webhook melalui halaman antara muka. Peraturan kecemasan melakukan kerja yang sama hanya untuk permintaan halaman orang asing.
- Peraturan had kadar pelan Percuma. Ia mengira setiap alamat, yang tidak pernah dicetuskan oleh banjir ini.
- Menyekat perayapan AI. Kami mahu ditemui oleh pembantu carian AI, dan perayap itu bukan masalahnya.
Pengajaran utama
Banjir melalui proksi perumahan mudah dikesan berdasarkan apa yang tiada: kepala fetch pelayar, kuki dan Referer. Cabar itu di tepi, kekalkan orang asing dalam had yang boleh dirender oleh pekerja anda, dan pastikan sesuatu di luar pelayar menyedari apabila halaman berhenti dibuka. Night Watch membungkus ketiga-tiganya: pemantau, peraturan dengan suis automatik untuk yang kecemasan, dan pintu masuk untuk aplikasi web Python.