Go 语言实现基于 IP 白名单的 RPC/TCP 访问控制
在构建网络服务时,简单的 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 ) {
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









