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

本文涉及的产品
云防火墙,500元 1000GB
简介: 使用Go构建应用级别的IP防火墙机制不仅能够为你的应用程序增加一层额外的安全性,还能够通过自定义中间件的方式让你有更多控制力,来决定哪些客户端可以或不可以访问你的服务。

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

package main

import (
    "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服务器。

使用Go构建应用级别的IP防火墙机制不仅能够为你的应用程序增加一层额外的安全性,还能够通过自定义中间件的方式让你有更多控制力,来决定哪些客户端可以或不可以访问你的服务。

目录
相关文章
|
4月前
|
监控 安全 Go
使用Go语言构建网络IP层安全防护
在Go语言中构建网络IP层安全防护是一项需求明确的任务,考虑到高性能、并发和跨平台的优势,Go是构建此类安全系统的合适选择。通过紧密遵循上述步骤并结合最佳实践,可以构建一个强大的网络防护系统,以保障数字环境的安全完整。
132 12
|
7月前
|
监控 Java Go
无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测
本文将介绍一种基于 Docker 多阶段构建的无侵入 Golang 应用观测方法,通过此方法用户无需对 Golang 应用源代码或者编译指令做任何改造,即可零成本为 Golang 应用注入可观测能力。
406 85
|
4月前
|
Java Shell Maven
【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package
在部署Java应用到Azure Container App时,构建镜像过程中出现错误:“./mvnw.cmd: No such file or directory”。尽管项目根目录包含mvnw和mvnw.cmd文件,但依然报错。问题出现在Dockerfile构建阶段执行`./mvnw dependency:go-offline`命令时,系统提示找不到可执行文件。经过排查,确认是mvnw文件内容异常所致。最终通过重新生成mvnw文件解决该问题,镜像成功构建。
170 1
|
5月前
|
NoSQL Go API
MCP 官方开源 Registry 注册服务:基于 Go 和 MongoDB 构建
作为 `registry` 项目的贡献者,我很高兴能参与这个社区驱动的开源项目,也期待它不断发展壮大。本文将对 `registry` 服务进行介绍,为项目的推广尽一份绵薄之力。
217 1
MCP 官方开源 Registry 注册服务:基于 Go 和 MongoDB 构建
|
5月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
5月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
7月前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
1826 4
|
7月前
|
Go API 定位技术
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
随着 MCP 的快速普及和广泛应用,MCP 服务器也层出不穷。大多数开发者使用的 MCP 服务器开发库是官方提供的 typescript-sdk,而作为 Go 开发者,我们也可以借助优秀的第三方库去开发 MCP 服务器,例如 ThinkInAIXYZ/go-mcp。 本文将详细介绍如何在 Go 语言中使用 go-mcp 库来开发一个查询 IP 信息的 MCP 服务器。
460 0
|
安全 Linux 应用服务中间件
在Linux中,包过滤防火墙与代理应用防火墙有什么区别?有哪些相应的产品?
在Linux中,包过滤防火墙与代理应用防火墙有什么区别?有哪些相应的产品?
|
机器学习/深度学习 安全 网络协议
Linux防火墙iptables命令管理入门
本文介绍了关于Linux防火墙iptables命令管理入门的教程,涵盖了iptables的基本概念、语法格式、常用参数、基础查询操作以及链和规则管理等内容。
454 73