Help us shape the future of Go! Take the 2026 Go Developer Survey

allowlist

package
v0.1.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 21, 2026 License: Apache-2.0 Imports: 6 Imported by: 0

Documentation

Overview

Package allowlist 为主机名与 IP 地址提供拉取白名单,供 ofd-server 使用。

服务会按调用方给的 URL 拉取待转换的文档,也会按预注册的地址投递通知。这两个 方向如果不做限制,调用方就能让服务去请求内网地址、云元数据端点或本机端口, 等于把服务变成跳板。这里把策略集中在一处,入站拉取与出站通知共用。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type List

type List struct {
	// contains filtered or unexported fields
}

List 是一份主机名白名单。零值不可用:不含任何条目时 EverythingAllowed 返回 false,即"默认拒绝"。

条目形如 "cdn.example.com"(精确)、"*.corp.example.com"(子域通配,仅匹配一级以上 的子域,不匹配 "corp.example.com" 本身)或 "10.20.0.0/16"(CIDR,也接受单个 IP)。

func Parse

func Parse(entries []string) (*List, error)

Parse 解析白名单条目。空串与空白项被忽略,非法条目返回错误——配置写错应当在启动 时失败,而不是运行时静默放行或静默拒绝。

func (*List) AllowAddr

func (l *List) AllowAddr(addr netip.Addr) error

AllowAddr 判断一个解析后的地址是否可访问。默认拒绝一切非公网单播地址:回环、 私有网段、链路本地(含 169.254.169.254 云元数据)、未指定、多播。

注意:这是"不得命中敏感网段"的黑名单式判断,不是"必须在公网白名单内"。白名单条目 里的 CIDR 用来在受控内网中放行特定网段(例如内部对象存储),因此 AllowedHost 为真并不能单独成为放行依据,两者要同时满足。

func (*List) AllowResolved

func (l *List) AllowResolved(addrs []netip.Addr) error

AllowResolved 校验一组解析结果:必须全部通过 AllowAddr,且至少有一个地址可用。 只要有一个地址指向敏感网段就整体拒绝,避免"多数解析结果正常"掩盖恶意记录。

func (*List) AllowedHost

func (l *List) AllowedHost(host string) bool

AllowedHost 判断主机名是否在白名单内。CIDR 与单个 IP 条目在此不参与匹配,它们 作用于解析后的地址(见 AllowAddr)。

func (*List) Describe

func (l *List) Describe() string

Describe 返回条目数量,供启动日志与 /healthz 展示,不泄露条目内容。

func (*List) Empty

func (l *List) Empty() bool

Empty 报告白名单是否为空。为空时 EverythingAllowed 恒为 false。

func (*List) EverythingAllowed

func (l *List) EverythingAllowed() bool

EverythingAllowed 报告白名单是否处于"不限制"状态。空白名单即不限制外部访问, 服务据此在启动时给出告警并在请求时直接拒绝这类操作。

func (*List) ResolveAndCheck

func (l *List) ResolveAndCheck(host string) ([]netip.Addr, error)

ResolveAndCheck 按白名单校验 host 的解析结果,返回可用的地址列表。调用方应当把 校验放在真正拨号的那一刻(自定义 net.Dialer.DialContext)执行,否则检查与连接之间 存在时间窗,攻击者可用 DNS rebinding 在窗口内把域名改指到内网。

func (*List) ResolveAndCheckContext

func (l *List) ResolveAndCheckContext(ctx context.Context, host string) ([]netip.Addr, error)

ResolveAndCheckContext 按白名单校验 host 的解析结果,并使 DNS 查询响应 ctx 取消。 拨号前的校验应使用请求自身的 context,避免 DNS 阻塞绕过请求超时。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL