返回列表 发新帖

豪哥全防

[复制链接]

7

主题

126

回帖

601

积分

初中生

Rank: 3Rank: 3

金币
378
好评
1
信誉
100
QQ
发表于 2026-6-11 16:15:21 来自手机  | 显示全部楼层 | 阅读模式  来自 广西
定向靶场防,ddos攻击,电脑运行,可能有bug,大佬帮看看,指点指点
  1. #!/bin/bash
  2. #===================================================
  3. # 脚本名称: 定向靶场全防.sh (完整增强版)
  4. # 功能描述: 针对指定靶场服务的精准 DDoS 动态防御
  5. # 适用场景: CTF/演练靶场,Web/数据库/自定义服务
  6. # 用法: sudo bash 定向靶场全防.sh
  7. #       安装后自动启用,再次运行可修改配置或卸载
  8. #===================================================

  9. set -o pipefail

  10. # ---------- 公共变量 ----------
  11. SCRIPT_NAME="定向靶场全防"
  12. SERVICE_NAME="target-defender"
  13. BLOCKER_SCRIPT="/usr/local/sbin/target_blocker.sh"
  14. WHITELIST_FILE="/root/target_whitelist.txt"
  15. LOGFILE="/var/log/target_ddos_blocker.log"
  16. LOGROTATE_CONF="/etc/logrotate.d/target-defender"
  17. SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"

  18. # ---------- 颜色输出 ----------
  19. RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'

  20. # ---------- 检查 root ----------
  21. if [[ $EUID -ne 0 ]]; then
  22.     echo -e "${RED}请使用 root 或 sudo 权限执行。${NC}"
  23.     exit 1
  24. fi

  25. # ---------- 函数:安装/更新 ----------
  26. install_defender() {
  27.     echo -e "${GREEN}=========================================${NC}"
  28.     echo -e "${GREEN}  定向靶场全防 - 安装/更新向导${NC}"
  29.     echo -e "${GREEN}=========================================${NC}"

  30.     # 检测旧版,询问卸载
  31.     if systemctl is-active --quiet $SERVICE_NAME 2>/dev/null; then
  32.         echo -e "${YELLOW}检测到已有服务在运行。${NC}"
  33.         read -p "是否覆盖重新安装?[Y/n]: " REINSTALL
  34.         if [[ "$REINSTALL" =~ ^[Nn]$ ]]; then
  35.             echo "已取消。"
  36.             exit 0
  37.         fi
  38.         systemctl stop $SERVICE_NAME
  39.         systemctl disable $SERVICE_NAME
  40.         rm -f $SERVICE_FILE
  41.         crontab -l 2>/dev/null | grep -v "target_blocker.sh" | crontab - 2>/dev/null || true
  42.     fi

  43.     # 收集配置
  44.     echo ""
  45.     echo -e "${YELLOW}请配置防御参数(直接回车使用默认值)${NC}"
  46.     read -p "保护的目标 IP [默认 0.0.0.0]: " TARGET_IP
  47.     TARGET_IP=${TARGET_IP:-0.0.0.0}
  48.     read -p "保护的端口(逗号分隔,如 80,443,8080)[默认 80,443]: " TARGET_PORTS
  49.     TARGET_PORTS=${TARGET_PORTS:-80,443}
  50.     read -p "协议 (tcp/udp) [默认 tcp]: " PROTO
  51.     PROTO=${PROTO:-tcp}
  52.     read -p "单IP最大并发连接数阈值 [默认 50]: " CONN_THRESHOLD
  53.     CONN_THRESHOLD=${CONN_THRESHOLD:-50}
  54.     read -p "封禁时长(秒)[默认 3600]: " BAN_TIMEOUT
  55.     BAN_TIMEOUT=${BAN_TIMEOUT:-3600}
  56.     read -p "检测间隔(秒)[默认 10]: " CHECK_INTERVAL
  57.     CHECK_INTERVAL=${CHECK_INTERVAL:-10}

  58.     echo ""
  59.     echo -e "${GREEN}最终配置:${NC}"
  60.     echo "  目标: $TARGET_IP:$TARGET_PORTS/$PROTO"
  61.     echo "  阈值: $CONN_THRESHOLD"
  62.     echo "  封禁: ${BAN_TIMEOUT}s"
  63.     echo "  间隔: ${CHECK_INTERVAL}s"
  64.     read -p "确认开始安装?[Y/n]: " CONFIRM
  65.     if [[ "$CONFIRM" =~ ^[Nn]$ ]]; then
  66.         echo "已取消。"
  67.         exit 0
  68.     fi

  69.     # 安装依赖
  70.     echo -e "${GREEN}[*] 安装依赖...${NC}"
  71.     if command -v apt &>/dev/null; then
  72.         apt update -qq
  73.         apt install -y iptables ipset net-tools logrotate 2>/dev/null || true
  74.     elif command -v yum &>/dev/null; then
  75.         yum install -y iptables-services ipset net-tools logrotate 2>/dev/null || true
  76.     fi

  77.     modprobe ip_set 2>/dev/null || true
  78.     modprobe ip_set_hash_net 2>/dev/null || true
  79.     modprobe xt_set 2>/dev/null || true

  80.     # 初始化 ipset 黑名单
  81.     IPSET_NAME="target_blacklist"
  82.     ipset destroy $IPSET_NAME 2>/dev/null || true
  83.     ipset create $IPSET_NAME hash:net maxelem 100000 timeout $BAN_TIMEOUT

  84.     # 构建端口变量
  85.     IFS=',' read -ra PORT_ARRAY <<< "$TARGET_PORTS"
  86.     MULTIPORT=$(IFS=,; echo "${PORT_ARRAY[*]}")

  87.     # 写入 iptables 规则(幂等)
  88.     echo -e "${GREEN}[*] 配置 iptables 规则...${NC}"
  89.     # 基础允许
  90.     iptables -C INPUT -i lo -j ACCEPT 2>/dev/null || iptables -I INPUT -i lo -j ACCEPT
  91.     iptables -C INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || \
  92.         iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

  93.     # 删除旧的黑名单规则(如果存在)
  94.     iptables -D INPUT -d $TARGET_IP -p $PROTO -m multiport --dports $MULTIPORT \
  95.              -m set --match-set $IPSET_NAME src -j DROP 2>/dev/null || true

  96.     # 添加新的黑名单匹配规则
  97.     iptables -I INPUT -d $TARGET_IP -p $PROTO -m multiport --dports $MULTIPORT \
  98.              -m set --match-set $IPSET_NAME src -j DROP

  99.     # 创建白名单模板
  100.     if [[ ! -f "$WHITELIST_FILE" ]]; then
  101.         echo "127.0.0.1" > $WHITELIST_FILE
  102.         echo "# 白名单 IP 或 CIDR,每行一个" >> $WHITELIST_FILE
  103.         echo "# 例: 192.168.1.100" >> $WHITELIST_FILE
  104.         echo "# 例: 10.0.0.0/8" >> $WHITELIST_FILE
  105.         echo -e "${YELLOW}已创建白名单文件: $WHITELIST_FILE,请立即添加你的管理IP!${NC}"
  106.     fi

  107.     # 生成动态封禁脚本
  108.     echo -e "${GREEN}[*] 生成封禁核心脚本...${NC}"
  109.     cat > $BLOCKER_SCRIPT << BLOCKER_EOF
  110. #!/bin/bash
  111. # 定向靶场动态封禁守护脚本

  112. TARGET_IP="$TARGET_IP"
  113. TARGET_PORTS=(${PORT_ARRAY[@]})
  114. PROTO="$PROTO"
  115. THRESHOLD=$CONN_THRESHOLD
  116. IPSET_NAME="$IPSET_NAME"
  117. WHITELIST_FILE="$WHITELIST_FILE"
  118. LOGFILE="$LOGFILE"
  119. BAN_TIMEOUT=$BAN_TIMEOUT

  120. # 加载白名单
  121. declare -a whitelist
  122. if [[ -f "\$WHITELIST_FILE" ]]; then
  123.     mapfile -t whitelist < <(grep -vE '^\\s*#|^\\s*$' "\$WHITELIST_FILE")
  124. fi

  125. # 纯 bash 子网匹配(支持 x.x.x.x/xx)
  126. match_cidr() {
  127.     local ip=\$1 cidr=\$2
  128.     local ip_hex cidr_ip cidr_mask
  129.     IFS='/' read -r cidr_ip cidr_mask <<< "\$cidr"
  130.     [[ -z "\$cidr_mask" ]] && cidr_mask=32
  131.     # 将 IP 转为整数
  132.     ip_to_int() {
  133.         local IFS=.
  134.         read -r a b c d <<< "\$1"
  135.         echo \$(( (a<<24) + (b<<16) + (c<<8) + d ))
  136.     }
  137.     ip_int=\$(ip_to_int "\$ip")
  138.     net_int=\$(ip_to_int "\$cidr_ip")
  139.     mask=\$(( 0xFFFFFFFF << (32 - cidr_mask) & 0xFFFFFFFF ))
  140.     (( (ip_int & mask) == (net_int & mask) ))
  141. }

  142. is_whitelisted() {
  143.     local ip=\$1 entry
  144.     for entry in "\${whitelist[@]}"; do
  145.         [[ -z "\$entry" ]] && continue
  146.         if [[ "\$entry" == "\$ip" ]]; then
  147.             return 0
  148.         elif [[ "\$entry" =~ / ]]; then
  149.             if match_cidr "\$ip" "\$entry"; then
  150.                 return 0
  151.             fi
  152.         fi
  153.     done
  154.     return 1
  155. }

  156. # 检测逻辑
  157. check_and_block() {
  158.     local filter port
  159.     for port in "\${TARGET_PORTS[@]}"; do
  160.         if [[ "\$PROTO" == "tcp" ]]; then
  161.             ss -nt state established "sport = :\$port or dport = :\$port" 2>/dev/null | \
  162.                 awk '{print \$5}' | cut -d: -f1 | grep -v '^*' | sort | uniq -c
  163.         else
  164.             ss -nu "sport = :\$port or dport = :\$port" 2>/dev/null | \
  165.                 awk '{print \$5}' | cut -d: -f1 | grep -v '^*' | sort | uniq -c
  166.         fi
  167.     done | while read count ip; do
  168.         [[ -z "\$ip" ]] && continue
  169.         if is_whitelisted "\$ip"; then
  170.             continue
  171.         fi
  172.         if [[ \$count -ge \$THRESHOLD ]]; then
  173.             ipset add \$IPSET_NAME \$ip timeout \$BAN_TIMEOUT 2>/dev/null
  174.             echo "\$(date '+%F %T') [BLOCK] \$ip conns:\$count -> banned \${BAN_TIMEOUT}s" >> \$LOGFILE
  175.         fi
  176.     done
  177. }

  178. # 主循环
  179. while true; do
  180.     check_and_block
  181.     sleep $CHECK_INTERVAL
  182. done
  183. BLOCKER_EOF

  184.     chmod +x $BLOCKER_SCRIPT

  185.     # 日志轮转
  186.     cat > $LOGROTATE_CONF << EOF
  187. $LOGFILE {
  188.     daily
  189.     rotate 7
  190.     missingok
  191.     notifempty
  192.     compress
  193.     delaycompress
  194.     copytruncate
  195. }
  196. EOF

  197.     # 创建 systemd 服务
  198.     echo -e "${GREEN}[*] 创建系统服务...${NC}"
  199.     cat > $SERVICE_FILE << EOF
  200. [Unit]
  201. Description=Target DDoS Defender
  202. After=network.target

  203. [Service]
  204. Type=simple
  205. ExecStart=$BLOCKER_SCRIPT
  206. Restart=always
  207. RestartSec=5
  208. User=root

  209. [Install]
  210. WantedBy=multi-user.target
  211. EOF

  212.     systemctl daemon-reload
  213.     systemctl enable --now $SERVICE_NAME

  214.     echo ""
  215.     echo -e "${GREEN}=========================================${NC}"
  216.     echo -e "${GREEN}  定向靶场全防安装完成!${NC}"
  217.     echo -e "${GREEN}=========================================${NC}"
  218.     echo "服务状态: systemctl status $SERVICE_NAME"
  219.     echo "白名单文件: $WHITELIST_FILE  (请立即添加你的IP!)"
  220.     echo "攻击日志: $LOGFILE"
  221.     echo "手动测试封禁: /usr/local/sbin/target_blocker.sh  (会启动循环,按 Ctrl+C 停止)"
  222.     echo ""
  223. }

  224. # ---------- 函数:卸载 ----------
  225. uninstall_defender() {
  226.     echo -e "${YELLOW}正在卸载定向靶场全防...${NC}"
  227.     systemctl stop $SERVICE_NAME 2>/dev/null || true
  228.     systemctl disable $SERVICE_NAME 2>/dev/null || true
  229.     rm -f $SERVICE_FILE
  230.     rm -f $BLOCKER_SCRIPT
  231.     rm -f $LOGROTATE_CONF

  232.     # 清除 iptables 相关规则
  233.     IPSET_NAME="target_blacklist"
  234.     iptables -D INPUT -m set --match-set $IPSET_NAME src -j DROP 2>/dev/null || true
  235.     ipset destroy $IPSET_NAME 2>/dev/null || true

  236.     # 删除 cron 残留
  237.     crontab -l 2>/dev/null | grep -v "target_blocker.sh" | crontab - 2>/dev/null || true

  238.     systemctl daemon-reload
  239.     echo -e "${GREEN}卸载完成。${NC}"
  240. }

  241. # ---------- 主菜单 ----------
  242. echo -e "${GREEN}=========================================${NC}"
  243. echo -e "${GREEN}  定向靶场全防管理脚本${NC}"
  244. echo -e "${GREEN}=========================================${NC}"

  245. # 检测当前是否已安装
  246. if systemctl list-unit-files | grep -q "^${SERVICE_NAME}.service"; then
  247.     echo -e "${GREEN}当前状态: 已安装${NC}"
  248.     systemctl is-active --quiet $SERVICE_NAME && echo -e "服务: ${GREEN}运行中${NC}" || echo -e "服务: ${RED}未运行${NC}"
  249. else
  250.     echo -e "${YELLOW}当前状态: 未安装${NC}"
  251. fi

  252. echo ""
  253. echo "请选择操作:"
  254. echo "  1) 安装 / 更新配置"
  255. echo "  2) 卸载"
  256. echo "  3) 查看实时日志"
  257. echo "  4) 查看当前黑名单"
  258. echo "  0) 退出"
  259. read -p "输入序号: " CHOICE

  260. case $CHOICE in
  261.     1) install_defender ;;
  262.     2) uninstall_defender ;;
  263.     3) tail -f $LOGFILE 2>/dev/null || echo "日志文件不存在";;
  264.     4) ipset list target_blacklist 2>/dev/null || echo "黑名单未创建";;
  265.     0) exit 0 ;;
  266.     *) echo "无效选择"; exit 1 ;;
  267. esac
复制代码

回复

使用道具 举报

108

主题

1166

回帖

4902

积分

大学生

https://director4168.github.io

Rank: 5Rank: 5

金币
3108
好评
8
信誉
100

考神MT论坛新人MT论坛最佳新人MT论坛帅哥

QQ
发表于 2026-6-11 16:42:08 来自手机  | 显示全部楼层  来自 河南
看看
回复

使用道具 举报

0

主题

2964

回帖

6897

积分

硕士生

Rank: 6Rank: 6

金币
3316
好评
0
信誉
100

MT论坛新人考神MT论坛帅哥

发表于 2026-6-11 16:49:25 来自手机  | 显示全部楼层  来自 浙江
感谢分享
回复

使用道具 举报

2

主题

478

回帖

1574

积分

高中生

Rank: 4

金币
362
好评
0
信誉
100
发表于 2026-6-11 20:51:48 来自手机  | 显示全部楼层  来自 广东
看看
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表