Cara blokir negara pada Nginx

Yang saya bahas kali ini sangat cocok buat pemilik forum atau website yang memperbolehkan registrasi akun penggunanya. Salah satu masalah klasik yang dialami pemilik forum adalah spammer, baik manusia maupun bot. Ada banyak solusi yang bisa digunakan, tapi yang saya pakai disini adalah blokir negara yang bukan tujuan pemakainya dan hanya memperbolehkan negara yang sesuai target marketnya.

Dan sesuai judul, solusinya untuk Nginx. 🙂 Dan tentu saja kita tidak pakai cara primitif dengan blacklist/whitelist alamat IP negara yang akan disetting, selain banyak juga merepotkan saja saat maintenancenya. 😀 Kita pakai cara praktis dong.

Langkah pertama pastikan dulu bahwa instalasi Nginx anda sudah memiliki dukungan GeoIP, namanya --with-http_geoip_module:

nginx -V
nginx version: nginx/1.10.0
built with OpenSSL 1.0.2h  3 May 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt=-Wl,-z,relro --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_mp4_module --with-http_random_index_module --with-http_secure_link_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-threads --add-module=/usr/src/packages/BUILD/debian/modules/headers-more-nginx-module --add-module=/usr/src/packages/BUILD/debian/modules/nginx-auth-pam --add-module=/usr/src/packages/BUILD/debian/modules/nginx-cache-purge --add-module=/usr/src/packages/BUILD/debian/modules/nginx-dav-ext-module --add-module=/usr/src/packages/BUILD/debian/modules/nginx-echo --add-module=/usr/src/packages/BUILD/debian/modules/ngx-fancyindex --add-module=/usr/src/packages/BUILD/debian/modules/nginx-http-push --add-module=/usr/src/packages/BUILD/debian/modules/nginx-lua --add-module=/usr/src/packages/BUILD/debian/modules/nginx-upload-progress --add-module=/usr/src/packages/BUILD/debian/modules/nginx-upstream-fair --add-module=/usr/src/packages/BUILD/debian/modules/ngx_http_substitutions_filter_module --add-module=/usr/src/packages/BUILD/debian/modules/memc-nginx-module --add-module=/usr/src/packages/BUILD/debian/modules/srcache-nginx-module --add-module=/usr/src/packages/BUILD/debian/modules/HttpRedisModule --add-module=/usr/src/packages/BUILD/debian/modules/redis2-nginx-module --add-module=/usr/src/packages/BUILD/debian/modules/nginx-development-kit --add-module=/usr/src/packages/BUILD/debian/modules/set-misc-nginx-module

Kalau ada tinggal kita tambahkan database asosiasi alamat IP dengan lokasi geografisnya:

  • Debian/Ubuntu:
    apt-get install geoip-database libgeoip1
  • CentOS:
    yum install geoip geoip-devel

    Catatan, harus ada repository EPEL.

Baru kita masuk ke setting Nginx pada nginx.conf, letakkan dalam blok http{}:

  • Misal kita ingin melakukan whitelist hanya negara Indonesia saja yang boleh akses.
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default no;
        ID yes;
    }
  • Atau sebaliknya kita ingin blokir tiga negara (saya nulis acak saja: Ukraina, Cina dan Amerika Serikat) dan lainnya bebas:
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default yes;
        UA no;
        CN no;
        US no;
    }

Gunakan salah satu saja.

Ini bukan berarti blokir negaranya sudah berfungsi, masih perlu kita tentukan bekerja dimana. Karena itu dilanjutkan dengan edit konfigurasi virtual host dari website anda. Disini saya hanya ingin blokir ke halaman registrasi dari SMF (Simple Machine Forum), jadi misal ternyata pengunjungnya valid tetap bisa baca konten forum.

location /index.php?action=register {
    if ($allowed_country = no) {
        return 444;
    }
}

Nanti akan muncul error 444 Connection Closed Without Response, ini kode error HTTP buatan Nginx yang akan menutup koneksi tanpa respon ke browser atau alat yang dipakai pengunjung.

Selanjutnya jangan lupa restart Nginx supaya setting barunya diterapkan:

service nginx restart

Baru benar – benar aktif blokir negaranya.

Satu pemikiran pada “Cara blokir negara pada Nginx”

  1. gimana dengan ip bot google search engine? apa kena blok juga jika kita hanya aktifkan untuk ID?
    terus, bagaimana solusinya agak bot search engine bisa?

Tinggalkan komentar