基于Go语言实现应用IP防火墙

 更新时间:2023年11月21日 13:54:09   作者:shura1014  
在公司里面经常会听到某应用有安全漏洞问题,没有做安全加固,IP防火墙就是一个典型的安全加固解决方案,下面我们就来学习一下如何使用go语言实现IP防火墙吧

简介

在公司里面经常会听到某应用有安全漏洞问题,没有做安全加固,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 main

import (
	"fmt"
	"net"
	"strings"
)

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"))

}

// 定义防火墙,保存规则nodes

type 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 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在不在设置的规则里

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框架里也是这么实现的

到此这篇关于基于Go语言实现应用IP防火墙的文章就介绍到这了,更多相关Go IP防火墙内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang的select多路复用及channel使用操作

    Golang的select多路复用及channel使用操作

    这篇文章主要介绍了Golang的select多路复用及channel使用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 如何解决goland,idea全局搜索快捷键失效问题

    如何解决goland,idea全局搜索快捷键失效问题

    这篇文章主要介绍了如何解决goland,idea全局搜索快捷键失效问题,快捷键失效,可能是快捷键冲突,也或者是快捷键被修改成其他了。在settings下查看快捷键是否被修改,下文详细介绍需要的朋友可以参考下
    2022-04-04
  • 详解在Go语言单元测试中如何解决文件依赖问题

    详解在Go语言单元测试中如何解决文件依赖问题

    现如今的 Web 应用程序往往采用 RESTful API 接口形式对外提供服务,后端接口直接向前端返回 HTML 文件的情况越来越少,所以在程序中操作文件的场景也变少了,在编写单元测试时,文件就成了被测试代码的外部依赖,本文就来讲解下测试过程中如何解决文件外部依赖问题
    2023-08-08
  • go语言中decimal的用法详解

    go语言中decimal的用法详解

    本文主要介绍了go语言中decimal的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Go实现自动解压缩包以及读取docx/doc文件内容详解

    Go实现自动解压缩包以及读取docx/doc文件内容详解

    在开发过程中,我们常常需要处理压缩包和文档文件。本文将介绍如何使用Go语言自动解压缩包和读取docx/doc文件,需要的可以参考一下
    2023-03-03
  • Go语言中JWT的创建和解析操作详解

    Go语言中JWT的创建和解析操作详解

    JWT的全名是Json web token,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,这篇文章主要介绍了在Go语言中JWT的创建和解析操作,感兴趣的同学可以参考下文
    2023-05-05
  • Go语言并发之Sync包的6个关键概念总结

    Go语言并发之Sync包的6个关键概念总结

    这篇文章主要为大家详细介绍了Go语言并发中Sync包的6个关键概念,文中的示例代码讲解详细,对我们深入学习Go语言有一定的帮助,需要的可以参考一下
    2023-05-05
  • Go雪花算法的作用领域及实现方法示例

    Go雪花算法的作用领域及实现方法示例

    这篇文章主要为大家介绍了Go雪花算法的作用领域及实现方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go每日一库之dateparse处理时间

    Go每日一库之dateparse处理时间

    不管什么时候,处理时间总是让人头疼的一件事情。今天要介绍的dateparse实现解析日期时间格式的字符串。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Golang算法问题之数组按指定规则排序的方法分析

    Golang算法问题之数组按指定规则排序的方法分析

    这篇文章主要介绍了Golang算法问题之数组按指定规则排序的方法,结合实例形式分析了Go语言数组排序相关算法原理与操作技巧,需要的朋友可以参考下
    2017-02-02

最新评论