基于Go語(yǔ)言實(shí)現(xiàn)應(yīng)用IP防火墻
簡(jiǎn)介
在公司里面經(jīng)常會(huì)聽(tīng)到某應(yīng)用有安全漏洞問(wèn)題,沒(méi)有做安全加固,IP防火墻就是一個(gè)典型的安全加固解決方案,只允許指定的ip段訪問(wèn)應(yīng)用,一般是內(nèi)網(wǎng)ip
本文主要講解go語(yǔ)言如何實(shí)現(xiàn)ip防火墻
標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)
其實(shí)go的net包以及有相應(yīng)的實(shí)現(xiàn),我們只需要簡(jiǎn)單應(yīng)用即可
源碼如下
// ParseCIDR parses s as a CIDR notation IP address and prefix length, // like "192.0.2.0/24" or "2001:db8::/32", as defined in // RFC 4632 and RFC 4291. // // It returns the IP address and the network implied by the IP and // prefix length. // For example, ParseCIDR("192.0.2.1/24") returns the IP address // 192.0.2.1 and the network 192.0.2.0/24. func ParseCIDR(s string) (IP, *IPNet, error)
意思就是我們可以設(shè)置一個(gè)IP段例如 192.0.2.1/24 那么192.0.2.1就會(huì)在這個(gè)范圍內(nèi),而 192.0.3.1 不在這個(gè)范圍內(nèi)應(yīng)該做相應(yīng)的處理
代碼實(shí)現(xiàn)
package main import ( "fmt" "net" "strings" ) func main() { ipWall := NewFireWall() // 設(shè)置可以訪問(wèn)應(yīng)用的ip段 ipWall.ParseNode("127.0.0.1") ipWall.ParseNode("192.0.2.1/24") ipWall.ParseNode("2001:db8::/32") // 可以支持ipv6 // 測(cè)試 fmt.Println("127.0.0.1", ipWall.Check("127.0.0.1")) fmt.Println("192.0.2.10", ipWall.Check("192.0.2.10")) fmt.Println("192.0.3.10", ipWall.Check("192.0.3.10")) fmt.Println("2001:db8::1", ipWall.Check("2001:db8::1")) fmt.Println("2001:db9::1", ipWall.Check("2001:db9::1")) } // 定義防火墻,保存規(guī)則nodes type FireWall struct { nodes []net.IPNet } func NewFireWall() *FireWall { return &FireWall{ nodes: make([]net.IPNet, 0), } } // 添加規(guī)則 func (b *FireWall) ParseNode(line string) { if !strings.Contains(line, "/") { parsedIP := net.ParseIP(line) if ipv4 := parsedIP.To4(); ipv4 != nil { // return ip in a 4-byte representation parsedIP = ipv4 } if parsedIP != nil { switch len(parsedIP) { case net.IPv4len: line += "/32" case net.IPv6len: line += "/128" } } } _, cidrNet, err := net.ParseCIDR(line) if err == nil { b.nodes = append(b.nodes, *cidrNet) } } // 檢查某個(gè)ip在不在設(shè)置的規(guī)則里 func (b *FireWall) Check(ip string) bool { for _, cidr := range b.nodes { remoteIP := net.ParseIP(ip) if cidr.Contains(remoteIP) { return true } } return false }
執(zhí)行以上代碼,輸出
127.0.0.1 true
192.0.2.10 true
192.0.3.10 false
2001:db8::1 true
2001:db9::1 false
以上就是ip防火墻的實(shí)現(xiàn)了,在gin框架里也是這么實(shí)現(xiàn)的
到此這篇關(guān)于基于Go語(yǔ)言實(shí)現(xiàn)應(yīng)用IP防火墻的文章就介紹到這了,更多相關(guān)Go IP防火墻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang的select多路復(fù)用及channel使用操作
這篇文章主要介紹了Golang的select多路復(fù)用及channel使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12如何解決goland,idea全局搜索快捷鍵失效問(wèn)題
這篇文章主要介紹了如何解決goland,idea全局搜索快捷鍵失效問(wèn)題,快捷鍵失效,可能是快捷鍵沖突,也或者是快捷鍵被修改成其他了。在settings下查看快捷鍵是否被修改,下文詳細(xì)介紹需要的朋友可以參考下2022-04-04詳解在Go語(yǔ)言單元測(cè)試中如何解決文件依賴問(wèn)題
現(xiàn)如今的?Web?應(yīng)用程序往往采用?RESTful?API?接口形式對(duì)外提供服務(wù),后端接口直接向前端返回?HTML?文件的情況越來(lái)越少,所以在程序中操作文件的場(chǎng)景也變少了,在編寫(xiě)單元測(cè)試時(shí),文件就成了被測(cè)試代碼的外部依賴,本文就來(lái)講解下測(cè)試過(guò)程中如何解決文件外部依賴問(wèn)題2023-08-08Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解
在開(kāi)發(fā)過(guò)程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用Go語(yǔ)言自動(dòng)解壓縮包和讀取docx/doc文件,需要的可以參考一下2023-03-03Go語(yǔ)言中JWT的創(chuàng)建和解析操作詳解
JWT的全名是Json web token,是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開(kāi)放標(biāo)準(zhǔn),這篇文章主要介紹了在Go語(yǔ)言中JWT的創(chuàng)建和解析操作,感興趣的同學(xué)可以參考下文2023-05-05Go語(yǔ)言并發(fā)之Sync包的6個(gè)關(guān)鍵概念總結(jié)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言并發(fā)中Sync包的6個(gè)關(guān)鍵概念,文中的示例代碼講解詳細(xì),對(duì)我們深入學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下2023-05-05Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例
這篇文章主要為大家介紹了Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Golang算法問(wèn)題之?dāng)?shù)組按指定規(guī)則排序的方法分析
這篇文章主要介紹了Golang算法問(wèn)題之?dāng)?shù)組按指定規(guī)則排序的方法,結(jié)合實(shí)例形式分析了Go語(yǔ)言數(shù)組排序相關(guān)算法原理與操作技巧,需要的朋友可以參考下2017-02-02