Category Archives: Information Technology

Bulk whois public IP address

Dari pantauan SOC, kantor tempat saya bekerja termasuk sering mengalami cyber threat. Ada banyak aplikasi yang public-facing, dan tentunya yang paling sering diserang adalah halaman website utama. Setiap serangan itu, dengan threshold tertentu kami akan melakukan automatic blocking terhadap IP addressnya menggunakan SOAR.

Dari sekian ratusan IP address yang diblok, setiap harinya, tentu ada aja false positive, atau IP ISP konsumer seperti Telkom(sel), Indosat, MyRepublic, dll yang ikut diblok. Tentu sebenarnya itu bukan best practice yang baik karena IP address tsb udah pasti NAT dan satu IP dapat digunakan oleh banyak pengguna.

Jadi secara berkala kami perlu melakukan cleansing dan release IP address tersebut. Nah untuk memudahkan identifikasi IP address ketika proses cleansing, saya coba manfaatkan untuk membuat bash script sederhana yang akan melakukan query whois seluruh IP address tsb menggunakan layanan ipapi.is. Cekidot..

#!/bin/bash

input_file="ip_list.txt"
output_file="ipapi_results.csv"
api_token="6671d06b2608be1f"  # Ganti dengan token API Anda

# Header untuk file CSV
echo "IP Address,Country,Country_Code,State,City,ORG,DESCR,is_crawler,is_datacenter,is_tor,is_proxy,is_vpn,is_abuser,abuser_score,type" > "$output_file"

counter=0
while IFS= read -r ip; do
    # Mengambil data dari ipapi.is
    location_info=$(curl -s "https://api.ipapi.is/?q=$ip&key=$api_token")

    if echo "$location_info" | grep -q "Please register"; then
        echo "Error: API key tidak valid atau kuota habis untuk IP: $ip"
        continue
    fi

    echo "Debug info untuk IP: $ip"
    echo "$location_info"

    # Parsing JSON untuk kolom yang diinginkan
    country=$(echo "$location_info" | jq -r '.location.country')
    country_code=$(echo "$location_info" | jq -r '.location.country_code')
    state=$(echo "$location_info" | jq -r '.location.state')
    city=$(echo "$location_info" | jq -r '.location.city')
    org=$(echo "$location_info" | jq -r '.asn.org')
    descr=$(echo "$location_info" | jq -r '.asn.descr')
    is_crawler=$(echo "$location_info" | jq -r '.is_crawler')
    is_datacenter=$(echo "$location_info" | jq -r '.is_datacenter')
    is_tor=$(echo "$location_info" | jq -r '.is_tor')
    is_proxy=$(echo "$location_info" | jq -r '.is_proxy')
    is_vpn=$(echo "$location_info" | jq -r '.is_vpn')
    is_abuser=$(echo "$location_info" | jq -r '.is_abuser')
    abuser_score=$(echo "$location_info" | jq -r '.company.abuser_score')
    type=$(echo "$location_info" | jq -r '.company.type')

    # Tulis hasil ke file CSV
    echo "\"$ip\",\"$country\",\"$country_code\",\"$state\",\"$city\",\"$org\",\"$descr\",\"$is_crawler\",\"$is_datacenter\",\"$is_tor\",\"$is_proxy\",\"$is_vpn\",\"$is_abuser\",\"$abuser_score\",\"$type\"" >> "$output_file"

    # Rate Limiting: Tunggu 5 detik setiap 5 permintaan
    ((counter++))
    if [ $((counter % 5)) -eq 0 ]; then
        sleep 5
    fi
done < "$input_file"

echo "Proses selesai! Lihat hasil di $output_file"

Outputnya nanti file CSV kurang lebih seperti ini;

Hope this helps!

transmission-daemon keep crashing

info="Failed name lookup - disconnected path" error=-13 profile="transmission-daemon"

kernel: audit: type=1400 audit(1727748381.320:280): apparmor="ALLOWED" operation="sendmsg" class="file" info="Failed name lookup - disconnected path" error=-13 profile="transmission-daemon" name="run/systemd/notify" pid=12363 comm="transmission-da" requested_mask="w" denied_mask="w" fsuid=113 ouid=0

The workaround is edit /etc/apparmor.d/transmission and;

- profile transmission-daemon /usr/bin/transmission-daemon flags=(complain) {
+ profile transmission-daemon /usr/bin/transmission-daemon flags=(complain,attach_disconnected) {

How to fix NGINX expired key (EXPKEYSIG ABF5BD827BD9BF62) on Debian Bookworm

apt update command giving error message something like this;

Err:8 https://nginx.org/packages/mainline/debian bookworm InRelease The following signatures were invalid: EXPKEYSIG ABF5BD827BD9BF62 nginx signing key <[email protected]>

Fix is simple;

sudo curl -s https://nginx.org/keys/nginx_signing.key | gpg --dearmor > /usr/share/keyrings/nginx-keyring.gpg

And then just do apt update as usual.

Setup Tailscale untuk Jaringan Pribadi

Kali ini saya mau share tentang bagaimana cara setup Tailscale untuk membuat jaringan pribadi yang aman dan cepat. Buat kalian yang belum tahu, Tailscale itu semacam VPN mesh yang bisa bikin perangkat-perangkat kita terhubung dengan mudah, tanpa pusingin NAT atau firewall.

Langkah-langkah Setup Tailscale

  1. Registrasi Akun Tailscale
    • Pertama, daftar dulu di Tailscale. Bisa pakai akun Google atau Microsoft biar lebih cepat.
  2. Install Tailscale di Perangkat
    • Linux:
      bash curl -fsSL https://tailscale.com/install.sh | sh
    • Windows:
      • Download installer dari sini dan install seperti biasa.
    • MacOS:
      bash brew install --cask tailscale
    • Android/iOS:
      • Download aja dari Play Store atau App Store, terus login pakai akun yang sudah didaftarkan.
  3. Login ke Tailscale
    • Setelah install, login di tiap perangkat pakai:
      bash sudo tailscale up
      atau di aplikasi GUI kalau di Windows/MacOS.
  4. Verifikasi Koneksi
    • Cek di dashboard Tailscale apakah semua perangkat sudah terhubung. Seharusnya muncul di daftar perangkat.

Penggunaan Tailscale

Sekarang semua perangkat kita sudah terhubung dalam satu jaringan mesh. Tinggal pakai aja IP yang diberikan Tailscale buat akses perangkat lain. Misal mau SSH ke server di rumah dari laptop di kantor:

ssh [email protected]

Mudah, kan? Dengan Tailscale, setup jaringan pribadi jadi lebih gampang dan cepat. Nggak perlu pusing dengan konfigurasi router atau firewall. Semoga tutorial ini membantu kalian yang mau coba Tailscale.

Sampai jumpa di post berikutnya!