
iroh-relay 中继服务器实战指南从零构建、访问控制到本地测试【免费下载链接】irohIP addresses break, dial keys instead. A library that adds QUIC NAT Traversal to your apps.项目地址: https://gitcode.com/GitHub_Trending/ir/iroh导读iroh-relay 是 iroh 点对点网络体系中负责“兜底连接”的核心服务当两个设备因 NAT、防火墙等原因无法直接建立 P2P 连接时中继服务器relay server会临时转发加密流量直到直连路径打通后自动退居幕后。本文基于 iroh-relay/README.md 展开并结合仓库源码main.rs、server.rs、defaults.rs 等为你完整讲解如何编译出生产级优化二进制、如何通过 TOML 配置五种访问控制模式、如何在本地用--dev模式搭建纯 HTTP 或带 QUIC 地址发现QAD的测试环境以及如何在集成测试中以内嵌进程方式运行中继服务器。读完本文你将具备独立部署并调优一个 iroh-relay 的完整能力。iroh-relay 在 iroh 网络中的角色iroh 是专为设备间直接、加密通信设计的 P2P 网络系统。其核心思想是“IP 地址会失效拨号用密钥”设备通过 Endpoint ID 而非 IP 相互寻址。但现实网络中 NAT、运营商级 NATCGNAT和防火墙无处不在两个设备很难保证“一拨就通”。iroh-relay 正是为此设计的中继层当直连不可行时中继服务器临时转发加密流量帮助双方完成连接建立一旦直连路径P2P打通中继服务器自动退场数据直接在设备之间流动从而在复杂网络环境下依然保持安全、低延迟的连接。该 crate 提供了一整套与中继相关的完整设施见 Cargo.toml 与 lib.rs组件说明Relay Protocol中继服务器与客户端之间的通信协议是 Tailscale 的 DERPDesignated Encrypted Relay for Packets协议的修订版实现位于 protos/relay.rsRelay Server基于 HTTP/HTTPS 的完整中继服务器可选暴露 QADQUIC Address Discovery端点和 metrics 指标Relay Client用于向中继服务器建立连接的客户端Server Binary用于自建中继服务器的 CLI 二进制可通过配置同时开启 QAD 与 metrics从 server.rs 的模块文档可以看到中继服务器实际托管了以下 HTTP 服务HTTPS /relay客户端连接并传输流量的主端点HTTPS /ping供 net_report 探测使用HTTPS /generate_204供 net_report 探测使用。构建中继服务器在 workspace 根目录即仓库根目录执行cargo build并携带optimized-releaseprofile 与serverfeature即可得到优化后的生产二进制cargo build \ --profile optimized-release \ --package iroh-relay \ --features server构建完成后可执行文件位于target/optimized-release/iroh-relay。关于 feature 的说明源自 Cargo.tomlserver启用中继服务器所需的一切包括 CLIclap、证书加载与热重载、ACME/Lets Encrypt、WebSocket 服务端、metrics 服务等同时也是iroh-relay二进制目标的必需 feature[[bin]]声明了required-features [server]metrics启用 metrics 指标服务server默认包含test-utils提供用于测试的服务器配置辅助函数tls-ring/tls-aws-lc-rs选择 rustls 的密码学提供方默认tls-ring。CLI 与配置总览中继服务器二进制入口为 main.rs仅有两个命令行参数参数说明--dev以本地开发模式运行仅走纯 HTTP默认端口 3340不会启动用于 QUIC 地址发现的 QUIC 端点且会忽略配置文件中与 TLS 相关的字段--config-path path-c指定 TOML 配置文件路径若未指定或文件不存在则使用默认配置配置文件解析逻辑在Config结构体中核心字段如下含默认值均可省略配置字段默认值说明enable_relaytrue是否启用中继代理功能。设为false时仅运行 QUIC 服务器需同时开启 QAD用于“仅打洞holepunching”型中继不转发任何数据http_bind_addr[::]:80--dev下为[::]:3340Relay HTTP 服务器绑定的套接字地址tls无纯 HTTPTLS 配置子表若开启 QAD 则必须配置enable_quic_addr_discoveryfalse是否启用 QUIC 连接以进行地址发现开启时要求必须配置tlslimits无限流配置子表enable_metricstrue是否运行 metrics 服务metrics feature 开启时metrics_bind_addrhttp_bind_addr的 IP 端口 9090metrics 服务监听地址key_cache_capacity1024 * 1024密钥缓存容量按 100 万并发客户端设计约占用 56MB 内存见 defaults.rsaccesseveryone中继连接的访问控制见下一节端口常量见 defaults.rs为HTTP80、HTTPS443、QUIC 地址发现7842即手机键盘上 QUIC 四个字母对应的数字、metrics9090。访问控制五种模式详解中继服务器通过配置文件的access字段控制“哪些 Endpoint 可以使用本中继”。注意这里的访问控制只约束中继连接本身不控制其他端点的行为。1. 允许所有人默认access everyone源码中对应AllowAll见 server.rs也是AccessConfig的默认枚举值。2. 按 Endpoint ID 白名单 / 黑名单# 仅允许指定端点 access.allowlist [endpoint-id, endpoint-id] # 或屏蔽指定端点其余全部放行 access.denylist [endpoint-id]源码实现main.rs 中的AllowlistAccess/DenylistAccess直接比对ClientRequest::endpoint_id()是否命中列表白名单命中即Allow黑名单命中即Deny。3. 共享令牌本地鉴权无需外部服务access.shared_token [token-a, token-b]要求连接的客户端通过以下任一方式出示列表中的某个令牌HTTP 请求头Authorization: Bearer tokenURL 查询参数?tokentoken查询参数名常量见 http.rs。行为要点README 与源码双重确认见 main.rs 的SharedTokenAccess及TryFromAccessConfig令牌列表不允许为空且不允许包含空字符串否则服务器启动失败main.rs 有专门的test_access_token_empty_is_rejected测试验证令牌列表可被环境变量IROH_RELAY_ACCESS_TOKEN整体覆盖——该变量设置单个允许的令牌优先级高于配置文件。刻意不支持逗号分隔列表是为了避免限制令牌可用的字符集客户端侧使用RelayConfig::with_auth_token或RelayMap::with_auth_token设置令牌原生平台以Authorization: Bearer头随 WebSocket 升级请求发送编译到 WebAssembly 时由于浏览器不允许为 WebSocket 请求设置自定义头会退化为在升级 URL 上附加?token查询参数注意共享令牌不支持吊销只能通过更新配置并重启服务来生效。4. HTTP 回调鉴权外部鉴权服务access.http.url https://your-auth-service.example.com/relay-auth # 可选为 relay 发往你服务的请求附加鉴权头机器对机器 access.http.bearer_token service-to-service-secret工作原理对应源码HttpAccessmain.rs每个客户端连接到达时中继向url发起一次HTTP POST请求请求头携带X-Iroh-Endpoint-Id: hex 编码的 endpoint id源码常量X_IROH_ENDPOINT_ID用于让鉴权服务识别连接方若配置了bearer_token则附加Authorization: Bearer token请求头——该令牌用于中继到你服务之间的鉴权不是客户端鉴权鉴权服务返回HTTP 200 且响应体文本恰为true才放行其余任何状态码或响应内容一律拒绝。bearer_token也可通过环境变量IROH_RELAY_HTTP_BEARER_TOKEN设置且环境变量优先级高于配置文件源码TryFrom实现中若环境变量存在则直接覆盖配置值。配置文件解析的单元测试test_access_configmain.rs覆盖了access.http.url、内联access.http { url ... }等写法。本地测试使用--dev开发模式当你开发基于 iroh 的应用、需要本地中继时直接以--dev启动服务器只运行HTTP不运行 HTTPS不启动用于 QUIC 地址发现的 QUIC 端点QAD 需要 TLS 证书本地默认关闭以便快速起步。此时中继地址为http://localhost:33403340 常量定义见 main.rs 的DEV_MODE_HTTP_PORT。在开发模式下启用 QUIC 地址发现如果想在本地测试 QAD就需要 TLS 证书。最简单的办法是使用rcgen生成自签名证书rcgen本身也是serverfeature 的可选依赖见 Cargo.toml获取 rcgen进入其目录后用cargo run -- -o path/to/certs生成本地证书将证书路径写入 iroh-relay 配置文件例如下面的config.tomlenable_quic_addr_discovery true [tls] cert_mode Manual manual_cert_path /path/to/certs/cert.pem manual_key_path /path/to/certs/cert.key.pem照常以--dev运行服务器cargo run --featuresserver --bin iroh-relay -- --config-path/path/to/config.toml --dev此时中继仍在 3340 端口跑 HTTP但会额外启动一个 QUIC 服务器。QUIC 端口未显式指定时默认取DEFAULT_RELAY_QUIC_PORT即7842QUIC 在手机九宫格键盘上的对应数字见 defaults.rs中继仅将配置的 TLS 证书用于 QUIC 连接HTTP 部分保持明文。代码路径佐证--dev会把TlsConfig.dangerous_http_only置为truemain.rs随后build_relay_config会“禁用 HTTPS 但保留 QUIC 服务器”并把加载的 Manual 证书仅注入 QUIC 的server_config此外若enable_quic_addr_discovery为真而tls未配置服务器会直接报错拒绝启动。在集成测试中以库形式运行进程内中继当 iroh 作为传输库嵌入你的应用/库时可以用极简方式在测试里跑一个进程内中继启用irohcrate 的test-utilsfeatureiroh { version 0.95, features [test-utils] }调用iroh::test_utils::run_relay_server().await启动中继。该函数iroh/src/test_utils.rs会生成一张自签名 TLS 证书、绑定 localhost 的随机空闲端口返回(RelayMap, RelayUrl, Server)——Server被 drop 时服务器随之停止。变体还包括run_relay_server_with(quic)控制是否启用 QUIC 端点和run_relay_server_with_access(quic, access)自定义访问控制可注入前文任一种AccessControl。由于测试中继使用自签名证书需要让 iroh 端点跳过证书校验通过Endpoint::ca_tls_config传入CaRootConfig::insecure_skip_verify()Endpoint构建器相关 API 见 endpoint.rs测试辅助实现见 server/testing.rs其中self_signed_tls_certs_and_config生成的证书覆盖localhost、127.0.0.1与::1三个域名。整套流程与仓库集成测试的用法一致例如 tests/integration.rs 与 tests/patchbay.rs 均通过test-utils在测试进程中拉起中继实例。进阶配置TLS、限流与指标以下内容源于 main.rs 的配置结构可作为生产部署的扩展参考。TLS 证书模式[tls]子表字段默认值说明https_bind_addrhttp_bind_addr的 IP 端口 443HTTPS 服务器绑定地址quic_bind_addrhttps_bind_addr的 IP 端口 7842QUIC 服务器绑定地址hostname无Lets Encrypt 证书域名可传字符串或数组cert_mode无Manual/LetsEncrypt/Reloading三选一cert_dir服务器当前工作目录证书存放/读取目录manual_cert_pathcert_dir/default.crtManual 模式证书路径manual_key_pathcert_dir/default.keyManual 模式私钥路径prod_tlstrue是否使用 Lets Encrypt 生产服务器否则用 stagingcontact无Lets Encrypt 证书的联系邮箱dangerous_http_onlyfalse仅供内部使用--dev会置为true切勿手动设置cert_mode LetsEncrypt时要求至少提供一个hostname和一个contact邮箱证书目录可作为 ACME 缓存另有环境变量IROH_RELAY_ACME_URL覆盖 ACME 目录 URL与IROH_RELAY_ACME_CA信任额外 CA便于对接 pebble 等本地 ACME 测试服务器。Reloading模式则支持证书文件的热重载默认重载间隔见DEFAULT_CERT_RELOAD_INTERVAL。限流[limits][limits] accept_conn_limit 100.0 # 每秒接受新连接数未设则不限 accept_conn_burst 50 # 接受连接突发上限 [limits.client.rx] # 每个客户端入站速率令牌桶算法 bytes_per_second 400 # 每秒最大字节数 max_burst_bytes 800 # 单次突发最大字节数注意若要启用客户端限流bytes_per_second必须指定且非零仅设置max_burst_bytes会被拒绝对应 main.rs 的test_rate_limit_config测试。指标enable_metrics true默认时metrics 服务默认监听http_bind_addr的 IP 端口 9090可用metrics_bind_addr覆盖。许可证iroh-relay以及整个仓库采用双许可证任选其一Apache License 2.0LICENSE-APACHEMIT LicenseLICENSE-MIT除非另有明确声明任何为本项目贡献的内容都默认按上述双许可证授权不再附加其他条款。参考文件速查iroh-relay/README.md本文核心依据iroh-relay/src/main.rsCLI 解析、TOML 配置结构、五种访问控制实现与配置解析测试iroh-relay/src/server.rs服务器核心HTTP/HTTPS、/relay、/ping、/generate_204、ServerConfig/RelayConfigiroh-relay/src/defaults.rs端口与缓存容量等默认值常量iroh-relay/src/relay_map.rs客户端侧RelayConfig/RelayMap及with_auth_token行为iroh-relay/src/server/testing.rs测试用自签名证书与服务器配置iroh/src/test_utils.rsrun_relay_server系列进程内中继工具iroh-relay/Cargo.tomlfeature 与二进制目标定义。【免费下载链接】irohIP addresses break, dial keys instead. A library that adds QUIC NAT Traversal to your apps.项目地址: https://gitcode.com/GitHub_Trending/ir/iroh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考