最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GO實(shí)現(xiàn)基于命令行的簡(jiǎn)單IPS程序代碼

 更新時(shí)間:2024年12月28日 11:21:03   作者:星星貓  
本文介紹了入侵防御系統(tǒng)IPS的工作原理和實(shí)現(xiàn),IPS通過(guò)網(wǎng)絡(luò)流量監(jiān)控和實(shí)時(shí)響應(yīng),防止網(wǎng)絡(luò)攻擊,通過(guò)使用Go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的IPS示例程序,展示了如何獲取本地IP地址和探測(cè)網(wǎng)絡(luò)中其他設(shè)備的IP地址,包括如何定義和加載規(guī)則文件,以及如何檢測(cè)IP對(duì)相應(yīng)端口的訪(fǎng)問(wèn)是否達(dá)到規(guī)定閾值

入侵防御系統(tǒng)

IPS(Intrusion Prevention System)即入侵防御系統(tǒng),主要用于實(shí)時(shí)檢查和阻止網(wǎng)絡(luò)入侵。與入侵檢測(cè)系統(tǒng)(IDS)不同,IPS通常部署在網(wǎng)絡(luò)的關(guān)鍵路徑上,實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)流量,并在發(fā)現(xiàn)攻擊時(shí)立即采取響應(yīng)措施,如丟棄惡意數(shù)據(jù)包、封鎖攻擊源IP地址等。

IPS的工作原理

IPS通過(guò)直接嵌入到網(wǎng)絡(luò)流量中實(shí)現(xiàn)主動(dòng)防御。它通過(guò)一個(gè)網(wǎng)絡(luò)端口接收來(lái)自外部系統(tǒng)的流量,經(jīng)過(guò)檢查確認(rèn)其中不包含異常活動(dòng)或可疑內(nèi)容后,再通過(guò)另一個(gè)端口傳送到內(nèi)部系統(tǒng)中。有問(wèn)題的數(shù)據(jù)包以及所有來(lái)自同一數(shù)據(jù)流的后續(xù)數(shù)據(jù)包都會(huì)在IPS設(shè)備中被清除掉。

GO實(shí)現(xiàn)IPS

下面我們用 Go 語(yǔ)言編寫(xiě),一個(gè)可以在命令行中獲取并打印本地 IP 地址(基于常見(jiàn)網(wǎng)絡(luò)接口)的示例程序,這里主要是獲取 IPv4 地址進(jìn)行展示,示例代碼使用了標(biāo)準(zhǔn)庫(kù)中的 net 包:

獲取本地網(wǎng)絡(luò)接口上綁定的 IP 

package main

import (
    "fmt"
    "net"
)

func main() {
    addrs, err := net.InterfaceAddrs()
    if err!= nil {
        fmt.Printf("獲取網(wǎng)絡(luò)接口地址失敗: %v\n", err)
        return
    }

    for _, addr := range addrs {
        ipNet, ok := addr.(*net.IPNet)
        if ok &&!ipNet.IP.IsLoopback() && ipNet.IP.To4()!= nil {
            fmt.Println("IP地址:", ipNet.IP.String())
        }
    }
}

運(yùn)行

  1. 確保已經(jīng)安裝了 Go 環(huán)境(Go 1.10 及以上版本)。
  2. 將上述代碼保存到一個(gè)以 .go 為后綴的文件中,比如 ips.go。
  3. 打開(kāi)命令行,切換到該文件所在的目錄。
  4. 運(yùn)行命令 go run ips.go,程序就會(huì)執(zhí)行并輸出找到的本地非回環(huán)的 IPv4 地址信息。

也可編譯后運(yùn)行

go build ips.go

然后運(yùn)行生成的可執(zhí)行文件(在 Windows 上是 .exe 后綴的文件,在 Linux、macOS 等系統(tǒng)上就是普通的二進(jìn)制文件)也能看到相應(yīng)的 IP 地址輸出。

請(qǐng)注意:這里只是簡(jiǎn)單獲取本地網(wǎng)絡(luò)接口上綁定的 IP 示例

 對(duì)于IPS而言,他要檢測(cè)的是網(wǎng)絡(luò)中的流量(比如探測(cè)網(wǎng)絡(luò)中其他設(shè)備 IP 等)這需要進(jìn)一步擴(kuò)展代碼,例如利用 net.Dial 等去做網(wǎng)絡(luò)連接測(cè)試、IP 掃描等操作。

探測(cè)網(wǎng)絡(luò)中其他設(shè)備 IP

這里只是通過(guò)簡(jiǎn)單的 ICMP 即 ping 操作概念類(lèi)似的簡(jiǎn)單探測(cè)

package main

import (
    "fmt"
    "net"
    "os"
    "sync"
    "time"
)

func PingIP(ip string, wg *sync.WaitGroup, result chan<- string) {
    defer wg.Done()
    conn, err := net.DialTimeout("ip4:icmp", ip, time.Second*2)
    if err == nil {
        conn.Close()
        result <- ip
    }
}

func main() {
    if len(os.Args)!= 2 {
        fmt.Println("請(qǐng)輸入要掃描的網(wǎng)段,例如 192.168.1.0/24")
        return
    }
    _, ipnet, err := net.ParseCIDR(os.Args[1])
    if err!= nil {
        fmt.Printf("解析網(wǎng)段失敗: %v\n", err)
        return
    }

    var wg sync.WaitGroup
    result := make(chan string)

    for ip := ipnet.IP.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) {
        wg.Add(1)
        go PingIP(ip.String(), &wg, result)
    }

    go func() {
        wg.Wait()
        close(result)
    }()

    for aliveIP := range result {
        fmt.Println("存活I(lǐng)P:", aliveIP)
    }
}

func inc(ip net.IP) {
    for j := len(ip) - 1; j >= 0; j-- {
        ip[j]++
        if ip[j] > 0 {
            break
        }
    }
}

在命令行中使用這個(gè)擴(kuò)展版本時(shí),可以像這樣運(yùn)行(假設(shè)編譯后的可執(zhí)行文件名為 ips):

./ips 192.168.1.0/24

上述命令會(huì)嘗試去探測(cè)指定網(wǎng)段 192.168.1.0/24 內(nèi)的 IP 地址哪些是存活的(可以響應(yīng) ICMP 請(qǐng)求的,類(lèi)似 ping 通的概念),并打印出存活的 IP 地址。

增加規(guī)則文件(rules.json)

首先我們?cè)O(shè)定一個(gè)規(guī)則文件,用json的方式來(lái)保存規(guī)則

[
    {
        "id": "1001",
        "description": "SSH暴力破解檢測(cè)",
        "protocol": "tcp",
        "dst_port": 22,
        "action": "block",
        "threshold": 5,
        "time_window": 60
    },
    {
        "id": "1002",
        "description": "RDP暴力破解檢測(cè)",
        "protocol": "tcp",
        "dst_port": 3389,
        "action": "block",
        "threshold": 5,
        "time_window": 60
    },
    {
        "id": "1003",
        "description": "MySQL暴力破解檢測(cè)",
        "protocol": "tcp",
        "dst_port": 3306,
        "action": "block",
        "threshold": 5,
        "time_window": 60
    }
]

然后我們寫(xiě)一個(gè)go文件,來(lái)檢測(cè) IP 對(duì)相應(yīng)端口的訪(fǎng)問(wèn)是否達(dá)到規(guī)則中定義的暴力破解閾值情況

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net"
    "os"
    "path/filepath"
    "sync"
    "time"
)

// Rule結(jié)構(gòu)體表示一條安全規(guī)則
type Rule struct {
    ID          string  `json:"id"`
    Description string  `json:"description"`
    Protocol    string  `json:"protocol"`
    DstPort     int     `json:"dst_port"`
    Action      string  `json:"action"`
    Threshold   int     `json:"threshold"`
    TimeWindow  int     `json:"time_window"`
}

// LoadRules從文件加載安全規(guī)則
func LoadRules(filePath string) ([]*Rule, error) {
    content, err := ioutil.ReadFile(filePath)
    if err!= nil {
        return nil, fmt.Errorf("讀取規(guī)則文件失敗: %v", err)
    }
    var rules []*Rule
    err = json.Unmarshal(content, &rules)
    if err!= nil {
        return nil, fmt.Errorf("解析規(guī)則文件失敗: %v", err)
    }
    return rules, nil
}

