当前位置: 首页 > news >正文

在Go中构建应用级IP防火墙机制

构建应用级IP防火墙机制可以通过在应用层面进行请求过滤来实现。在Go语言中,这通常意味着编写中间件,该中间件会检查进入应用程序的每个请求的IP地址,并决定允许或拒绝该请求。

package mainimport ("fmt""log""net""net/http"
)// IPFilterMiddleware 创建一个新的中间件实例来管理IP访问策略。
type IPFilterMiddleware struct {// 黑名单模式或白名单模式,默认为黑名单。blacklist bool// 允许或阻止的IP列表ips map[string]bool
}// NewIPFilterMiddleware 初始化IP过滤中间件。
func NewIPFilterMiddleware(blacklistMode bool) *IPFilterMiddleware {return &IPFilterMiddleware{blacklist: blacklistMode,ips:       make(map[string]bool),}
}// AddIP 添加IP到列表中。
func (m *IPFilterMiddleware) AddIP(ip string) {m.ips[ip] = true
}// RemoveIP 从列表中移除IP。
func (m *IPFilterMiddleware) RemoveIP(ip string) {delete(m.ips, ip)
}// Middleware 作为HTTP中间件函数。
func (m *IPFilterMiddleware) Middleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {ip, _, err := net.SplitHostPort(r.RemoteAddr)if err != nil {http.Error(w, "Internal Server Error", http.StatusInternalServerError)return}if m.blacklist {// 黑名单模式:如果IP在黑名单中,则拒绝。if m.ips[ip] {http.Error(w, "Forbidden", http.StatusForbidden)return}} else {// 白名单模式:如果IP不在白名单中,则拒绝。if !m.ips[ip] {http.Error(w, "Forbidden", http.StatusForbidden)return}}// 继续执行其他中间件或最终处理程序next.ServeHTTP(w, r)})
}func main() {// 初始化IP过滤中间件,true表示黑名单模式ipFilter := NewIPFilterMiddleware(true)// 添加一些IP到黑名单ipFilter.AddIP("192.168.1.1")ipFilter.AddIP("10.0.0.1")// 设置HTTP服务器mux := http.NewServeMux()mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "Hello World!")})// 应用IP过滤中间件filteredHandler := ipFilter.Middleware(mux)log.Println("Server is running on :8080")if err := http.ListenAndServe(":8080", filteredHandler); err != nil {log.Fatalf("Unable to start server: %s\n", err)}
}
​
 
 

在这个示例中,我们创建了一个 IPFilterMiddleware结构体,这个结构体能够让你定义一个IP列表以及是将这个列表作为黑名单还是白名单进行处理。IP列表是作为一个 map来存储IP,其值表示IP的存在与否。

在 Middleware函数中,我们定义了一个闭包,这个闭包会被每个进入的HTTP请求所调用。闭包内部我们检查请求的IP地址,根据是黑名单还是白名单模式来决定采取行动。如果是黑名单模式,并且请求IP在黑名单中,或者是白名单模式,并且请求IP不在白名单中,这个请求将被拒绝,并返回HTTP状态码403(Forbidden)。否则,请求会被传递到链中的下一个处理程序(可能是另一个中间件或者是最终的处理函数)。

在 main函数中,我们设置了服务器和中间件,并启动HTTP服务器。

http://www.gsyq.cn/news/8950.html

相关文章:

  • PCIe 8.0 v0.3草案公布:SSD硬盘能飙1TB/s速度
  • 用 R 语言实现验证码识别
  • Composer在PHP项目中的手动类自动加载策略
  • 2025-2026-1 20231301 《信息安全设计》第二周学习总结
  • 完整教程:第7.9节:awk语言 nextfile 语句
  • 详细介绍:导师推荐毕设:基于SpringBoot+Vue的中小企业进销存管理系统设计
  • HarmonyOS之UIContext - 实践
  • 深入解析:C语言:猜数字游戏
  • US$29 Vag R250 VW Audi Dashboard Programmer Free Shipping
  • 标题:分享一个值得推荐的免费云服务——阿贝云
  • PPT2Note使用说明
  • 详细介绍:Flink-新增 Kafka source 引发状态丢失导致启动失败
  • DDD - 概念复习
  • CSP-J1S1_2025
  • 基于ThinkPHP实现动态ZIP压缩包的生成
  • 完整教程:还在为第三方包 bug 头疼?patch-package 让你轻松打补丁!
  • Kubernetes(k8s)高可用性集群的构建
  • 在CentOS环境下升级GCC编译器
  • Chapter 4 Shapes and Texts
  • Twitter舆情裂变链:指纹云手机跨账号协同机制提升互动率200% - 教程
  • 2025年9月底总结
  • 技术文章
  • 深入解析:AutoGPT原理与实践:构建能“自主完成任务”的AI智能体
  • dolphindb vscode更改连接配置的操作步骤 - 详解
  • 基于Redisson和自定义注解的分布式锁实现策略
  • CCPC2025网络赛 游记
  • 深入解析:Python进阶第三方库之Numpy
  • 17.生成器和推导式 - 教程
  • 《建筑的永恒之道》第 27 章:道之核心
  • Linux命令大全(档案管理)