diff --git a/iptables.sh b/iptables.sh new file mode 100644 index 0000000..163b08c --- /dev/null +++ b/iptables.sh @@ -0,0 +1,49 @@ +#!/bin/bash +set -e + +BACKUP_FILE="/root/iptables-backup-$(date +%F-%H%M%S).rules" +echo "[*] Backing up current iptables rules to $BACKUP_FILE" +iptables-save > "$BACKUP_FILE" + +TEMP_DIR=$(mktemp -d) +declare -A TABLE_RULES + +echo "[*] Extracting rules by table..." + +current_table="" +while IFS= read -r line; do + if [[ "$line" =~ ^\* ]]; then + current_table="${line:1}" + TABLE_RULES["$current_table"]="$TEMP_DIR/$current_table.rules" + > "${TABLE_RULES[$current_table]}" + elif [[ "$line" =~ ^-A ]]; then + echo "$line" >> "${TABLE_RULES[$current_table]}" + fi +done < "$BACKUP_FILE" + +for table in "${!TABLE_RULES[@]}"; do + echo "[*] Processing table: $table" + RULE_FILE="${TABLE_RULES[$table]}" + DEDUPED=$(sort "$RULE_FILE" | uniq) + DUPS=$(sort "$RULE_FILE" | uniq -d) + + if [[ -n "$DUPS" ]]; then + echo "[!] Duplicate rules in $table:" + echo "$DUPS" + fi + + echo "[*] Flushing $table rules..." + iptables -t "$table" -F + iptables -t "$table" -X + + echo "[*] Rebuilding $table rules..." + while IFS= read -r rule; do + echo " → $rule" + if ! eval "iptables -t $table $rule"; then + echo "[!] Failed to apply: $rule" + fi + done <<< "$DEDUPED" +done + +rm -rf "$TEMP_DIR" +echo "[+] iptables cleanup complete. Backup saved at: $BACKUP_FILE"