• UDP Script NO Multilogin VFinal

    udp script no multilogin
    Panduan Membuat Penjaga Koneksi UDP Anti Multi-Login 
     Tujuan : 
     1.Mencegah satu user terhubung dari beberapa IP secara bersamaan. 
    2.Otomatis melepas blokir IP setelah 15 menit tidak aktif (sistem yang adil). 
    3.Memiliki "memori" koneksi saat pertama kali dijalankan. 
    4.Dapat diaktifkan/dinonaktifkan secara manual, dan statusnya akan diingat setelah reboot VPS.
    Langkah 1: Buat Struktur Direktori yang Diperlukan
    Sistem Operasi Ubuntu Server 20.04 lts s/d Ubuntu Server 24.04 lts
    Instal conntrack (jika belum ada). Ini adalah alat penting untuk memutus koneksi secara paksa.
    sudo apt update && sudo apt install conntrack -y
    Jalan kan perintah berikut :
    sudo mkdir -p /opt/udp-proxy/bin
    sudo mkdir -p /opt/udp-proxy/log
    Langkah 2: Membuat Skrip Utama Penjaga
    1.Buat file skrip:
    sudo nano /opt/udp-proxy/bin/enforcer_service.sh
    2.Salin dan tempel seluruh skrip di bawah ini.
    #!/bin/bash
    
    # =================================================================
    # --- CEK FILE BENDERA (PANEL KONTROL) ---
    # Skrip akan berhenti jika file bendera ini tidak ada.
    # =================================================================
    FLAG_FILE="/opt/udp-proxy/log/enforcer.enabled"
    if [ ! -f "$FLAG_FILE" ]; then
        echo "[$(date)] File bendera '$FLAG_FILE' tidak ditemukan. Penjaga tidak aktif. Keluar."
        exit 0
    fi
    
    # =================================================================
    # --- KONFIGURASI PENJAGA (UBAH BAGIAN INI SAJA) ---
    # =================================================================
    PROTECTED_PORT=36712         # Port UDP yang dilindungi
    STATE_FILE="/opt/udp-proxy/log/enforcer_state.log"
    IPTABLES_CHAIN="UDP_ENFORCER"
    MEMORY_MINUTES=10            # Berapa lama mengingat sesi yang tidak aktif
    TIMEOUT_MINUTES=15           # Sesi dianggap hangus setelah X menit tidak ada aktivitas
    GRACE_PERIOD_SECONDS=0       # Waktu tunggu sebelum IP lama ditendang (0 detik = segera)
    # Nama layanan UDP proxy Anda (DITEMUKAN DI LANGKAH 0)
    UDP_SERVICE_NAME="udp-custom.service"
    # =================================================================
    
    # --- PASTIKAN DIREKTORI YANG DIPERLUKAN ADA ---
    mkdir -p "$(dirname "$STATE_FILE")"
    touch "$STATE_FILE"
    
    # =================================================================
    # --- FUNGSI PEMBERSIH (OTOMATIS LUPA & EKSEKUSI TIMER) ---
    # =================================================================
    function cleanup() {
        echo "[$(date)] =====> MEMULAI PEMBERSIHAN DAN EKSEKUSI TIMER <====="
        local current_time=$(date +%s)
        local timeout_seconds=$((TIMEOUT_MINUTES * 60))
        local temp_state_file=$(mktemp)
    
        while IFS=':' read -r user ip last_seen violation_time; do
            if [[ -z "$user" || -z "$ip" || -z "$last_seen" ]]; then continue; fi
            
            local elapsed=$((current_time - last_seen))
    
            if [ "$elapsed" -lt "$timeout_seconds" ]; then
                if [[ -n "$violation_time" ]]; then
                    local violation_elapsed=$((current_time - violation_time))
                    if [ "$violation_elapsed" -ge "$GRACE_PERIOD_SECONDS" ]; then
                        echo "[$(date)] >>> EKSEKUSI: Timer habis. Memutus & memblokir IP '$ip' (user: '$user')..."
                        sudo conntrack -D -s "$ip" -p udp 2>/dev/null
                        if ! sudo iptables -C "$IPTABLES_CHAIN" -s "$ip" -j DROP &> /dev/null; then
                            sudo iptables -A "$IPTABLES_CHAIN" -s "$ip" -j DROP -m comment --comment "Kicked $USER on $(date +%F-%T)"
                            echo "[$(date)] >>> IP '$ip' telah diblokir."
                        fi
                        continue
                    else
                        echo "[$(date)] [DEBUG] Timer untuk IP '$ip' user '$user' belum habis. Menunggu..."
                        echo "${user}:${ip}:${last_seen}:${violation_time}" >> "$temp_state_file"
                    fi
                else
                    echo "[$(date)] [DEBUG] Sesi normal untuk user '$user' dari IP '$ip'."
                    echo "${user}:${ip}:${last_seen}:" >> "$temp_state_file"
                fi
            else
                echo "[$(date)] Sesi untuk user '$user' dari IP '$ip' kadaluarsa. Membuka blokir..."
                local rule_num=$(sudo iptables -L "$IPTABLES_CHAIN" --line-numbers -n | grep "$ip" | awk '{print $1}' | head -n 1)
                if [ -n "$rule_num" ]; then
                    sudo iptables -D "$IPTABLES_CHAIN" "$rule_num"
                fi
            fi
        done < "$STATE_FILE"
    
        mv "$temp_state_file" "$STATE_FILE"
        echo "[$(date)] =====> PEMBERSIHAN SELESAI <====="
    }
    
    # =================================================================
    # --- FUNGSI BLOCKING SEGERA (Pendekatan 1) ---
    # =================================================================
    function immediate_block() {
        local user="$1"
        local old_ip="$2"
        echo "[$(date)] >>> EKSEKUSI SEGERA: Memutus & memblokir IP '$old_ip' (user: '$user')..."
        sudo conntrack -D -s "$old_ip" -p udp 2>/dev/null
        if ! sudo iptables -C "$IPTABLES_CHAIN" -s "$old_ip" -j DROP &> /dev/null; then
            sudo iptables -A "$IPTABLES_CHAIN" -s "$old_ip" -j DROP -m comment --comment "Kicked $user on $(date +%F-%T)"
            echo "[$(date)] >>> IP '$old_ip' telah diblokir SEGERA."
        fi
    }
    
    # =================================================================
    # --- INISIALISASI PENJAGA ---
    # =================================================================
    # Buat chain jika belum ada
    if ! sudo iptables -L "$IPTABLES_CHAIN" &> /dev/null; then
        echo "[$(date)] Membuat chain iptables: $IPTABLES_CHAIN"
        sudo iptables -N "$IPTABLES_CHAIN"
    fi
    
    # --- PASTIKAN POSISI ATURAN BENAR (KRUSIAL) ---
    echo "[$(date)] Memastikan aturan iptables berada di posisi teratas..."
    sudo iptables -D INPUT -p udp --dport "$PROTECTED_PORT" -j "$IPTABLES_CHAIN" 2>/dev/null
    sudo iptables -D FORWARD -p udp --dport "$PROTECTED_PORT" -j "$IPTABLES_CHAIN" 2>/dev/null
    sudo iptables -F "$IPTABLES_CHAIN" # Bersihkan aturan lama
    sudo iptables -I INPUT 1 -p udp --dport "$PROTECTED_PORT" -j "$IPTABLES_CHAIN"
    sudo iptables -I FORWARD 1 -p udp --dport "$PROTECTED_PORT" -j "$IPTABLES_CHAIN"
    
    # Jalankan cleanup di latar belakang (setiap 1 menit - Pendekatan 2)
    while true; do
        cleanup
        sleep 60  # Cek setiap 1 menit (bukan 5 menit)
    done &
    CLEANUP_PID=$!
    trap 'kill $CLEANUP_PID; exit' SIGTERM SIGINT
    
    # Memori awal
    echo "[$(date)] Memuat memori awal dari $MEMORY_MINUTES menit terakhir..."
    sudo journalctl -u "$UDP_SERVICE_NAME" --since "$MEMORY_MINUTES minutes ago" --no-pager | grep "Client connected" | sort | awk -F'[][]' '
    {
        for (i=1; i<=NF; i++) {
            if ($i ~ /src:/) { split($i, s, ":"); ip = s[2]; }
            if ($i ~ /user:/) { split($i, u, ":"); user = u[2]; }
        }
        if (user && ip) {
            print user ":" ip ":" systime() ":" > "'"$STATE_FILE"'"
        }
    }'
    awk -i inplace '!seen[$0]++' "$STATE_FILE"
    echo "[$(date)] Memori awal selesai. Penjaga siap bertugas!"
    
    # Loop utama pemantauan
    echo "[$(date)] Memantau log layanan: $UDP_SERVICE_NAME"
    sudo journalctl -u "$UDP_SERVICE_NAME" -f --no-tail | while read line; do
        if [[ "$line" == *"[INFO]"*"[src:"*"[user:"*"Client connected"* ]]; then
            IP=$(echo "$line" | awk -F'[][]' '{for(i=1;i<=NF;i++){if($i ~ /src:/){split($i, a, ":"); print a[2]}}}')
            USER=$(echo "$line" | awk -F'[][]' '{for(i=1;i<=NF;i++){if($i ~ /user:/){split($i, a, ":"); print a[2]}}}')
            if [[ -n "$IP" && -n "$USER" ]]; then
                echo "[$(date)] Koneksi baru: User '$USER' dari IP '$IP'"
                LAST_ENTRY=$(grep "^${USER}:" "$STATE_FILE" | tail -n 1)
                LAST_IP=$(echo "$LAST_ENTRY" | cut -d':' -f2)
                if [[ -n "$LAST_IP" && "$LAST_IP" != "$IP" ]]; then
                    echo "[$(date)] >>> PELANGGARAN: User '$USER' multi-login (IP lama: '$LAST_IP', IP baru: '$IP')."
                    # Panggil blocking segera (Pendekatan 1)
                    immediate_block "$USER" "$LAST_IP"
                    # Hapus entri lama tanpa menunggu grace period
                    sed -i "/^${USER}:${LAST_IP}:/d" "$STATE_FILE"
                fi
                echo "${USER}:${IP}:$(date +%s)::" >> "$STATE_FILE"
                awk -i inplace '!seen[$0]++' "$STATE_FILE"
            fi
        elif [[ "$line" == *"[INFO]"*"[src:"*"[user:"*"Client disconnected"* ]]; then
            IP=$(echo "$line" | awk -F'[][]' '{for(i=1;i<=NF;i++){if($i ~ /src:/){split($i, a, ":"); print a[2]}}}')
            USER=$(echo "$line" | awk -F'[][]' '{for(i=1;i<=NF;i++){if($i ~ /user:/){split($i, a, ":"); print a[2]}}}')
            if [[ -n "$IP" && -n "$USER" ]]; then
                echo "[$(date)] User '$USER' dari IP '$IP' disconnect. Membersihkan state..."
                sed -i "/^${USER}:${IP}:/d" "$STATE_FILE"
            fi
        fi
    done
    3.Simpan dan keluar (Ctrl+X, Y, Enter).
    4.Berikan izin eksekusi:
    sudo chmod +x /opt/udp-proxy/bin/enforcer_service.sh
    Langkah 3: Membuat Layanan systemd
    1.Buat file layanan:
    sudo nano /etc/systemd/system/udp-enforcer.service
    2.Salin dan tempel konfigurasi berikut:
    [Unit]
    Description=UDP Connection Enforcer Service
    After=network.target udp-custom.service
    Wants=udp-custom.service
    
    [Service]
    Type=simple
    ExecStart=/opt/udp-proxy/bin/enforcer_service.sh
    Restart=always
    RestartSec=10
    User=root
    
    [Install]
    WantedBy=multi-user.target
    3.Simpan dan keluar (Ctrl+X, Y, Enter).
    Langkah 4: Membuat Perintah Kontrol Manual (enforcer-on / enforcer-off)
    Ini adalah kunci untuk kontrol yang "ber-ingat".
    1.Buat perintah enforcer-on:
    sudo nano /usr/local/bin/enforcer-on
    Salin dan tempel:
    #!/bin/bash
    FLAG_FILE="/opt/udp-proxy/log/enforcer.enabled"
    SERVICE_NAME="udp-enforcer.service"
    
    echo "Mengaktifkan Penjaga Koneksi..."
    
    # Buat direktori log jika belum ada untuk mencegah error
    sudo mkdir -p "$(dirname "$FLAG_FILE")"
    
    sudo touch "$FLAG_FILE"
    sudo systemctl start "$SERVICE_NAME"
    sudo systemctl enable "$SERVICE_NAME"
    echo "Penjaga telah diaktifkan. Statusnya akan diingat setelah reboot."
    2.Buat perintah enforcer-off:
    sudo nano /usr/local/bin/enforcer-off
    Salin dan tempel:
    #!/bin/bash
    FLAG_FILE="/opt/udp-proxy/log/enforcer.enabled"
    SERVICE_NAME="udp-enforcer.service"
    
    echo "Menonaktifkan Penjaga Koneksi..."
    sudo systemctl stop "$SERVICE_NAME"
    sudo rm -f "$FLAG_FILE"
    echo "Penjaga telah dinonaktifkan. Statusnya akan diingat setelah reboot."
    3.Berikan izin eksekusi pada kedua perintah:
    sudo chmod +x /usr/local/bin/enforcer-on
    sudo chmod +x /usr/local/bin/enforcer-off
    5.Langkah 5: Finalisasi dan Aktivasi Awal
    Langkah terakhir untuk menyelesaikan setup dan mengaktifkan Penjaga untuk pertama kalinya.
    1.Muat ulang systemd untuk mengenali layanan baru:
    sudo systemctl daemon-reload
    2.Aktifkan layanan sekali saja
    sudo systemctl enable udp-enforcer.service
    3.Aktifkan Penjaga untuk pertama kalinya:
    enforcer-on
    4.Verifikasi statusnya:
    sudo systemctl status udp-enforcer.service
    Anda harus melihat Active: active (running).
    Jalankan perintah-perintah ini secara manual untuk pengecekan urutan aturan:
    sudo iptables -D INPUT -p udp --dport 36712 -j UDP_ENFORCER
    sudo iptables -I INPUT 1 -p udp --dport 36712 -j UDP_ENFORCER
    Sekarang, coba lagi perintah :
    sudo iptables -L INPUT -n -v --line-numbers
    Hasilnya harusnya terlihat seperti ini:
    Chain INPUT (policy ACCEPT ...)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        0     0 UDP_ENFORCER  udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:36712
    2    1355K  318M ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:36712
    ...
    Sekarang UDP_ENFORCER ada di posisi #1. Sistem blokir seharusnya sudah bekerja!
    Restart layanan untuk menerapkan perubahan:
    sudo systemctl restart udp-enforcer.service
    Ringkasan Perintah Tanpa Panel/Manual
    Mengaktifkan Penjaga
    enforcer-on
    Menonaktifkan Penjaga
    enforcer-off
    Cek Status Layanan
    sudo systemctl status udp-enforcer.service
    Lihat Log Aktivitas
    sudo journalctl -u udp-enforcer.service -f --no-pager
    Lihat IP yang Diblokir
    sudo iptables -L UDP_ENFORCER -n -v
    Lepas Semua Blokir
    sudo iptables -F UDP_ENFORCER
    Hapus File State (Reset)
    echo "" > /opt/udp-proxy/log/enforcer_state.log

  • My Profile In SOSMED

    ADDRESS

    Jalan Raya Badau Km.11 Rt.06/02 Tanjung Pandan Belitung 33451

    EMAIL

    purwana.cecep@gmail.com
    uraxarixteamxxx@gmail.com

    Telephone

    +628197887769