网络规则匹配一个目标地址。有两种:
- 主机规则不指定方法或路径,因此它匹配发往该目标地址的所有流量。Docker Home 编辑器 称其为 All traffic 规则。
- HTTP 规则还会指定 HTTP 方法和 URL 路径,并可选择性地限制查询参数,因此策略可以 允许选定的 API 请求。
有关如何书写目标地址,请参阅目标地址。
HTTP 方法和路径
HTTP 规则指定一个或多个方法、一个目标地址以及路径模式。每部分接受什么取决于你在哪里 配置该规则:
| 部分 | 组织策略 | 本地策略 |
|---|---|---|
| 方法 | 列出的一种或多种方法 | ANY,或一种或多种方法 |
| 目标地址 | 主机或 IP 地址 | 主机 |
| 路径 | 一种或多种绝对路径模式 | 一种绝对路径模式 |
目标地址可以包含端口,路径模式形如 /api/**。
本地 HTTP 规则只接受主机模式,不接受 IP 地址或 CIDR 范围。要匹配 IP 地址或 CIDR 范围,请使用不带 --method 或 --path 的网络规则。本地 HTTP 规则也只接受一个路径, 因此每个路径都要添加一条单独的规则。
每条规则至少适用于一种方法。在 CLI 上,--method ANY 涵盖所有 HTTP 方法。在编辑器中, 至少要选择一种方法。未选择任何方法的规则会校验失败。关于可以单独选择的方法,对于 组织策略请参阅 网络规则可以匹配什么, 对于本地策略请参阅 允许或阻止 HTTP 方法和路径。
HTTP 路径匹配忽略 ASCII 字母的大小写:/API/** 匹配 /api/items。非 ASCII 字符仍然 区分大小写。这对允许规则和拒绝规则都适用。
路径模式使用与文件系统路径相同的通配符,其中 * 在一个路径段内匹配,** 匹配任意 深度。不含通配符的模式精确匹配该路径,因此 /repos 只匹配 /repos,不匹配其下的 任何内容。每个模式都必须以 / 开头,且不能包含查询字符串、片段或 .. 路径段。本地 规则的路径还必须是规范形式,因此不能包含百分号编码、控制字符、首尾空白、重复或 末尾的斜杠,或 . 路径段。
查询参数
HTTP 规则还可以独立于路径限制查询参数。
使用精确的参数名和值,或者在值的开头或结尾使用单个 * 来匹配后缀或前缀。值为 * 匹配任意值,包括空值。参数名不能包含通配符。名称和值忽略 ASCII 字母的大小写,因此 Tag=PROD 匹配 tag=prod。非 ASCII 字符仍然区分大小写。
指定的每个参数都必须匹配。参数顺序无关紧要,请求可以包含额外的参数。在规则中重复 参数名,要求请求中出现分别匹配的多次出现。没有查询限制的规则无论查询参数如何都匹配。
请使用 URL 查询编码来书写名称和值的模式:空格用 + 或 %20,字面加号用 %2B, 字面星号用 %2A。不要把查询参数写进 --path。有关 CLI 示例,请参阅 允许或阻止 HTTP 方法和路径。 关于组织策略中的 Query parameters 字段,请参阅 HTTP 规则。
组合 HTTP 规则和主机规则
HTTP 请求会同时针对这两类规则求值。主机规则设定了某个主机的基线,而 HTTP 规则按 方法、路径和查询参数收窄访问权限:
| 覆盖该主机的规则 | 对 HTTP 请求的结果 |
|---|---|
| 只有主机允许 | 任意方法和路径都被允许 |
| 只有 HTTP 允许 | 只有规则匹配方法、路径和任何查询限制时才允许。其他一律被拒绝 |
| 主机允许和 HTTP 拒绝 | 匹配 HTTP 拒绝的请求被拦截。其余请求保持允许 |
| 主机拒绝 | 被拦截。HTTP 允许无法重新放行一个已被拒绝的主机 |
因此,主机拒绝是 HTTP 规则无法抬高的下限,而主机允许是 HTTP 规则可以从中切分的上限。
当规则要求作出 HTTP 判定时,沙箱 HTTP 代理会逐个请求分别求值,而不是按连接一次性 判定。
这些请求必须经过该代理。它无法检查的连接(例如以透明方式处理的连接)会被拦截,而 不是被求值。非 HTTP 流量(例如 SSH)不携带方法或路径,因此 HTTP 规则永远不会匹配 它们。请用主机规则控制这些目标地址。
目标地址
网络规则用 connect:tcp 表示 TCP,用 connect:udp 表示 UDP。资源可以是主机名、 CIDR 范围或端口。UDP 需要 实验性的出站 UDP。ICMP 被阻止。
主机名模式
主机名匹配不区分大小写:EXAMPLE.com 匹配 example.com。
| 模式 | 示例 | 匹配 |
|---|---|---|
| 精确主机名 | example.com | 任意端口上的 example.com,不含子域名 |
| 单层通配符 | *.example.com | 一级子域名,任意端口:api.example.com |
| 多层通配符 | **.example.com | 任意深度,任意端口:api.example.com、v2.api.example.com |
| 带端口的主机名 | example.com:443 | 仅 443 端口上的 example.com |
example.com 和 *.example.com 并不互相覆盖。如果你需要同时匹配根域名和它的子域名, 请把两者都写出来。
CIDR 范围
IPv4 和 IPv6 记法都支持:10.0.0.0/8、192.168.1.0/24、2001:db8::/32。