Iroh Docker 镜像实战指南:容器化部署 iroh-relay 与 iroh-dns-server
Iroh Docker 镜像实战指南容器化部署 iroh-relay 与 iroh-dns-server【免费下载链接】irohIP addresses break, dial keys instead. A library that adds QUIC NAT Traversal to your apps.项目地址: https://gitcode.com/GitHub_Trending/ir/iroh本指南以 docker/README.md 为主线系统讲解如何用仓库自带的 Dockerfile 构建、运行iroh-relayQUIC NAT 穿透的中继服务器与iroh-dns-serverpkarr 中继 DNS 服务器两个容器镜像。读完你将掌握从源码一键构建多平台镜像的完整命令、通过docker run挂载配置并暴露端口部署两个服务的标准流程以及两个服务底层配置项访问控制、TLS、限流、DNS 区域等的源码级细节。镜像概述一个仓库、两个服务docker/目录提供了一组开箱即用的 Docker 镜像目的是让 iroh 生态中的两个关键服务能够方便地在容器化环境中运行iroh-relayiroh 的中继服务器。当端点之间无法建立直接 P2P 连接时由它临时转发加密流量直连建立后自动退居幕后。它同时承担 NAT 穿越辅助net_report 探测与可选的 QUIC 地址发现职责。更完整的介绍见 iroh-relay/README.md。iroh-dns-server同时充当 pkarr 签名数据包的中继与 DNS 服务器对外提供 DNSUDP/TCP、/pkarrGET/PUT与/dns-queryDNS-over-HTTPSRFC 8484等服务见 iroh-dns-server/README.md。需要特别指出的是原文档明确说明docker/Dockerfile与docker/Dockerfile.ci主要是为 CI 场景准备的但同样支持手动构建。这意味着你既可以把镜像构建步骤嵌入持续集成流水线也可以在本机直接执行下述命令产出镜像。构建镜像buildx 多阶段构建原文档给出的构建命令要求从仓库根目录执行且使用 Docker BuildKit 的buildx插件以便指定目标平台# macOSApple Silicon 等 ARM 机器构建 arm64 镜像 docker buildx build -f docker/Dockerfile --target iroh-relay --platform linux/arm64/v8 --tag n0computer/iroh-relay:latest . # Linuxx86_64 机器构建 amd64 镜像 docker buildx build -f docker/Dockerfile --target iroh-relay --platform linux/amd64 --tag n0computer/iroh-relay:latest . # 要构建 iroh-dns-server只需替换 --target docker buildx build -f docker/Dockerfile --target iroh-dns-server --platform linux/amd64 --tag n0computer/iroh-dns-server:latest .三个关键参数的含义参数作用-f docker/Dockerfile显式指定构建文件命令在根目录执行因此指向docker/子目录下的文件--target iroh-relay/--target iroh-dns-server选择多阶段构建的最终目标阶段可替换为iroh-dns-server--platform linux/arm64/v8/linux/amd64指定目标 CPU 架构macOS 与 Linux 需按本机架构选择源码级解读Dockerfile 的多阶段流水线阅读 docker/Dockerfile 可以看到镜像采用经典的 Rust 多阶段构建核心思路是最大化利用 Docker 层缓存chef阶段基于rust:alpine安装musl-dev、openssl-dev、pkgconfig并预装cargo-chefRust 依赖缓存工具。planner阶段cargo chef prepare生成依赖清单recipe.json。rust_builder阶段先cargo chef cook --release --recipe-path recipe.json预编译全部依赖注释明确标注 this is the caching Docker layer!源码改动不会触发依赖层重建再cargo build --release --all-features编译整个 workspace。目标阶段alpine:latest运行时镜像只拷贝rust_builder阶段产出的单个静态二进制并设置ENTRYPOINT。两个目标阶段的关键差异在于暴露的端口与入口程序# iroh-relay 目标阶段 EXPOSE 80 443 3478/udp 9090 ENTRYPOINT [/iroh-relay]# iroh-dns-server 目标阶段 EXPOSE 53/udp 9090 ENTRYPOINT [/iroh-dns-server]这些端口与运行阶段docker run的-p参数一一对应80HTTP、443HTTPS、3478/udpdocker/Dockerfile.ci 的注释将其标注为 stun 端口对应 docker run 中3478:3478/udp的映射、9090metrics 指标端口dns-server 则暴露53/udpDNS与9090metrics。此外docker/Dockerfile.ci 提供了一套面向 CI 的简化写法它不再在镜像内编译而是假设 CI 流水线预先在宿主机上构建好各平台二进制通过COPY bins/${TARGETPLATFORM}/iroh-relay /iroh-relay直接按平台目录拷入TARGETPLATFORM为 buildx 注入的内置 ARG更适合将编译与打包拆分的发布流程。运行 iroh-relay挂载配置 暴露端口原文档给出的 iroh-relay 运行命令如下docker run \ -v /path/to/iroh-relay.conf:/config/iroh-relay.conf \ -p 80:80 -p 443:443 -p 3478:3478/udp -p 9090:9090 \ -it n0computer/iroh-relay:latest params --config /config/iroh-relay.conf要点拆解-v挂载配置文件将宿主机上的 TOML 配置文件挂载到容器内/config/iroh-relay.conf随后通过 CLI 参数--config指向该路径。这正是 iroh-relay/src/main.rs 中定义的config_path参数#[clap(long, short)]即--config-path与-c这里的--config对应同一参数在容器内的使用方式。端口映射80:80HTTP 中继服务、443:443HTTPS 中继服务、3478:3478/udpSTUN 相关 UDP 端口、9090:9090metrics。这些默认端口定义在 iroh-relay/src/defaults.rsDEFAULT_HTTP_PORT 80、DEFAULT_HTTPS_PORT 443、DEFAULT_METRICS_PORT 9090、DEFAULT_RELAY_QUIC_PORT 7842Dockerfile 的EXPOSE与此一致。params占位符可替换为--dev等 CLI 开关。--dev会让中继仅以明文 HTTP 运行在3340端口常量DEV_MODE_HTTP_PORT见 iroh-relay/src/main.rs并忽略配置中的 TLS 字段适合本地联调。不传配置也能跑默认值从哪来从 iroh-relay/src/main.rs 的Config::load可以看出如果未指定config_path或文件不存在服务会使用Config::default()此时http_bind_addr绑定[::]:80、enable_relay true、enable_metrics true、access everyone。因此即便省略--config镜像也能以全默认配置启动——但这意味着任何人或任何客户端都可以使用你的中继生产环境务必配置访问控制见下文。运行 iroh-dns-server挂载配置 暴露端口原文档给出的 iroh-dns-server 运行命令docker run \ -v /path/to/iroh-dns-server.conf:/config/iroh-dns-server.conf \ -p 53:53/udp -p 9090:9090 \ -it n0computer/iroh-dns-server:latest params --config /config/iroh-dns-server.conf与 relay 的区别在于端口DNS 服务监听53/udpmetrics 仍为9090。iroh-dns-server的二进制必须提供配置文件iroh-dns-server/README.md 明确 It needs a config file仓库为此提供了两个可直接使用的示例iroh-dns-server/config.dev.toml本地开发用127.0.0.1、HTTP 8080 / HTTPS 8443 / DNS 5300、自签名证书、启用 mainline DHTiroh-dns-server/config.prod.toml生产用443、53端口、Lets Encrypt 证书、域名与 IP 需按实际修改、关闭 mainline DHT。容器内把配置文件放到/config/下再以--config指向即可这与镜像ENTRYPOINT直连二进制的设计完全匹配。配置项逐字段解析结合 config.prod.toml以 iroh-dns-server/config.prod.toml 为例各字段的底层含义见 iroh-dns-server/src/config.rs字段说明pkarr_put_rate_limit smart对PUT /pkarr请求的限流策略可选disabled/simple/smart。smart通过反向代理头如X-Forwarded-For提取真实客户端 IP 限流simple按连接对端 IP 限流disabled关闭。实现细节见 iroh-dns-server/src/http/rate_limiting.rs[https]port 443domains为证书域名列表cert_mode lets_encrypt表示自动申请证书letsencrypt_prod true使用正式 ACME 目录[dns]port 53容器内对应-p 53:53/udpdefault_soa定义 SOA 记录default_ttl 30开发配置为 900origins声明服务的 DNS 权威区域.表示根区域通配rr_a/rr_ns分别指定应答的 A 记录与 NS 记录[mainline]enabled false关闭 BitTorrent mainline DHT 回退查询开发配置开启生产环境可自行决定配置 iroh-relay访问控制与 TLS生产必读容器化部署 relay 时访问控制是最容易忽略的安全环节。iroh-relay/src/main.rs 的AccessConfig枚举TOML 反序列化时全部小写支持四种模式# 1. 默认允许所有人 access everyone # 2. 白名单 / 黑名单按 endpoint id access.allowlist [endpoint-id, endpoint-id] access.denylist [endpoint-id] # 3. 共享令牌本地校验无需外部服务 access.shared_token [token-a, token-b] # 4. 外部 HTTP 鉴权服务POST 每次连接请求 access.http.url https://your-auth-service.example.com/relay-auth access.http.bearer_token service-to-service-secret共享令牌模式下客户端需携带Authorization: Bearer token请求头或?token查询参数令牌列表还可被环境变量IROH_RELAY_ACCESS_TOKEN整体覆盖单个值而非逗号分隔避免限制令牌字符集。注意源码中明确校验令牌列表不能为空、任一令牌不能为空字符串否则服务启动失败对应测试test_access_token_empty_is_rejected见 iroh-relay/src/main.rs。HTTP 鉴权模式下relay 会对每个入站连接向配置的 URL 发起 POST请求头X-Iroh-Endpoint-Id携带十六进制编码的端点 ID只有返回200且响应体为true才放行iroh-relay/src/main.rs。服务间鉴权令牌也可通过环境变量IROH_RELAY_HTTP_BEARER_TOKEN注入。此外relay 还支持以下实用配置字段均有 serde 默认值缺省即可工作# 仅打洞模式不转发流量只运行 QUIC 地址发现需配置 TLS enable_relay false enable_quic_addr_discovery true # 每客户端接收速率限制令牌桶算法每秒字节数 单次突发上限 [limits.client.rx] bytes_per_second 400 max_burst_bytes 800 # 连接数限流每秒接受数与突发上限 [limits] accept_conn_limit 1000 accept_conn_burst 200速率限制的实现对应 iroh-relay/src/main.rs 的解析逻辑bytes_per_second必须为非零u32且至少指定其一否则报错。若要启用 QUIC 地址发现帮助端点确认公网可观测地址则tls配置段必不可少且enable_quic_addr_discovery与tls必须同时存在源码在启动时强制校验。QUIC 默认监听7842端口iroh-relay/src/defaults.rs如需容器外访问需另行-p映射。镜像与容器化部署小结构建在仓库根目录用docker buildx build -f docker/Dockerfile --target iroh-relay|iroh-dns-server --platform linux/arm64/v8|linux/amd64 ...macOS 选 arm64、Linux 选 amd64 即可。运行通过-v挂载 TOML 配置到/config/用params --config /config/xxx.conf传给容器入口端口映射按服务类型选择relay80/443/3478udp/9090dns-server53udp/9090。配置文件dns-server 的现成模板见 iroh-dns-server/config.dev.toml 与 iroh-dns-server/config.prod.tomlrelay 的配置结构参考 iroh-relay/src/main.rs 中的Config/TlsConfig/Limits/AccessConfig定义。安全底线生产环境务必通过access配置访问控制白名单、共享令牌或外部 HTTP 鉴权切勿以默认的everyone模式直接暴露公网。适用范围docker/Dockerfile与docker/Dockerfile.ci面向 CI 设计但均支持手动构建本指南所有命令与端口均以当前仓库的 docker/Dockerfile、docker/Dockerfile.ci 及源码为据。【免费下载链接】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),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →