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:
3. Menjalankan Skrip
Untuk memblokir semua IP dalam 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
sudo netfilter-persistent save
Untuk membuka blokir, buat skrip unblokir-dari-file.sh
dengan logika kebalikan dari skrip di atas.
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