基于Go語言實現(xiàn)應(yīng)用IP防火墻
簡介
在公司里面經(jīng)常會聽到某應(yīng)用有安全漏洞問題,沒有做安全加固,IP防火墻就是一個典型的安全加固解決方案,只允許指定的ip段訪問應(yīng)用,一般是內(nèi)網(wǎng)ip
本文主要講解go語言如何實現(xiàn)ip防火墻
標(biāo)準(zhǔn)庫實現(xiàn)
其實go的net包以及有相應(yīng)的實現(xià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è)置一個IP段例如 192.0.2.1/24 那么192.0.2.1就會在這個范圍內(nèi),而 192.0.3.1 不在這個范圍內(nèi)應(yīng)該做相應(yīng)的處理
代碼實現(xiàn)
package main
import (
"fmt"
"net"
"strings"
)
func main() {
ipWall := NewFireWall()
// 設(shè)置可以訪問應(yīng)用的ip段
ipWall.ParseNode("127.0.0.1")
ipWall.ParseNode("192.0.2.1/24")
ipWall.ParseNode("2001:db8::/32") // 可以支持ipv6
// 測試
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)
}
}
// 檢查某個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防火墻的實現(xiàn)了,在gin框架里也是這么實現(xiàn)的
到此這篇關(guān)于基于Go語言實現(xiàn)應(yīng)用IP防火墻的文章就介紹到這了,更多相關(guān)Go IP防火墻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go和RabbitMQ構(gòu)建高效的消息隊列系統(tǒng)
本文主要介紹了使用Go語言和RabbitMQ搭建一個簡單的消息隊列系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Golang import本地包和導(dǎo)入問題相關(guān)詳解
這篇文章主要介紹了Golang import本地包和導(dǎo)入問題相關(guān)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
在ubuntu下安裝go開發(fā)環(huán)境的全過程
Go語言是谷歌公司開發(fā)的編程語言,雖然安裝和配置go很簡單,但是很多初學(xué)者在第一次安裝go環(huán)境時會遇到各種坑,下面這篇文章主要給大家介紹了關(guān)于在ubuntu下安裝go開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
Golang 實現(xiàn)分片讀取http超大文件流和并發(fā)控制
這篇文章主要介紹了Golang 實現(xiàn)分片讀取http超大文件流和并發(fā)控制,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Golang?range?slice?與range?array?之間的區(qū)別
這篇文章主要介紹了Golang?range?slice?與range?array?之間的區(qū)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07

