TCP连接数统计脚本

  • 脚本名称:count_connection.sh

  • 执行结果如下:

    [root@test ]# bash count_connection.sh 
    ip:10.0.0.99
    连接数:228
    服务状态:ESTABLISHED,FIN_WAIT2,TIME_WAIT,CLOSE_WAIT
    服务:java,-
    
  • 飞书通知如下

    在这里插入图片描述
  • 完整脚本

    #!/bin/bash
    # 如有预警高连接IP,需先查询nginx服务器日志,确定是否为异常IP,再执行以下iptables命令禁用异常IP
    # iptables规则禁用高连接的异常IP: iptables -I INPUT -s <被禁IP> -j DROP
    
    # 定义飞书机器人的Webhook URL   
    feishu_hook='https://open.feishu.cn/open-apis/bot/v2/hook/xxxx'
    
    # 内网IP
    inet_ip=$(ip a| grep eth0 | grep inet |grep -v inet6|awk '{print $2}'|awk -F '/' '{print $1}')
    
    # 生成数组声明语句并执行
    eval "$(netstat -antpl | gawk -v target="$inet_ip" '
    BEGIN {
        count = 0
        PROCINFO["sorted_in"] = "@val_num_desc"
    }
    $0 ~ target {
        split($5, arr, /:[0-9]+$/)
        ip = arr[1]
    
        cnt[ip]++
        total++
    
        if (!seen_state[ip][$6]++)
            states[ip] = (states[ip] ? states[ip] "," : "") $6
    
        split($7, p, "/")
        svc = p[2] ? p[2] : p[1]
        if (!seen_svc[ip][svc]++)
            services[ip] = (services[ip] ? services[ip] "," : "") svc
    }
    END {
        for (ip in cnt) {
            if (count >= 1) break
            count++
    
            # 转义单引号防止语法错误
            gsub(/\047/, "\047\\\047\047", states[ip])  # 处理单引号
            gsub(/\047/, "\047\\\047\047", services[ip])
    
            # 生成关联数组声明语句
            printf "declare -A ip_arr=(\n"
            printf "  [\"ip_addr\"]=\"%s\"\n", ip
            printf "  [\"connection_count\"]=%d\n", cnt[ip]
            printf "  [\"states\"]=\"%s\"\n", states[ip]
            printf "  [\"services\"]=\"%s\"\n", services[ip]
            printf ")\n"
        }
    }')"
    
    # 验证结果
    if declare -p ip_arr &> /dev/null; then
        echo "IP地址:${ip_arr["ip_addr"]}"
        echo "连接数:${ip_arr["connection_count"]}"
        echo "状态列表:${ip_arr["states"]}"
        echo "服务列表:${ip_arr["services"]}"
    else
        echo "未找到匹配的连接"
    fi
    
    json_data=$(cat <<EOF
    {
      "msg_type": "text",
      "content": {
        "text": "********** TCP连接警告 **********\\n\\nIP地址:\\n${ip_arr['ip_addr']}\\n\\n连接数:\\n${ip_arr['connection_count']}\\n\\n服务状态:\\n${ip_arr['states']}\\n服务:\\n${ip_arr['services']}"
      }
    }
    EOF
    )
    
    
    
    # if [ ${ip_arr["connection_count"]} -ge 500 ];then
    #     #echo "${ip_arr["connection_count"]},大于 500"
    #     curl -X POST -H "Content-Type: application/json" \
    #              -d '{"msg_type":"text","content":{"text":"Foreign_ip:'''${ip_arr["ip_addr"]}\\n'''连接数:'''${ip_arr["connection_count"]}\\n'''服务状态:'''${ip_arr["states"]}\\n'''服务:'''${ip_arr["services"]}\\n'''"}}' \
    #              https://open.feishu.cn/open-apis/bot/v2/hook/xxxx
    # fi
    
    
    # 判断连接数是否大于500
    if [ ${ip_arr["connection_count"]} -ge 500 ];then
        # 发送请求到飞书
        curl -X POST -H "Content-Type: application/json" -d "$json_data" "$feishu_hook"
    else
        echo "连接数小于500,不发送飞书通知"
    fi
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值