Cara blokir pengunjung berdasarkan user agent di Nginx

Ada berbagai macam metode untuk memblokir akses ke situs yang dihosting menggunakan web server Nginx. Mulai dari blokir menggunakan alamat IP pengunjung, langsung per negara, berapa kali konten diminta, dan yang saya bahas kali ini melalui identitas pengunjungnya. Maksudnya identitas disini adalah user agent yang umum dilaporkan oleh browser atau aplikasi saat meminta konten dari server. Dan ini cukup unik sehingga bisa dijadikan dasar aturannya.

Dalam membahas masalah ini sebenarnya saya juga sedang berusaha mengatasinya pada salah satu website yang berisi banyak gambar, entah kenapa kok banyak yang suka mendownload semuanya. Ini cukup memberatkan kerja Nginx karena yang diunduh bukan hanya gambar dan foto tapi halaman situsnya. Padahal sudah diwatermark. Heran saya. Haha. 😀

Kalau saya baca dari log Nginx cukup banyak yang menggunakan user agent wget dan curl. Wah… bukan browser ini tapi memang digunakan untuk mendownload konten. Karena menurut pertimbangan saya tidak ada manfaatnya kalau dibiarkan maka saya putuskan diblokir saja.

Ya, sekian ceritanya mari kita masuk ke fokus pembahasan. Langsung saja silahkan buka konfigurasi Nginx (nginx.conf):

nano /etc/nginx/nginx.conf

Saya gunakan salah satu lokasi defaultnya, bisa ditempat lain juga tergantung instalasinya dan distro Linux yang dipakai.

Setelah itu tambahkan kode berikut dalam blok http{}:

if ($http_user_agent ~* (wget|curl) ) {
    return 403;
}

Ini untuk blokir wget dan curl. Tentu saja bisa anda tambahkan yang lain. Sebenarnya tidak dibatasi seberapa banyaknya tapi kalau ingin blokir user agent secara massal lebih baik menggunakan Nginx map (ngx_http_map_module). Soalnya akan berpengaruh pada performa Nginx kalau banyak sekali yang dimasukkan dalam rulenya.

Oh ya, bagi anda yang asalnya dari dunia shared hosting (cPanel) atau Apache maka untuk blokir bot juga lewat cara yang dibahas karena tidak ada .htaccess. Jadi memang edit konfigurasi Nginx solusinya.

5 Comments

  1. Mas, cara lihat user agen dan load web server kita diakses sama siapa aja itu ngelihatnya dimana ya?
    Memangnya kalau user akses lewat browser firefox atau crome itu ada identifik

  2. Maaf hape error, blm selesai malah kepencet pos. Lanjutan diatas.. Ada identifikasi nama user agennya? Hehe maaf baru tau..:)

    1. Bisa dilihat dari access log Nginx mas:

      tail -5 /var/log/nginx/access.log

      Contoh hasilnya:

      180.76.15.145 - - [19/Jul/2016:22:20:03 -0400] "GET / HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
      66.249.82.192 - - [19/Jul/2016:22:26:24 -0400] "GET / HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Linux; Android 5.1; m2 note Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537.36"
      66.249.82.196 - - [19/Jul/2016:22:26:25 -0400] "GET / HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Linux; Android 5.1; m2 note Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537.36"
      157.55.39.151 - - [19/Jul/2016:22:37:18 -0400] "GET /robots.txt HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
      208.115.113.89 - - [19/Jul/2016:22:56:48 -0400] "GET /home HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, [email protected])"
      Chrome/51.0.2704.103 Safari/537.36"

      Bisa dilihat 5 akses terakhir ada botnya Baidu, browser Chrome di Android, botnya Bing, botnya Moz (tampaknya ada yang cek backlink blognya 😛 ) dan seterusnya.

  3. user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    include /etc/nginx/modules-enabled/*.conf;
    
    events {
            worker_connections 768;
            # multi_accept on;
    }
    
    http {
    
            ##
            # Basic Settings
            ##
    
            sendfile on;
            tcp_nopush on;
            tcp_nodelay on;
            keepalive_timeout 65;
            types_hash_max_size 2048;
            # server_tokens off;
    
            # server_names_hash_bucket_size 64;
            # server_name_in_redirect off;
    
            include /etc/nginx/mime.types;
            default_type application/octet-stream;
    
            ##
            # SSL Settings
            ##
    
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
            ssl_prefer_server_ciphers on;
    
            ##
            # Logging Settings
            ##
    
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;
    
            ##
            # Gzip Settings

    ditambahkan dibagian mana mas ?
    bisa dicontohkan disisip dimana ?

    Terima kasih

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *