Go 语言实现基于 IP 白名单的 RPC/TCP 访问控制

认真发呆
认真发呆
发布时间:2026-10-14 | 4人浏览过
原创

在构建网络服务时,简单的 IP 和网段判断是保障安全的有效手段。通过维护一个包含允许连接的 IP 列表(支持单 IP 及 CIDR 网段),服务端可在建立 TCP 连接初期进行校验,从而阻止非授权设备的访问。

实现原理与准备

该方法的核心逻辑在于监听 TCP 端口后,获取每一个新连接的客户端远程地址(RemoteAddr)。通过 net.ParseIP 将其标准化后,与预配置的白名单列表逐一比对。白名单字符串通常以逗号分隔,既包含纯 IPv4/IPv6 地址,也可包含形如 192.168.1.0/28 的子网掩码表示法。

第 1 步:定义白名单与启动监听

首先,在一个字符串变量中配置允许的 IP 列表,并使用 net.Listen 启动 TCP 服务。这一步骤确立了服务的入口点和安全检查的基础数据。

package main
import(
	"net"
	"fmt"
	"time"
	"strings"
)
func main(){
	// 定义允许的 IP 数组,支持单个 IP 和 CIDR 格式
	IP_ARRAY := "192.168.1.234,192.168.1.47,192.168.2.0/28"
	servPort:=":7272"
	l,err := net.Listen( "tcp",servPort )
	if err != nil {
		fmt.Printf( "Listen is error" )
		return
	}
	// 将白名单字符串拆分为切片
	allowList :=strings.Split( IP_ARRAY,"," )
	...
}

第 2 步:循环接受连接并提取 IP

在无限循环中调用 l.Accept() 等待客户端接入。一旦连接成功,立即提取其远程地址,并通过 strings.Split 去除端口号部分,仅保留 IP 地址字符串,最后使用 net.ParseIP 转换为可比较的二进制 IP 结构。

	for{ 
		conn,err:=l.Accept()
		if err != nil {
			fmt.Printf( "start connect  is error" )
			return
		}
		ipAddr:=conn.RemoteAddr()
		Addr := strings.Split( ipAddr.String(), ":")
		rAddr := net.ParseIP( Addr[0] )
		var authorized bool = false
...

第 3 步:执行 IP 匹配验证

遍历白名单列表中的每一项。程序优先尝试使用 net.ParseCIDR 解析是否为网段。如果解析失败(说明是单 IP),则回退使用 net.ParseIP 并进行精确相等比较;如果解析成功,则使用 ipNet.Contains 检查客户端 IP 是否落在该子网范围内。只要有一项匹配成功,即标记为授权状态。

		for v := range allowList{
			_,ipNet,err := net.ParseCIDR( allowList[v] )
			if err != nil{
				// 若为非 CIDR 格式,按单 IP 处理
				ipHost := net.ParseIP( allowList[v])
				if ipHost != nil{
					if ipHost.Equal( rAddr ) {
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表