Menemukan pengunjung asli di balik tiga proxy

Kenapa Atlas Shield awalnya melihat semua pengunjung sebagai 10.0.4.8, kenapa entri X-Forwarded-For paling kiri tidak aman, dan cara memilih jumlah hop.

Pagi setelah Atlas Shield aktif di situs kami sendiri, log akses bilang hampir semua pengunjung datang dari 10.0.4.8. Di situs satunya lagi, 127.0.0.1. Shield memblok request yang tepat, tapi tidak tahu siapa pengirimnya. Batas request yang menghitung satu alamat untuk seluruh internet bukan batas, dan aturan alamat yang cuma bisa memblok load balancer sendiri bukan aturan. Begini cara kami memperbaikinya, dan cara Anda mengecek situs sendiri.

Kenapa server melihat alamat yang salah

Situs brand jarang bicara langsung dengan pengunjung. Di antara browser dan server Nuxt biasanya ada dua atau tiga lompatan, dan masing-masing membuka koneksi baru. Server hanya melihat lompatan terakhir. Di lifefuture.id rantainya Bunny CDN, lalu Traefik, lalu proxy OpenResty, lalu jaringan overlay Docker yang menyerahkan koneksi dari balancer internalnya di 10.0.4.8. Di atlascms.id rantainya Cloudflare, lalu LiteSpeed, lalu Passenger yang bicara ke Node lewat loopback, jadi alamat lawannya 127.0.0.1.

Setiap proxy mencatat asal request di header X-Forwarded-For, dengan menambahkan alamat yang menghubunginya. Saat sampai di aplikasi, header-nya kira-kira klien, edge, proxy.

Entri paling kiri adalah kebohongan yang tidak bisa dideteksi

Perbaikan yang menggoda adalah membaca alamat pertama di X-Forwarded-For. Jangan. Siapa pun bisa mengirim header itu sendiri, dan setiap proxy menyimpan apa yang diterimanya lalu hanya menambah di kanan. Bot yang mengirim X-Forwarded-For: 9.9.9.9 bisa melewati batas request dengan identitas baru di setiap request, dan bisa membuat alamat pengunjung sungguhan terblokir.

Aturan yang aman adalah menghitung dari kanan. Anda tahu berapa proxy yang Anda jalankan. Masing-masing menambah tepat satu entri, jadi entri sebanyak itu dari kanan ditulis oleh proxy pertama Anda, tentang siapa yang menghubunginya. Itulah pengunjungnya, dan apa pun yang dikirim pengunjung tidak bisa menggesernya.

Dua pengaturan, satu angka yang penting

Di layer Atlas ini hanya dua environment variable:

  • NUXT_ATLAS_TRUST_PROXY=true menyuruh situs membaca X-Forwarded-For. Bawaannya mati, karena situs yang langsung menghadap internet tidak boleh mempercayai header itu.
  • NUXT_ATLAS_TRUST_PROXY_HOPS adalah berapa entri dari kanan yang dilangkahi.

Jumlah hop tidak selalu sama dengan jumlah kotak di diagram. Di lifefuture.id proxy OpenResty sudah menentukan alamat asli dari rentang IP Bunny dan menaruhnya di ujung header, jadi satu hop sudah benar. Di atlascms.id LiteSpeed menambahkan edge Cloudflare yang menghubunginya, jadi pengunjung ada di posisi kedua dari kanan. Percobaan pertama kami di sana pakai satu hop, dan log menunjukkan 172.70.208.101: edge Cloudflare, bukan pengunjung. Dengan dua hop hasilnya benar.

Cara mengecek situs Anda

Jangan percaya diagram, percayai tes. Kirim request yang pasti ditolak Shield, dengan header forwarding palsu, dari mesin yang alamatnya Anda tahu:

curl -H 'X-Forwarded-For: 9.9.9.9' https://situs-anda.example/wp-login.php

Lalu buka log akses di dashboard Shield. Baris terbaru harus menunjukkan alamat publik Anda sendiri. Kalau yang muncul 9.9.9.9, jumlah hop terlalu besar dan pengunjung bisa memilih identitasnya sendiri. Kalau yang muncul alamat privat atau edge CDN, jumlahnya terlalu kecil. Ubah angkanya, restart situs, lalu tes lagi. Hanya beberapa menit, dan setelah itu batas request, ban otomatis dan aturan alamat menghitung orang, bukan proxy.

Yang kami ubah di Atlas

Baris yang tercatat sebelum perbaikan masih membawa alamat internal hingga 30 hari, jadi dashboard sekarang menandai alamat privat dan loopback sebagai Internal dan menyembunyikan tombol blok untuknya. Memblok load balancer sendiri berarti memblok semua orang.

//Baca juga

Lainnya dari blog

Semua artikel →

//Kelola setiap brand dari satu tempat.

Mulai gratis untuk satu brand. Ajak tim Anda saat sudah siap.

$ npm install @atlas/client @atlas/nuxt

Gratis untuk satu brandTanpa kartu kreditUpgrade kapan saja