ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Portmaster SPN 测试指南:多身份路由验证与本地测试网络搭建

Portmaster SPN 测试指南:多身份路由验证与本地测试网络搭建 网络安全【免费下载链接】portmaster Love Freedom - ❌ Block Mass Surveillance项目地址https://gitcode.com/gh_mirrors/po/portmaster点击查看免费下载Portmaster 的 SPNSafing Privacy Network是其对抗大规模监控、提供匿名出口的关键模块。本文围绕仓库中的 spn/TESTING.md 官方测试文档讲解如何验证 SPN 的多身份路由Multi-Identity Routing是否按预期工作并结合源码深入剖析其底层原理最后给出搭建隔离测试网络的完整实操步骤。读完本文你将掌握一套可复制、可验证的 SPN 功能测试方法以及如何读懂测试结果、排查误判。先理解你在测试什么SPN 与多身份路由SPN 是一个去中心化的隐私网络客户端Client通过多个公开的 Hub 建立加密隧道把流量在多个跳点之间接力转发最终由某个出口 Hub代表用户访问目标网站。在 spn/instance.go 中可以看到 SPN 的完整模块组成access访问与认证、cabin身份、navigator路由规划、captain连接管理、crew隧道处理、docks终端管理、ships底层连接、patrol连通性巡检、sluice流量闸口与terminal终端协议。多身份路由Multi-Identity Routing的核心思想是SPN 不为所有流量只分配单一出口而是可以为不同的连接选择不同的出口 Hub。路由选择由 spn/navigator/route.go 实现——每条Route由一串Hop跳点组成每个 Hop 记录 Hub ID 与代价CostTotalCost是所有跳点与目标出口代价之和Routes.clean()会按代价排序并裁剪到配置上限randomizeTop()还会在代价相近的顶级路由中做随机化以均衡网络负载。当客户端建立隧道时spn/crew/connect.go 中的establishRoute会沿路由逐跳执行docks.ExpandTo扩展终端并经access.AuthorizeToTerminal完成逐跳认证。因此多身份路由正常工作时不同连接会从不同出口 Hub 出网看到的公网 IP 也就不同。这正是官方测试文档的验证思路。官方推荐的多身份路由测试法spn/TESTING.md 给出的测试方法非常直接同时请求多个显示公网 IP 的网站如果它们返回不同的 IP 值说明多身份路由正在工作。测试原理在 SPN 未启用或仅单一路由时所有请求的出口一致各网站返回相同的公网 IP在多身份路由启用后不同连接可能被分配到不同出口 Hub各网站返回的公网 IP 会出现差异出现差异即证明SPN 隧道链路建立成功、出口 IP 已成功切换、多出口路由分配生效。推荐测试网站原文档推荐了以下 4 个可显示公网 IP 的服务以域名形式给出避免链接跳转干扰测试icanhazip.comipecho.netipinfo.ioipinfo.tw终端命令在任意终端中依次执行curl https://icanhazip.com curl https://ipecho.net/plain curl https://ipinfo.io/ip curl https://ipinfo.tw/ip对比四条命令的输出如果它们返回不同的 IP则多身份路由工作正常如果全部相同则说明当前流量只走了单一出口。测试结果的解读与常见误判拿到测试结果后需要区分以下情形避免误判现象可能原因处理建议四个网站返回不同 IP多身份路由正常符合预期返回相同 IP流量仅经单一出口确认 SPN 已连接、连接分配策略是否允许多出口请求超时或连接失败出口 Hub 的 HTTPS 连通性异常查看 SPN 状态与日志参考 patrol 巡检结论返回 IP 与本地公网 IP 一致SPN 未接管该流量旁路检查应用是否走代理、SPN 隧道是否建立另外要注意结果缓存个别浏览器或 HTTP 客户端会缓存响应建议使用curl这类无缓存的命令行工具并多次刷新对比。源码视角SPN 内部如何让出口变多理解测试原理后可以深入源码确认其实现。整个过程由三个层面协作路由规划navigatornavigator.FindRoutes(ip, opts)针对目标 IP 计算多条候选 Route每条 Route 的Path记录了从 Home Hub 到目标出口 Hub 的跳点序列见 spn/navigator/route.go。recalculateTotalCost()甚至会对已建立活跃终端的跳点只计 80% 代价鼓励复用已有链路。隧道建立crew docksspn/crew/connect.go 的establishRoute逐跳调用expand()先用docks.ExpandTo在上一跳与下一跳之间创建ExpansionTerminal再发起认证操作AuthorizeOp成功后把该 Pin 标记为可达并存入活跃终端若某跳认证失败或超时对应 Pin 会被MarkAsFailingFor标记为故障路由尝试随即切换下一条。底层连接shipsspn/ships/launch.go 的Launch会按 Hub 发布的 transports如http:80、tcp:17与 IPv4/IPv6 地址逐一尝试建立Ship网络层连接接口定义见 spn/ships/ship.go。不同出口 Hub 意味着不同的Ship与不同的公网出口这正是多 IP 差异的物理来源。从这条链路可以推断只要 navigator 能同时维护多条候选路由且 crew 能分别为它们建立终端多身份路由就会为不同连接分配不同出口。测试时观察到的 IP 差异本质是上述模块协同工作的外在表现。补充测试手段自动 HTTPS 连通性巡检除手动 curl 外SPN 还内置了自动巡检模块patrol可用于持续验证隧道出口的连通性作为多身份路由测试的补充spn/patrol/http.go 中的runHTTPSConnectivityChecks会分三档执行 HTTPS 连通性检查先 1 个域名要求 100% 成功失败则升级为 5 个域名要求 80%再失败则升级为 20 个域名要求 70%。检查会分别针对tcp4与tcp6进行取决于 Hub 是否具备对应地址族。探测使用的测试域名来自 spn/patrol/domains.go 维护的固定列表如wikipedia.org、cloudflare.com、debian.org等源自 Tranco 榜单并经过清洗每次从列表中随机选取见getRandomTestDomain()。CheckHTTPSConnection强制使用 HTTPS 并校验状态码位于[200, 400)区间且禁用了 keep-alive 与压缩、跳过重定向确保探测的是真实的出口链路而非中间层缓存相关细节均在该文件源码中。如果你的 SPN 出口在该巡检中被判定失败HTTPSConnectivityConfirmed()会变为false并触发状态事件此时手动 curl 大概率也会失败——这可以帮助你把IP 是否不同与出口是否健康两个问题分开排查。搭建隔离的本地 SPN 测试网络官方在 spn/testing/simple/README.md 中提供了一套基于 Docker Compose 的简易测试网络可以在完全隔离的环境里验证 SPN 行为避免污染生产状态。整套脚本位于 spn/testing/simple/。1. 构建 Hub 二进制cd ../../../cmds/hub/ ./build2. 重置旧状态保证测试干净./reset-databases.sh3. 按需修改配置测试网络的拓扑与 Hub 参数由两个文件控制docker-compose.yml定义了 10 个 Hub 容器hub1~hub10分布在6.0.0.0/24子网内如6.0.0.11~6.0.0.20。前 5 个使用最新构建的二进制后 5 个默认使用同一二进制如果你把旧版本放到testdata/old-hub后 5 个会自动改用旧版本从而形成混合版本测试场景run.sh会输出对应告警。config-template.jsonHub 的基础配置模板其中spn.publicHub段的关键参数如下{ core: { log: { level: trace }, metrics: { instance: test_$HUBNAME, push: } }, spn: { publicHub: { name: test-$HUBNAME, transports: [http:80, http:8080, tcp:17], allowUnencrypted: true, bindToAdvertised: true } } }参数说明$HUBNAME会被每个容器替换为对应 Hub 名参数含义nameHub 在测试网络中的名称此处统一加test-前缀以示区分transports该 Hub 对外提供的传输方式http:80、http:8080表示 HTTP 传输及端口tcp:17表示原始 TCP 传输及端口allowUnencrypted允许未加密的传输测试网络专用生产环境不应开启bindToAdvertised绑定到公告的地址进行监听4. 启动测试网络./run.sh脚本会清理残留容器、校验 Hub 二进制存在、把模板文件与entrypoint.sh复制进共享目录然后执行docker compose -p spn-test-simple up --remove-orphans拉起全部 10 个 Hub。5. 以 Hub 身份加入方案一只想用不同构建或配置测试单个 Hub 时可直接用最新构建的 Hub 二进制加入网络./join.sh6. 以 Portmaster 客户端身份接入方案二连接测试网络时按官方文档执行注意--spn-map test指定了独立地图测试网络与生产main地图完全隔离不会污染已安装 Portmaster 的 SPN 状态sudo ../../../cmds/portmaster-core/portmaster-core --disable-shutdown-event --devmode --log debug --data /opt/safing/portmaster --spn-map test --bootstrap-file ./testdata/shared/bootstrap.dsd其中--spn-map test对应 spn/conf/map.go 中注册的-spn-map命令行参数默认值为main该参数本身标注为仅用于测试。若需要以纯客户端二进制模拟多客户端场景可参考 spn/testing/simple/clientsim.sh它把编译好的client二进制挂载进spn-simpletest-network网络的容器以--bootstrap-file /opt/shared/bootstrap.dsd --log trace方式启动并把数据目录隔离到testdata/clientsim。7. 停止测试网络这一步必须执行——直接中断run.sh会遗留带有公网 IP 的接口./stop.sh综合测试流程清单把上述内容串起来一套完整的 SPN 功能测试流程如下准备环境按上文搭建本地测试网络或直接使用已连接生产 SPN 的 Portmaster。基线对比断开/禁用 SPN执行 4 条curl命令记录本地真实公网 IP。启用 SPN确认 Portmaster 显示 SPN 已连接可参考SPNConnected状态事件见 spn/instance.go 的GetEventSPNConnected。执行测试再次执行 4 条curl命令对比输出 IP。结果判定出现多个不同 IP 即通过全部相同则检查隧道状态与 patrol 巡检结论。恢复与清理测试完毕执行./stop.sh清理测试网络避免遗留公网接口。这套方法既适用于快速人工验证也适合作为 CI 或回归测试的基线多身份路由的多出口特性最终都可以归结为同一客户端、多个出口、多个公网 IP这一可观测事实。赞分享网络安全【免费下载链接】portmaster Love Freedom - ❌ Block Mass Surveillance项目地址https://gitcode.com/gh_mirrors/po/portmaster点击查看免费下载相关推荐Portmaster SPN 测试网实战指南用 Docker 与 Shadow 搭建 Port17 本地测试环境Portmaster SPN 测试网实战指南用 Docker 与 Shadow 搭建 Port17 本地测试环境 Portmaster 的 SPNSafe网络安全MateCloud云原生转型传统架构到微服务架构迁移指南MateCloud云原生转型传统架构到微服务架构迁移指南 MateCloud是一款基于Spring Cloud Alibaba的微服务架构已整合Spring后端API网关微服务认证鉴权AI 应用前端云原生Databend 本地多节点测试集群搭建指南3 Meta 多 Query 节点的压测与验证实践Databend 本地多节点测试集群搭建指南3 Meta 多 Query 节点的压测与验证实践 本指南以 Databend 仓库中的 scripts/te数据库数据分析向量数据库全文检索云原生AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表