#!/bin/bash

# 数据库配置
DB_HOST="127.0.0.1"
DB_USER="root"
DB_PASSWORD="123..00"
DB_NAME="root"
DB_PORT="3306"

# 获取当前白名单 IP 地址（从数据库中查询）
ALLOWED_IPS=$(mysql -h $DB_HOST -u $DB_USER -p$DB_PASSWORD $DB_NAME -e "
SELECT ip FROM user_login_log 
JOIN users ON user_login_log.user_id = users.id
WHERE user_login_log.ip IS NOT NULL
GROUP BY user_login_log.ip;" | tail -n +2)

# 防火墙规则清理：删除数据库中已删除的 IP 地址
for ip in $(iptables -L INPUT -v -n --line-numbers | grep -E 'dpt:8888|dpt:9999' | awk '{print $8}' | sort | uniq); do
    if ! echo "$ALLOWED_IPS" | grep -qw "$ip"; then
        # 如果 IP 地址不在数据库白名单中，删除该 IP 地址的规则
        iptables -D INPUT -p tcp --dport 8888 -s $ip -j ACCEPT
        iptables -D INPUT -p tcp --dport 9999 -s $ip -j ACCEPT
        echo "$(date) - 删除了 IP 地址 $ip 的访问规则"
    fi
done

# 清除所有现有的规则，防止未删除的规则影响新的设置
iptables -F
ip6tables -F

# 设置默认策略为拒绝所有连接
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT

# 为每个白名单 IP 添加防火墙规则
for ip in $ALLOWED_IPS; do
    if [[ -n "$ip" ]]; then
        # 添加规则，允许白名单 IP 访问 8888 和 9999 端口
        iptables -A INPUT -p tcp --dport 8888 -s $ip -j ACCEPT
        iptables -A INPUT -p tcp --dport 9999 -s $ip -j ACCEPT
        echo "$(date) - 已允许 IP 地址 $ip 访问 8888 和 9999 端口"
    fi
done

# 保存防火墙规则
service iptables save
service ip6tables save

# 重载防火墙规则
systemctl reload iptables
systemctl reload ip6tables

echo "$(date) - 防火墙规则已更新，允许以下 IP 访问 8888 和 9999 端口："
echo "$ALLOWED_IPS"