// ConnectionRecord記錄IP的連接記錄(簡(jiǎn)化示例,僅記錄次數(shù))
type ConnectionRecord struct {
    mu         sync.Mutex
    connections map[string]int
}

func NewConnectionRecord() *ConnectionRecord {
    return &ConnectionRecord{
        connections: make(map[string]int),
    }
}

func (cr *ConnectionRecord) Record(ip net.IP, port int) {
    cr.mu.Lock()
    key := fmt.Sprintf("%s:%d", ip.String(), port)
    cr.connections[key]++
    cr.mu.Unlock()
}

func (cr *ConnectionRecord) CheckViolation(rules []*Rule) []*Rule {
    var violatedRules []*Rule
    cr.mu.Lock()
    now := time.Now()
    for _, rule := range rules {
        for key, count := range cr.connections {
            parts := strings.Split(key, ":")
            ip := net.ParseIP(parts[0])
            port := atoi(parts[1])
            if port == rule.DstPort && count >= rule.Threshold {
                // 這里簡(jiǎn)單判斷次數(shù)達(dá)到閾值就算違規(guī),實(shí)際可能需考慮時(shí)間窗口等更復(fù)雜邏輯細(xì)化
                violatedRules = append(violatedRules, rule)
            }
        }
    }
    cr.mu.Unlock()
    return violatedRules
}

func atoi(s string) int {
    n, _ := fmt.Sscanf(s, "%d", &n)
    return n
}

func main() {
    // 獲取當(dāng)前目錄下的rules.json作為配置文件路徑(可根據(jù)實(shí)際調(diào)整)
    currentDir, err := os.Getwd()
    if err!= nil {
        fmt.Printf("獲取當(dāng)前目錄失敗: %v\n", err)
        return
    }
    configFilePath := filepath.Join(currentDir, "rules.json")

    rules, err := LoadRules(configFilePath)
    if err!= nil {
        fmt.Printf("加載規(guī)則失敗: %v\n", err)
        return
    }

    targetIPNet := &net.IPNet{}
    _, targetIPNet, err = net.ParseCIDR("192.168.1.0/24")
    if err!= nil {
        fmt.Printf("解析目標(biāo)IP網(wǎng)段失敗: %v\n", err)
        return
    }

    record := NewConnectionRecord()

    // 模擬IP對(duì)內(nèi)網(wǎng)端口的連接訪(fǎng)問(wèn)(這里簡(jiǎn)單循環(huán)增加連接次數(shù)示例)
    for i := 0; i < 10; i++ {
        for ip := targetIPNet.IP.Mask(targetIPNet.Mask); targetIPNet.Contains(ip); inc(ip) {
            // 簡(jiǎn)單模擬多次訪(fǎng)問(wèn)各規(guī)則關(guān)注的端口,實(shí)際場(chǎng)景會(huì)根據(jù)真實(shí)網(wǎng)絡(luò)連接情況記錄
            for _, rule := range rules {
                record.Record(ip, rule.DstPort)
            }
        }
    }

    violatedRules := record.CheckViolation(rules)
    for _, violatedRule := range violatedRules {
        fmt.Printf("IP段內(nèi)存在疑似違反規(guī)則 %s 的情況,規(guī)則描述:%s\n", violatedRule.ID, violatedRule.Description)
    }
}

