Go语言中实现应用IP防火墙

简介

在公司里面经常会听到某应用有安全漏洞问题,没有做安全加固,IP防火墙就是一个典型的安全加固解决方案,只允许指定的ip段访问应用,一般是内网ip

本文主要讲解go语言如何实现ip防火墙

标准库实现

其实go的net包以及有相应的实现,我们只需要简单应用即可

源码如下

go 复制代码
// 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 不在这个范围内应该做相应的处理

代码实现

go 复制代码
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
}

执行以上代码,输出

text 复制代码
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框架里也是这么实现的


欢迎关注,学习不迷路!

相关推荐
kimnoic7 分钟前
Python中使用封装类还是函数以及它们的区别
开发语言·python
代码什么用7 分钟前
Java Web 21-22
java·开发语言·web
青柠之夏cc12 分钟前
Python Java PHP底层对比:内存并发性能全解析
开发语言·python·线程
半亩码田17 分钟前
C#转Python第5.1篇:异步编程:asyncio vs async/await,语法相似但机制不同
开发语言·python·c#
西瓜很甜哟30 分钟前
golang实现大文件分片上传
后端·golang·html
LMT_Lanmantech42 分钟前
MATLAB合规管理:如何避免侵权赔偿和审计风险
开发语言·matlab·信息可视化
言乐61 小时前
PythonLOLM自动生成复盘报告模型
开发语言·前端·数据库·人工智能·python
霸道流氓气质1 小时前
HashiCorp Vault 与云 KMS 入门实战:动态密钥、SecretLeaseContainer 与 Java 集成完整指南
java·开发语言
水水不水啊1 小时前
告别切换N个窗口调试:我用 Python + WebView 做了款现代化串口助手(含 TCP/UDP、波形、协议解析)
python·tcp/ip·udp
论文复现现场1 小时前
DeepSeek V4.1 Flash 各平台价格怎么比?缓存、峰谷计费与 Python 成本计算
开发语言·python·缓存·大模型·成本优化·deepseek