How to Block Multiple IP Addresses at Once with iptables from a File List

Ketika mengelola server, sering kali kita perlu memblokir banyak alamat IP yang mencurigakan atau terbukti melakukan serangan. Melakukannya satu per satu tentu tidak efisien. Artikel ini akan membahas bagaimana membuat skrip Bash untuk memblokir banyak IP sekaligus menggunakan iptables, dengan fitur:

  • Membaca IP dari file (listip.txt)
  • Idempoten (tidak membuat rule ganda)
  • Memastikan format IP valid
  • Menghindari duplikasi di dalam file
  • Mengecek apakah IP sudah diblokir sebelumnya
  • Menyimpan log setiap eksekusi 

 

1. Persiapan File Daftar IP

Buat file bernama listip.txt berisi IP yang ingin diblokir, satu per baris:
185.91.127.107
91.224.92.17
128.199.27.149
# Bisa juga tambahkan komentar seperti ini

2. Membuat Skrip blokir-dari-file.sh

Simpan skrip berikut ke /usr/local/bin/blokir-dari-file.sh:

#!/bin/bash
# Blokir IP massal dari file (iptables) — idempoten, skip duplikat, jelas status

set -euo pipefail
set -o errtrace
trap 'echo "❌ Error di baris $LINENO: $BASH_COMMAND"; exit 1' ERR

FILE="${1:-listip.txt}"
LOG_FILE="/var/log/blokir-ip.log"
VERBOSE="${VERBOSE:-0}"

echo "➡️  Mulai: file sumber = $FILE"
[[ -r "$FILE" ]] || { echo "File tidak ditemukan/tdk bisa dibaca: $FILE"; exit 1; }

valid_ipv4() {
  local ip="$1"
  [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || return 1
  IFS='.' read -r a b c d <<< "$ip"
  for o in "$a" "$b" "$c" "$d"; do
    (( o >= 0 && o <= 255 )) || return 1
  done
  return 0
}

rule_exist() {
  local chain="$1" ip="$2"
  set +e
  iptables -C "$chain" -s "$ip" -j DROP >/dev/null 2>&1
  local rc=$?
  set -e
  return $rc
}

add_rule_if_missing() {
  local chain="$1" ip="$2"
  if ! rule_exist "$chain" "$ip"; then
    iptables -I "$chain" -s "$ip" -j DROP
    [[ "$VERBOSE" = "1" ]] && echo "  + tambah $chain DROP untuk $ip"
    return 0
  else
    [[ "$VERBOSE" = "1" ]] && echo "  = sudah ada $chain DROP untuk $ip"
    return 1
  fi
}

declare -A seen
added=0
already_skip=0
invalid=0
dupe_skip=0
total=0

clean_line() { tr -d '\r' <<<"$1"; }

while IFS= read -r line || [[ -n "$line" ]]; do
  ip="$(clean_line "${line%%#*}")"
  ip="$(echo "$ip" | xargs)"
  [[ -z "$ip" ]] && continue

  (( ++total ))

  if [[ -n "${seen[$ip]:-}" ]]; then
    (( ++dupe_skip ))
    echo "↪️  Duplikat (skip): $ip"
    continue
  fi
  seen[$ip]=1

  if ! valid_ipv4 "$ip"; then
    (( ++invalid ))
    echo "❌ Format tidak valid (skip): $ip"
    continue
  fi

  if rule_exist INPUT "$ip" && rule_exist FORWARD "$ip"; then
    (( ++already_skip ))
    echo "⚠️  Sudah diblokir (skip): $ip"
    continue
  fi

  changed=0
  add_rule_if_missing INPUT "$ip"   && changed=1 || true
  add_rule_if_missing FORWARD "$ip" && changed=1 || true

  if (( changed == 1 )); then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Blokir IP: $ip (via $FILE)" >> "$LOG_FILE"
    echo "✅ Berhasil blokir/konfirmasi: $ip"
    (( ++added ))
  else
    (( ++already_skip ))
    echo "⚠️  Sudah diblokir (skip): $ip"
  fi
done < "$FILE"

echo "---- Ringkasan ----"
echo "Total baris          : $total"
echo "Berhasil ditambahkan : $added"
echo "Sudah diblokir (skip): $already_skip"
echo "Tidak valid          : $invalid"
echo "Duplikat (skip)      : $dupe_skip"
echo "Log                  : $LOG_FILE"
echo "✅ Selesai."


Beri izin eksekusi:

chmod +x /usr/local/bin/blokir-dari-file.sh

3. Menjalankan Skrip

Untuk memblokir semua IP dalam listip.txt:

sudo blokir-dari-file.sh listip.txt


 Jika ingin melihat detail proses:

sudo VERBOSE=1 blokir-dari-file.sh listip.txt 

4. Melihat Hasil

Cek aturan iptables yang sudah ditambahkan:

sudo iptables -L INPUT -n --line-numbers | grep DROP
sudo iptables -L FORWARD -n --line-numbers | grep DROP 

Cek log pemblokiran:

cat /var/log/blokir-ip.log

5. Tips

 Untuk menyimpan aturan agar tetap ada setelah reboot:
 
sudo apt install iptables-persistent -y
sudo netfilter-persistent save 

Untuk membuka blokir, buat skrip unblokir-dari-file.sh dengan logika kebalikan dari skrip di atas.

Subscribe to receive free email updates:

0 Response to "How to Block Multiple IP Addresses at Once with iptables from a File List"

Posting Komentar

Aturan Berkomentar :

1. Berbicara menggunakan bahasa yang enak didengar. Tidak Untuk menyinggung perasaan orang Lain.

2.Spamming (Spam Comment)

3.Kalau Mau ngopy-paste artikel disini, Berikan sumbernya