首页 > 其他分享 >使用GO为启明防火墙添加黑名单

使用GO为启明防火墙添加黑名单

时间:2023-08-18 14:25:05浏览次数:34  
标签:启明 return string err nil fmt req 防火墙 GO

package main

import (
	 "bytes"
	 "encoding/json"
	"fmt"
	 "net/http"
	 "crypto/tls"
	"net/url"
	"strings"
	"regexp"
	"bufio"
	"os"
)

var (
	//client   *http.Client
	cookie   *http.Cookie
)

func sendPostRequest(url string, data map[string]string) (map[string]interface{}, error) {
	jsonData, err := json.Marshal(data)
	if err != nil {
		return nil, fmt.Errorf("JSON marshaling error: %v", err)
	}

	tr := &http.Transport{
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
	}

	client := &http.Client{Transport: tr}

	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		return nil, fmt.Errorf("Request creation error: %v", err)
	}

	req.Header.Set("Content-Type", "application/json")

	resp, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("Request error: %v", err)
	}
	defer resp.Body.Close()
	//保存cookie
	cookie = resp.Cookies()[0]

	var response map[string]interface{}
	err = json.NewDecoder(resp.Body).Decode(&response)
	if err != nil {
		return nil, fmt.Errorf("JSON decoding error: %v", err)
	}
	return response, nil
}

func Login2Fw(url, user, pwd string) (string, error) {
	data := map[string]string{
		"user": user,
		"pwd":  pwd,
	}

	response, err := sendPostRequest(url, data)
	if err != nil {
		return "", err
	}

	result, resultExists := response["result"].(bool)
	
	if !result {
		return "", fmt.Errorf("Result field not found in response")
	}
	authorization,resultExists:= response["authorization"].(string)
	if !resultExists {
		return "", fmt.Errorf(" authorization field not found in response")
	}
	return authorization, nil
}


func EncodeString(input string) string {
	encoded := url.QueryEscape(input)
	return encoded
}


func sendBanRequest(url , authorization string, requestBody map[string]interface{}) (bool, error) {
	jsonData, err := json.Marshal(requestBody)
	if err != nil {
		return false, fmt.Errorf("JSON marshaling error: %v", err)
	}

	tr := &http.Transport{
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
	}

	client := &http.Client{Transport: tr}

	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		return false, fmt.Errorf("Request creation error: %v", err)
	}

	req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
	req.Header.Set("Authorization", authorization)
	req.Header.Set("Accept", "application/json, text/javascript, */*; q=0.01")
	req.Header.Set("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2")
	req.Header.Set("Accept-Encoding", "gzip, deflate")
	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/116.0")

	req.Header.Set("Sec-Fetch-Dest", "empty")
	req.Header.Set("Sec-Fetch-Mode", "cors")
	req.Header.Set("Sec-Fetch-Site", "same-origin")
	req.Header.Set("Te", "trailers")
	req.AddCookie(cookie)

	resp, err := client.Do(req)
	if err != nil {
		return false, fmt.Errorf("Request error: %v", err)
	}
	defer resp.Body.Close()

	
	var response map[string]interface{}
	err = json.NewDecoder(resp.Body).Decode(&response)
	if err != nil {
		return false, fmt.Errorf("JSON decoding error: %v", err)
	}

	result, resultExists := response["result"].(bool)
	if !resultExists {
		return false, fmt.Errorf("Result field not found in response")
	}

	return result, nil
}


func main() {
	url := "https://x.x.x.x/API/login"
	user := "username"
	pwd := "password"
	banurl:= "https://x.x.x.x/API/black_list"

	authorization, err := Login2Fw(url, user, pwd)
	if err != nil {
		fmt.Println("Error:", err,authorization)
		return
	}
    

    IpList := generateIpList()
	for _,ip :=range IpList{
		fmt.Println("准备封禁IP: ",ip)
		requestBody := map[string]interface{}{
			"ip_type": "2",
			"bl_ip_name": ip,
			"timeout": "0",
			"bl_grp_profile":"xxx", 
			"time_cfg_type":"0",
			"valid_time_type":"0"}
		
		success, err := sendBanRequest(banurl,authorization,requestBody)
		if err != nil {
			fmt.Println("Error:", err)
			return
		}
	
		if success {
			fmt.Println("封禁IP: ",ip,"成功")
		} else {
			fmt.Println("封禁IP: ",ip,"失败")
		}
	
	
	}
	

}





func generateIpList() []string {
	// 读取 InputList.txt
	inputFilePath := "InputList.txt"
	inputLines, err := readLines(inputFilePath)
	if err != nil {
		fmt.Println("Error reading InputList.txt:", err)
		return nil
	}

	// 过滤并处理行
	filteredLines := filterAndProcessLines(inputLines)

	// 读取 WhiteList.txt
	whiteListFilePath := "WhiteList.txt"
	whiteList, err := readLines(whiteListFilePath)
	if err != nil {
		fmt.Println("Error reading WhiteList.txt:", err)
		return nil
	}

	// 过滤 WhiteList
	filteredOutput := filterWhiteList(filteredLines, whiteList)
	fmt.Println("获取到有效IP,准备封禁IP")
	return filteredOutput
}

