主要的网站开发技术,一个网站做seo,重庆建设网站公司哪家好,上门做美容的网站简介
在公司里面经常会听到某应用有安全漏洞问题#xff0c;没有做安全加固#xff0c;IP防火墙就是一个典型的安全加固解决方案#xff0c;只允许指定的ip段访问应用#xff0c;一般是内网ip
本文主要讲解go语言如何实现ip防火墙
标准库实现
其实go的net包以及有相应的…简介
在公司里面经常会听到某应用有安全漏洞问题没有做安全加固IP防火墙就是一个典型的安全加固解决方案只允许指定的ip段访问应用一般是内网ip
本文主要讲解go语言如何实现ip防火墙
标准库实现
其实go的net包以及有相应的实现我们只需要简单应用即可
源码如下
// 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)意思就是我们可以设置一个IP段例如 192.0.2.1/24 那么192.0.2.1就会在这个范围内而 192.0.3.1 不在这个范围内应该做相应的处理
代码实现
package mainimport (fmtnetstrings
)func main() {ipWall : NewFireWall()// 设置可以访问应用的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))}// 定义防火墙保存规则nodestype FireWall struct {nodes []net.IPNet
}func NewFireWall() *FireWall {return FireWall{nodes: make([]net.IPNet, 0),}
}// 添加规则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 representationparsedIP ipv4}if parsedIP ! nil {switch len(parsedIP) {case net.IPv4len:line /32case net.IPv6len:line /128}}}_, cidrNet, err : net.ParseCIDR(line)if err nil {b.nodes append(b.nodes, *cidrNet)}
}// 检查某个ip在不在设置的规则里func (b *FireWall) Check(ip string) bool {for _, cidr : range b.nodes {remoteIP : net.ParseIP(ip)if cidr.Contains(remoteIP) {return true}}return false
}
执行以上代码输出
127.0.0.1 true
192.0.2.10 true
192.0.3.10 false
2001:db8::1 true
2001:db9::1 false以上就是ip防火墙的实现了在gin框架里也是这么实现的 欢迎关注学习不迷路