#!/bin/bash

# Đường dẫn log file
IPTABLES_LOG="/var/log/iptables.log"

# Chọn ngôn ngữ (Language selection)
echo "Select language (Chọn ngôn ngữ):"
echo "1) Vietnamese (Tiếng Việt)"
echo "2) English"
read -p "Your choice (Lựa chọn): " LANG_CHOICE

if [ "$LANG_CHOICE" -eq 1 ]; then
    LANG="vi"
elif [ "$LANG_CHOICE" -eq 2 ]; then
    LANG="en"
else
    echo "Invalid choice. Defaulting to English."
    LANG="en"
fi

# hiển thị thông báo (notification function)
notify() {
    if [ "$LANG" == "vi" ]; then
        echo "$1"
    else
        echo "$2"
    fi
}

# Flush rules và xóa các ipset cũ
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
ipset destroy

# tạo ipset
ipset create whitelist hash:ip
ipset create blacklist hash:ip timeout 300

# allow IP trong whitelist
iptables -t mangle -A PREROUTING -m set --match-set whitelist src -j ACCEPT

# logging và chặn IP trong blacklist
iptables -t mangle -A PREROUTING -m set --match-set blacklist src -m limit --limit 2/sec --limit-burst 5 -j LOG --log-prefix "BLACKLIST_DROP: " --log-level 4
iptables -t mangle -A PREROUTING -m set --match-set blacklist src -j DROP

# bảo vệ game server (ports 5622, 6661:6671)
iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 5622,6661:6671 -m conntrack --ctstate NEW -m limit --limit 10/sec --limit-burst 20 -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 5622,6661:6671 -j LOG --log-prefix "GAME_SERVER_DROP: " --log-level 4
iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 5622,6661:6671 -j DROP

# phát hiện SYN Flood và log
iptables -t mangle -A PREROUTING -p tcp --syn -m limit --limit 100/sec --limit-burst 200 -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp --syn -j LOG --log-prefix "SYN_DROP: " --log-level 4
iptables -t mangle -A PREROUTING -p tcp --syn -j DROP

# phát hiện ICMP Flood và log
iptables -t mangle -A PREROUTING -p icmp -m limit --limit 5/sec --limit-burst 10 -j ACCEPT
iptables -t mangle -A PREROUTING -p icmp -j LOG --log-prefix "ICMP_DROP: " --log-level 4
iptables -t mangle -A PREROUTING -p icmp -j DROP

# phát hiện UDP Flood và log
iptables -t mangle -A PREROUTING -p udp -m multiport --dports 5622,6661:6671 -m limit --limit 100/sec --limit-burst 200 -j ACCEPT
iptables -t mangle -A PREROUTING -p udp -j LOG --log-prefix "UDP_DROP: " --log-level 4
iptables -t mangle -A PREROUTING -p udp -j DROP

# thêm IP vào blacklist nếu vượt quá giới hạn kết nối
iptables -t mangle -A PREROUTING -p tcp --syn -m connlimit --connlimit-above 50 --connlimit-mask 32 -j LOG --log-prefix "ADD_BLACKLIST: " --log-level 4
iptables -t mangle -A PREROUTING -p tcp --syn -m connlimit --connlimit-above 50 --connlimit-mask 32 -j SET --add-set blacklist src

# sysctl để bảo vệ kernel
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.conf.all.rp_filter=1
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
sysctl -w net.ipv4.icmp_echo_ignore_all=0

# chuyển log vào file riêng
if ! grep -q "iptables.log" /etc/rsyslog.conf; then
    echo ':msg, contains, "BLACKLIST_DROP" '"$IPTABLES_LOG" >> /etc/rsyslog.conf
    echo ':msg, contains, "SYN_DROP" '"$IPTABLES_LOG" >> /etc/rsyslog.conf
    echo ':msg, contains, "ICMP_DROP" '"$IPTABLES_LOG" >> /etc/rsyslog.conf
    echo ':msg, contains, "UDP_DROP" '"$IPTABLES_LOG" >> /etc/rsyslog.conf
    echo '& stop' >> /etc/rsyslog.conf
    systemctl restart rsyslog
fi

# hoàn tất
notify "Cấu hình iptables hoàn tất. Kiểm tra log tại $IPTABLES_LOG." \
       "Iptables configuration completed. Check logs at $IPTABLES_LOG."