func inc(ip net.IP) {
    for j := len(ip) - 1; j >= 0; j-- {
        ip[j]++
        if ip[j] > 0 {
            break
        }
    }
}
  1. 定義規(guī)則結(jié)構(gòu)體和相關(guān)操作函數(shù):
  • 首先定義了 Rule 結(jié)構(gòu)體,其字段與 JSON 格式的規(guī)則文件中的各個(gè)屬性相對(duì)應(yīng),用于表示一條安全規(guī)則。
  • LoadRules 函數(shù)用于讀取指定路徑的 JSON 規(guī)則文件,并將其解析為 Rule 結(jié)構(gòu)體的切片,若讀取或解析過(guò)程出現(xiàn)錯(cuò)誤則返回相應(yīng)的錯(cuò)誤信息。
  1. 定義連接記錄結(jié)構(gòu)體及相關(guān)方法:
  • ConnectionRecord 結(jié)構(gòu)體用于記錄 IP 地址對(duì)不同端口的連接情況,內(nèi)部使用一個(gè)互斥鎖(sync.Mutex)來(lái)保證并發(fā)安全,通過(guò) Record 方法記錄每個(gè) IP 和端口的連接次數(shù),使用 CheckViolation 方法來(lái)檢查當(dāng)前的連接記錄是否違反了給定的規(guī)則(這里只是簡(jiǎn)單根據(jù)連接次數(shù)是否達(dá)到閾值判斷,實(shí)際可進(jìn)一步完善考慮時(shí)間窗口等更多細(xì)節(jié))。
  1. 主函數(shù)邏輯:
  • 先獲取當(dāng)前目錄下規(guī)則配置文件(rules.json)的路徑(可按需修改為其他路徑),調(diào)用 LoadRules 函數(shù)加載規(guī)則列表。
  • 接著解析要檢測(cè)的目標(biāo) IP 網(wǎng)段(示例中為 192.168.1.0/24,可以根據(jù)實(shí)際情況更改),創(chuàng)建一個(gè) ConnectionRecord 實(shí)例來(lái)記錄連接情況。
  • 然后通過(guò)循環(huán)模擬 IP 對(duì)內(nèi)網(wǎng)各端口的訪(fǎng)問(wèn)(這里只是簡(jiǎn)單循環(huán)增加訪(fǎng)問(wèn)次數(shù)示意,實(shí)際需要結(jié)合真實(shí)的網(wǎng)絡(luò)連接情況來(lái)記錄),并調(diào)用 ConnectionRecord 的 Record 方法記錄每次的訪(fǎng)問(wèn)情況。
  • 最后調(diào)用 ConnectionRecord 的 CheckViolation 方法檢查是否有違反規(guī)則的情況,若有則打印出相應(yīng)的違規(guī)規(guī)則信息。

注意

這里的代碼僅是拋磚引玉,其中的規(guī)則檢查邏輯,尤其是針對(duì)時(shí)間窗口的處理比較簡(jiǎn)化,在實(shí)際應(yīng)用場(chǎng)景中,你可能需要精確地記錄每個(gè)連接的時(shí)間戳,并按照時(shí)間窗口準(zhǔn)確判斷是否在指定時(shí)間段內(nèi)達(dá)到了閾值等情況,以實(shí)現(xiàn)更符合實(shí)際需求的檢測(cè)邏輯。

模擬的 IP 訪(fǎng)問(wèn)場(chǎng)景也非常簡(jiǎn)單,只是為了演示功能而進(jìn)行的簡(jiǎn)單循環(huán)增加訪(fǎng)問(wèn)次數(shù),實(shí)際需要對(duì)接真實(shí)的網(wǎng)絡(luò)流量監(jiān)控等相關(guān)機(jī)制來(lái)準(zhǔn)確記錄 IP 的訪(fǎng)問(wèn)情況。

到此這篇關(guān)于GO實(shí)現(xiàn)基于命令行的簡(jiǎn)單IPS程序代碼的文章就介紹到這了,更多相關(guān)GO實(shí)現(xiàn)基于命令行的簡(jiǎn)單IPS內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GoLang編程必備:GoFrame?GoLand插件介紹

    GoLang編程必備:GoFrame?GoLand插件介紹

    掌握GoLang編程必備工具,我們來(lái)深入了解GoFrame?GoLand插件,這個(gè)小巧但強(qiáng)大的插件將極大提升你的開(kāi)發(fā)效率,讓代碼流暢如行云流水,一起跟隨本指南,解鎖更智能的編程之旅!
    2023-12-12
  • Go語(yǔ)言中interface語(yǔ)法與使用詳解

    Go語(yǔ)言中interface語(yǔ)法與使用詳解

    Go語(yǔ)言里面設(shè)計(jì)最精妙的應(yīng)該算interface,它讓面向?qū)ο?內(nèi)容組織實(shí)現(xiàn)非常的方便,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中interface語(yǔ)法與使用的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Go語(yǔ)言CSP并發(fā)模型實(shí)現(xiàn)MPG

    Go語(yǔ)言CSP并發(fā)模型實(shí)現(xiàn)MPG

    這篇文章主要為大家介紹了Go語(yǔ)言CSP并發(fā)模型實(shí)現(xiàn)MPG圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Redis?BloomFilter布隆過(guò)濾器原理與實(shí)現(xiàn)

    Redis?BloomFilter布隆過(guò)濾器原理與實(shí)現(xiàn)

    你在開(kāi)發(fā)或者面試過(guò)程中,有沒(méi)有遇到過(guò)?海量數(shù)據(jù)需要查重,緩存穿透怎么避免等等這樣的問(wèn)題呢?下面這個(gè)東西超棒,好好了解下,面試過(guò)關(guān)斬將,凸顯你的不一樣
    2022-10-10
  • golang等待觸發(fā)事件的實(shí)例

    golang等待觸發(fā)事件的實(shí)例

    這篇文章主要介紹了golang等待觸發(fā)事件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 基于go+vue實(shí)現(xiàn)的golang每日新聞數(shù)據(jù)瀏覽與檢索平臺(tái)(推薦)

    基于go+vue實(shí)現(xiàn)的golang每日新聞數(shù)據(jù)瀏覽與檢索平臺(tái)(推薦)

    gonews是基于 go+vue 實(shí)現(xiàn)的golang每日新聞瀏覽與檢索平臺(tái),本文通過(guò)實(shí)例代碼給大家講解,介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-01-01
  • goland把go項(xiàng)目打包進(jìn)docker鏡像的全過(guò)程記錄

    goland把go項(xiàng)目打包進(jìn)docker鏡像的全過(guò)程記錄

    golang編譯的應(yīng)用是不需要依賴(lài)其他運(yùn)行環(huán)境的,下面這篇文章主要給大家介紹了關(guān)于goland把go項(xiàng)目打包進(jìn)docker鏡像的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Golang實(shí)現(xiàn)程序優(yōu)雅退出的方法詳解

    Golang實(shí)現(xiàn)程序優(yōu)雅退出的方法詳解

    項(xiàng)目開(kāi)發(fā)過(guò)程中,隨著需求的迭代,代碼的發(fā)布會(huì)頻繁進(jìn)行,在發(fā)布過(guò)程中,Golang如何讓程序做到優(yōu)雅的退出?本文就來(lái)詳細(xì)為大家講講
    2022-06-06
  • 詳解Go語(yǔ)言中數(shù)組,切片和映射的使用

    詳解Go語(yǔ)言中數(shù)組,切片和映射的使用

    Arrays (數(shù)組), Slices (切片) 和 Maps (映射) 是常見(jiàn)的一類(lèi)數(shù)據(jù)結(jié)構(gòu)。這篇文章將為大家詳細(xì)介紹一下Go語(yǔ)言中數(shù)組,切片和映射的使用,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • Go語(yǔ)言中的map擴(kuò)容機(jī)制

    Go語(yǔ)言中的map擴(kuò)容機(jī)制

    Go語(yǔ)言中的map是一種高效的數(shù)據(jù)結(jié)構(gòu),其擴(kuò)容機(jī)制確保了在大數(shù)據(jù)量情況下的性能,本文介紹了包括擴(kuò)容觸發(fā)條件、擴(kuò)容過(guò)程和漸進(jìn)式擴(kuò)容,感興趣的可以了解一下
    2024-12-12

最新評(píng)論

汕头市| 科尔| 汝南县| 海兴县| 宁陵县| 海盐县| 阳西县| 资溪县| 固阳县| 东莞市| 理塘县| 南通市| 嘉鱼县| 静海县| 商城县| 璧山县| 广河县| 双城市| 武冈市| 桦甸市| 清流县| 开远市| 文安县| 皮山县| 同仁县| 安塞县| 宁河县| 英吉沙县| 万载县| 麻城市| 蓬安县| 郑州市| 静安区| 晴隆县| 图片| 轮台县| 清原| 定结县| 元阳县| 新密市| 商城县|