#!/usr/bin/env bash
# 封 BT 滥用的一键脚本（IPv4）
# 作用：
# 1. 自动安装 iptables（如果不存在）
# 2. 封常见 BT 端口（6881-6999, 6969, 51413）
# 3. 加上简单的 BT 特征字符串拦截（可选）
# 注意：只对当前服务器生效，不影响别的机器

set -e

echo "==== 封 BT 滥用脚本开始 ===="

# 1. 必须 root
if [ "$(id -u)" -ne 0 ]; then
    echo "请用 root 用户运行本脚本（sudo -i 后再运行）"
    exit 1
fi

# 2. 检测并安装 iptables
install_iptables() {
    if command -v iptables >/dev/null 2>&1; then
        echo "iptables 已存在，跳过安装。"
        return
    fi

    echo "未检测到 iptables，尝试安装..."

    if command -v apt-get >/dev/null 2>&1; then
        apt-get update -y
        apt-get install -y iptables
    elif command -v yum >/dev/null 2>&1; then
        yum install -y iptables
    elif command -v dnf >/dev/null 2>&1; then
        dnf install -y iptables
    elif command -v zypper >/dev/null 2>&1; then
        zypper install -y iptables
    else
        echo "无法识别的系统/找不到包管理器，请手动安装 iptables 后再运行。"
        exit 1
    fi

    if ! command -v iptables >/dev/null 2>&1; then
        echo "iptables 安装失败，请手动检查后重试。"
        exit 1
    fi
}

install_iptables

# 3. 封端口的函数，避免重复添加
add_drop_port_range() {
    local chain="$chain"
    chain="$1"
    local proto="$2"
    local from="$3"
    local to="$4"

    # 检查是否已有规则，避免重复
    if iptables -C "$chain" -p "$proto" --dport "$from":"$to" -j DROP 2>/dev/null; then
        echo "已存在规则: $chain $proto $from-$to DROP"
    else
        iptables -A "$chain" -p "$proto" --dport "$from":"$to" -j DROP
        echo "添加规则: $chain $proto $from-$to DROP"
    fi
}

add_drop_single_port() {
    local chain="$1"
    local proto="$2"
    local port="$3"

    if iptables -C "$chain" -p "$proto" --dport "$port" -j DROP 2>/dev/null; then
        echo "已存在规则: $chain $proto $port DROP"
    else
        iptables -A "$chain" -p "$proto" --dport "$port" -j DROP
        echo "添加规则: $chain $proto $port DROP"
    fi
}

# 4. 在 INPUT / OUTPUT / FORWARD 封常见 BT 端口
CHAINS=("INPUT" "OUTPUT" "FORWARD")
for c in "${CHAINS[@]}"; do
    # 6881-6999 常见 BT 端口
    add_drop_port_range "$c" tcp 6881 6999
    add_drop_port_range "$c" udp 6881 6999

    # 6969 常见 tracker 端口
    add_drop_single_port "$c" tcp 6969
    add_drop_single_port "$c" udp 6969

    # 51413 Transmission 默认端口
    add_drop_single_port "$c" tcp 51413
    add_drop_single_port "$c" udp 51413
done

# 5. 简单的 BT 特征字符串拦截（可能稍有性能开销，如不需要可注释掉）
add_bt_string_rule() {
    local chain="$1"
    local str="$2"

    if iptables -C "$chain" -m string --string "$str" --algo bm -j DROP 2>/dev/null; then
        echo "已存在字符串规则: $chain \"$str\" DROP"
    else
        iptables -A "$chain" -m string --string "$str" --algo bm -j DROP
        echo "添加字符串规则: $chain \"$str\" DROP"
    fi
}

for c in "${CHAINS[@]}"; do
    add_bt_string_rule "$c" "BitTorrent"
    add_bt_string_rule "$c" "announce.php?info_hash"
    add_bt_string_rule "$c" "peer_id="
done

# 6. 尝试保存规则（不同系统方式不同，这里做一个尽量兼容的保存）
save_rules() {
    echo "尝试保存 iptables 规则以便重启后继续生效..."

    if command -v netfilter-persistent >/dev/null 2>&1; then
        netfilter-persistent save || true
    elif command -v service >/dev/null 2>&1 && service iptables save 2>/dev/null; then
        echo "使用 service iptables save 保存。"
    else
        # 通用保存到文件
        iptables-save > /etc/iptables.rules
        if [ ! -f /etc/network/if-pre-up.d/iptables ]; then
            cat >/etc/network/if-pre-up.d/iptables <<'EOF'
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules
EOF
            chmod +x /etc/network/if-pre-up.d/iptables
            echo "已创建 /etc/network/if-pre-up.d/iptables，开机自动恢复规则。"
        fi
    fi
}

save_rules

echo "==== 完成：BT 相关端口和部分特征已封禁 ===="
echo "当前规则检查：iptables -L -n -v"