func readLines(filePath string) ([]string, error) {
	file, err := os.Open(filePath)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	var lines []string
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		lines = append(lines, scanner.Text())
	}

	if err := scanner.Err(); err != nil {
		return nil, err
	}

	return lines, nil
}

func filterAndProcessLines(lines []string) []string {
	var filteredLines []string

	for _, line := range lines {
		// 去除前后空格和 tab
		parts := extractIPv4Parts(line)
		for _, part := range parts {
		// 过滤不符合 IPv4 格式的行
		fmt.Println("已处理输入文本,获取到原始IP: ",part)
			if isIPv4(part) {
				if !strings.HasSuffix(part, ".0") && !strings.HasSuffix(part, ".255") {
					filteredLines = append(filteredLines, part)
				}
				
			} 
		}
	}
	return filteredLines
}

func isIPv4(input string) bool {
	re := regexp.MustCompile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`)
	return re.MatchString(input)
}

func filterWhiteList(lines []string, whiteList []string) []string {
	var filteredOutput []string

	for _, line := range lines {
		if !contains(whiteList, line) {
			filteredOutput = append(filteredOutput, line)
		}
	}

	return filteredOutput
}

func contains(slice []string, element string) bool {
	for _, e := range slice {
		if e == element {
			return true
		}
	}
	return false
}



func extractIPv4Parts(input string) []string {
	re := regexp.MustCompile(`\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}`)
	return re.FindAllString(input, -1)
}

标签:启明,return,string,err,nil,fmt,req,防火墙,GO
From: https://www.cnblogs.com/yangras/p/17640356.html

相关文章

  • 这几点,RunnerGo领先太多了
    在用jmeter做性能测试时想看完整一点的测试报告,想配置阶梯模式来压测,想配置不同的接口并发这些都需要安装插件并且影响机器性能,想做自动化测试还得放到jenkins,这些配置起来太繁琐。今天给大家推荐一款测试平台RunnerGo,内置各种测试工具解决这些痛点。不需要扩展插件即可实时查看......
  • K8s 部署Django项目
    K8s部署Django项目K8s作为目前主流互联网使用技术栈,本次介绍如何将Django项目部署到Kubernetes中。项目代码使用前面几章节定义的Django文件上传代码,使用上一章打包好的镜像,接下来就是部署到K8s中,请往下看:DeploymentyamlapiVersion:apps/v1kind:Deploymentmetadata:......
  • 如何运行一个Go程序
    学习自:golang如何运行-Golang-PHP中文网 1、Go程序内容packagemainimport"fmt"funcmain(){fmt.Println("Hello,world");}保存为hello.go2、在cmd中进入hello.go所在目录下cdC:\Users\Le\Desktop\go3、运行gorunxxx.gogorunhello.go ......
  • Django 文件上传项目部署
    Django文件上传项目部署相关文件准备DockerfileDjango项目的主要文件是manage.py,并且你的依赖包列表在一个名为requirements.txt的文件中,根据你的实际项目结构和需求。#使用一个基础镜像#最小版镜像通常只包含了Python解释器和一些基本的系统工具FROMpython:3.8.10-sli......
  • Django对不确定多条件进行求交集搜索
    使用Django的Q方法创建搜索条件:name=request.GET.get('name')pages=request.GET.get('pages')operator=request.GET.get('operator')date1=request.GET.get('date1')date2=re......
  • MongoDB 审计
    1、启用和配置审计的输出格式使用--auditDestination配置项来启用MongoDB审计和指定输出的审计事件。01、审计日志输出到syslog,如:mongod--dbpath/var/lib/mongo--auditDestinationsyslog或者,在MongoDB配置文件设置,如下:auditLog:destination:syslog02、审计日志......
  • Google将在今年秋季大力推出下一代人工智能产品Gemini
    您的关注是对我最大的支持......
  • Ubuntu 开机自启动Django程序
    在Ubuntu系统中设置开机启动一个命令,如pythonmanage.pyrunserver0.0.0.0:8000来启动Django服务器,可以通过以下步骤实现:创建一个SystemdService文件:打开终端并使用文本编辑器(例如nano或vim)创建一个SystemdService文件,比如django_app.service:bashCopycodesudona......
  • CentOS7下部署Django项目详细操作步骤
    部署是基于:centos7+nginx+uwsgi+python3+django之上做的软件版本详细介绍,纯净操作系统:Centos7.0 Python版本:python3.6Django版本:django2.0.6本文包括以下几个部分内容:㈠、服务器环境部署详细步骤㈡、本地项目搬迁到服务器㈢、Django后台样式丢失解决办法㈣、Django开启S......
  • Python学习之十七_django的入门
    前言Python学习了一周,慢慢总结摸索.自己还是有多不会的地方.感慨这些年浪费的时间.所有的时间都是选择大于努力.努力最多感动自己.生活是需要的是正确的选择.平凡的实在人太难在一个固化的社会生存.共勉.安装因为安装的是社区版.所以与专业版不太一样.这次学习主......