本页介绍本地沙箱、本地守护进程,以及宿主机 CLI 连接到云沙箱时的代理设置。这些设置 不涉及云沙箱内部产生的流量。关于云沙箱的出站流量控制,请参阅 云网络策略。
IMPORTANT
上游代理支持仍处于实验阶段。本页描述的所有内容——代理 URL、PAC 文件、SOCKS5、 使用操作系统系统代理、代理身份验证以及配置它们的设置——都可能发生变化。请在 docker/sbx-releases 仓库中反馈意见和报告缺陷。
上游代理是企业或网络代理,Docker Sandboxes 把出站流量转发到互联网时经过它。它与 网络策略不同,后者决定允许访问_哪些_目标地址,上游代理则决定允许的流量_如何_到达 这些地址。关于如何设置网络策略,请参阅 沙箱治理。
Docker Sandboxes 会发送两类出站流量,你可以分别对它们配置代理:
- 沙箱流量——来自本地沙箱内部的网络访问。
- 守护进程和宿主机 CLI 流量——守护进程自身的访问,包括镜像拉取、遥测和功能标志, 以及宿主机 CLI 请求,包括
sbx login、sbx diagnose --upload、云命令、sbx move、 TUI 和云 SSH。
默认行为
默认情况下,两类流量都使用你操作系统的代理设置,包括其中配置的任何 PAC URL。你 不需要做任何配置。在 macOS 和 Windows 上,sbx 运行期间会跟踪操作系统的代理设置, 因此网络、VPN 或 PAC 配置的变更无需重启即可生效。如果你的操作系统没有配置代理, 流量将直连。
手动设置代理
用 sbx settings set 覆盖某一类或两类流量的默认行为:
$ sbx settings set proxy http://proxy.corp:3128 # 两类流量
$ sbx settings set proxy.sandbox socks5://proxy.corp:1080 # 仅沙箱流量
$ sbx settings set proxy.daemon direct # 仅守护进程流量代理值可以是以下任意一种:
| 值 | 含义 |
|---|---|
| (未设置) | 回退到更宽的作用域,然后是环境变量,最后是操作系统系统代理(默认行为) |
http://host:port 或 https://host:port | HTTP 或 HTTPS 代理 |
socks5://host:port 或 socks5h://host:port | SOCKS5 代理 |
pac+http://host/proxy.pac、pac+https://host/proxy.pac 或 file:///path/proxy.pac | PAC(代理自动配置)文件 |
system | 强制使用操作系统系统代理 |
direct | 强制直连,不使用代理 |
使用 socks5:// 时,DNS 在本地解析,然后连接才交给代理。使用 socks5h:// 时, DNS 解析交给代理完成。
把目标地址排除在代理之外
排除列表与上述作用域一一对应。每个列表接受以逗号分隔的主机名、域名后缀、IP 地址 或 CIDR 范围,也可以用 * 完全绕过代理:
$ sbx settings set no_proxy "*.internal.corp,10.0.0.0/8" # 两类流量
$ sbx settings set no_proxy.sandbox "*.svc.cluster.local" # 仅沙箱流量
$ sbx settings set no_proxy.daemon "registry.internal" # 仅守护进程流量环境变量
由于 sbx 从你的 shell 中运行,它同样遵循标准的和旧式的代理环境变量,因此现有配置 无需迁移即可继续工作:
HTTP_PROXY、HTTPS_PROXY和NO_PROXY(以及它们的小写形式)——标准变量。在 没有配置proxy或no_proxy设置时,它们同时作用于两类流量。DOCKER_SANDBOXES_PROXY和DOCKER_SANDBOXES_NO_PROXY——proxy.sandbox和no_proxy.sandbox的环境变量形式。它们仅作用于沙箱流量,绝不影响守护进程流量。
关于如何把环境变量的变更应用到 CLI 和守护进程,请参阅 设置环境变量。
优先级
对每一类流量,最先匹配的生效:
- 特定作用域的值:
- 沙箱流量用
proxy.sandbox或DOCKER_SANDBOXES_PROXY - 守护进程流量用
proxy.daemon
- 沙箱流量用
proxy设置- shell 中的
HTTP_PROXY或HTTPS_PROXY - 操作系统系统代理(默认行为)
- 直连
匹配的排除列表(先 no_proxy.<scope>,再 no_proxy)适用于选定的代理;在走环境 变量这条路径时,标准的 NO_PROXY 变量仍然生效。
例如,如果 proxy 指定了一个共享代理,而 proxy.sandbox 被设为 direct,那么沙箱 流量直连,而守护进程流量使用共享代理。如果没有配置任何代理设置,HTTP_PROXY 的 优先级高于操作系统系统代理。
变更何时生效
代理设置根据使用方的不同在不同时机生效:
- 沙箱作用域(
proxy.sandbox、no_proxy.sandbox,以及proxy和no_proxy的沙箱 一侧)在创建沙箱网络代理时解析。变更之后创建的沙箱会使用更新后的设置。已有沙箱 会保留其选定的上游代理,直到sbx daemon restart重建它们的网络代理。仅重启沙箱 是不够的。 - 守护进程作用域(
proxy.daemon、no_proxy.daemon,以及proxy和no_proxy的 守护进程一侧)在守护进程启动时解析一次。要改变守护进程自身的流量,需要执行sbx daemon restart。 - 宿主机 CLI 客户端在每次调用时读取守护进程作用域的设置。变更会在下次调用时生效, 无需重启守护进程。
DOCKER_SANDBOXES_* 环境变量是另一种情况。如 环境变量所述,它们只控制沙箱流量,但 sbx 是在守护进程 启动时从守护进程的环境中读取它们的,因此更改这些变量同样需要重启守护进程。如果 其中某个变量覆盖了已存储的设置,请取消该变量并重启守护进程,让已存储的设置生效。
使用 system 或 PAC 代理时,sbx 仍会实时跟踪操作系统层面的代理变化(例如切换 网络、连接 VPN 或 PAC 内容更新)。
宿主机的网络变更也可能让已建立的沙箱连接停滞。要调整或禁用关闭这些连接的超时时间, 请参阅 egress.stalledConnectionTimeoutSeconds。
云 SSH
云 SSH 使用配置的宿主机代理连接 SSH 网关。有些代理会拒绝连向网关 SSH 端口的连接。 如果你的网络允许直接 SSH 连接,请为云 SSH 绕过代理:
$ sbx settings set proxy.sshDirect true该设置会完全跳过代理用于云 SSH,不会先尝试连接代理。宿主机 CLI 的其他请求仍使用 配置的代理。该变更在下一次 SSH 连接时生效,无需重启守护进程。将其设为 false 即可 重新使用代理。
身份验证
如果上游代理要求你进行身份验证,sbx 支持两种机制。
代理 URL 中的凭据
把凭据放进代理 URL:HTTP 或 HTTPS 代理用 http://user:pass@host:port,SOCKS5 用 socks5://user:pass@host:port。这在所有平台上都可用,也适用于使用 Basic 身份验证 发起质询的代理。
集成式 Windows 身份验证
对 CONNECT 返回 407 质询、且只接受集成式方案(NTLM 或 Kerberos/Negotiate)的 代理,可以使用你的 Windows 登录身份进行验证。该功能需要显式启用,默认关闭:
$ sbx settings set proxy.integratedAuth true该设置没有作用域划分:它同时作用于沙箱流量和守护进程流量。如果代理提供多种方案, 会使用其中最强的一种,优先选择 Negotiate 而非 NTLM。变更遵循与其他代理设置相同的 生效时机:对于受支持的 CLI 客户端在下一次调用时生效, 在你创建沙箱时生效,而守护进程流量和已有沙箱的代理则需要 sbx daemon restart 之后 才生效。
你的身份始终留在宿主机上。对上游代理的身份验证发生在沙箱边界的宿主机一侧,且在 网络策略已经应用之后,因此不会有任何凭据进入沙箱,沙箱可以访问哪些目标地址也不 会发生任何变化。
该功能依赖 Windows SSPI,因此在 macOS 或 Linux 上无效。在这些平台上,代理 URL 中的 凭据仍然是唯一的选项。
相关页面
- 网络隔离——流量如何离开沙箱,以及它经过的网络策略
- 故障排查:API 调用因证书错误而失败 ——当你的代理检查 HTTPS 流量时,如何安装内部根 CA