配置文件¶
QRE 使用 INI 风格配置。全局配置只放全局策略,接口 profile 只放一个 [Server] 或 [Client] section。
文件与覆盖¶
| 用途 | 默认路径 | 覆盖方式 |
|---|---|---|
| 全局配置 | /etc/qre/qre.conf |
QRE_GLOBAL_CONFIG,或 qre-tool daemon --global-config <path> |
| profile 目录 | /etc/qre/dev |
QRE_CONFIG_DIR,或 qre-tool daemon --config-dir <path> |
| 状态目录 | /var/lib/qre |
[Global] StateDir、QRE_STATE_DIR,或 qre-tool daemon --state-dir <path> |
| BPF ELF | /usr/lib/qre/libqre_ebpf.so |
QRE_BPF_ELF,或 qre-tool daemon --bpf-elf <path> |
| BPF pin 目录 | /sys/fs/bpf |
QRE_BPF_PIN_DIR,或 qre-tool daemon --pin-dir <path> |
全局配置文件不存在时,qre-tool 使用内置默认值。接口 profile 不存在会报错。
解析规则¶
- 空行会被忽略。
#和;后面的内容视为行内注释。- section 名区分大小写,支持
[Global]、[Server]、[Client]和[SSLPreRead "name"]。 - 一个接口 profile 必须且只能包含一个
[Server]或[Client]。 - 全局配置不能混入
[Server]或[Client]字段。 - 字段名区分大小写,未知字段会报错。
- 重复字段会报错。hooks 字段例外,可以重复出现以执行多条命令。
全局配置¶
/etc/qre/qre.conf
[Global]
StateDir = /var/lib/qre
DestCacheRefreshSeconds = 300
DestCacheExpirySeconds = 900
DefaultDestTransport = auto
AllowStaleOnStartup = false
FallbackFlowTimeoutMs = 30000
FallbackRateWindowMs = 1000
MaxFallbackFlowsPerWindow = 64
FallbackByteRateLimitBps = 1000000
InvalidProbeRateWindowMs = 1000
MaxInvalidProbesPerWindow = 128
| 字段 | 默认值 | 范围/格式 | 说明 |
|---|---|---|---|
StateDir |
/var/lib/qre |
绝对路径 | 保存 profile state、daemon ready file 和 Dest profile cache 等机器生成状态。 |
DestCacheRefreshSeconds |
300 |
1..86400 |
Dest profile 刷新间隔。必须小于等于 DestCacheExpirySeconds。 |
DestCacheExpirySeconds |
900 |
1..31536000 |
Dest profile 过期时间。 |
DefaultDestTransport |
auto |
auto、tcp-tls、tcp_tls、quic |
默认 Dest probe 传输。auto 让实现选择合适方式。 |
AllowStaleOnStartup |
false |
true/false、yes/no、1/0、on/off |
启动时是否允许使用过期 Dest cache。 |
FallbackFlowTimeoutMs |
30000 |
1..3600000 |
fallback 流超时。 |
FallbackRateWindowMs |
1000 |
1..3600000 |
fallback 限速窗口。 |
MaxFallbackFlowsPerWindow |
64 |
1..1000000 |
每个窗口允许的 fallback 流数量。 |
FallbackByteRateLimitBps |
1000000 |
1..100000000000 |
fallback 字节速率上限。 |
InvalidProbeRateWindowMs |
1000 |
1..3600000 |
无效探测限速窗口。 |
MaxInvalidProbesPerWindow |
128 |
1..1000000 |
每个窗口允许的无效探测数量。 |
SSLPreRead¶
[SSLPreRead "..."] 只允许出现在全局配置中:
[SSLPreRead "web-a"]
Listen = 0.0.0.0:443
SNI = cdn-a.example.com
Upstream = 127.0.0.1:8443
[SSLPreRead "default"]
Listen = 0.0.0.0:443
SNI = default
Upstream = 127.0.0.1:4430
| 字段 | 必填 | 格式 | 说明 |
|---|---|---|---|
| section name | 是 | [SSLPreRead "name"] |
name 不能为空,不能包含 "、\、NUL 或换行。 |
Listen |
是 | 数字 ip:port,端口非 0 |
与 QRE front 共享的监听地址。 |
SNI |
是 | hostname 或 default |
匹配 TLS ClientHello SNI。每个 Listen 只能有一个 default。 |
Upstream |
是 | host:port 或 [ipv6]:port |
passthrough 上游。 |
同一个 Listen + SNI 组合不能重复。SSLPreRead 不接受 Device、Address、Dest、ServerName、REALITY key 等接口字段。
Server profile¶
/etc/qre/dev/qre0.conf
[Server]
Device = qre0
Address = 10.44.0.1/32
Listen = 0.0.0.0:443
MTU = 1280
Dest = www.example.com:443
ServerName = www.example.com
RealityPrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
RealityShortIds = 0123456789abcdef
RealityMaxTimeDiff = 120
| 字段 | 必填 | 范围/格式 | 说明 |
|---|---|---|---|
Device |
是 | 1 到 15 字符;以 ASCII 字母开头;可含字母、数字、_、-、. |
QRE netdev 名称。 |
Address |
是 | IPv4/IPv6 CIDR | 配置到 QRE 设备上的地址。 |
Listen |
是 | 数字 ip:port,端口非 0 |
服务端 REALITY/QUIC 监听地址。 |
MTU |
是 | 1280..9000 |
QRE 设备 MTU。 |
Dest |
是 | host:port 或 [ipv6]:port |
伪装目标。host 会被规范化为小写。 |
ServerName |
是 | hostname | 握手使用的 SNI 名称,会被规范化为小写。 |
RealityPrivateKey |
是 | base64 或 URL-safe no-pad base64,解码后 32 字节 | 服务端 X25519 私钥。 |
RealityShortIds |
是 | 逗号分隔 hex,每项 2 到 16 个 hex 字符且长度为偶数 | 服务端接受的 short id 列表。 |
RealityMaxTimeDiff |
是 | 1..86400 秒 |
REALITY 时间偏差容忍窗口。 |
Client profile¶
/etc/qre/dev/qre0.conf
[Client]
Device = qre0
Address = 10.44.0.2/32
MTU = 1280
Endpoint = 203.0.113.10:443
ServerName = www.example.com
RealityPublicKey = AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE=
RealityShortId = 0123456789abcdef
PersistentKeepalive = 25
| 字段 | 必填 | 范围/格式 | 说明 |
|---|---|---|---|
Device |
是 | 同 server | QRE netdev 名称。 |
Address |
是 | IPv4/IPv6 CIDR | 配置到 QRE 设备上的地址。 |
Endpoint |
是 | host:port 或 [ipv6]:port |
服务端公网地址。 |
MTU |
是 | 1280..9000 |
QRE 设备 MTU。 |
ServerName |
是 | hostname | REALITY/QUIC 握手使用的 SNI。 |
RealityPublicKey |
是 | base64 或 URL-safe no-pad base64,解码后 32 字节 | 服务端 X25519 公钥。 |
RealityShortId |
是 | 2 到 16 个 hex 字符且长度为偶数 | 客户端使用的 short id。 |
PersistentKeepalive |
是 | 0..65535 秒 |
客户端保持会话活跃的间隔,0 表示关闭主动保活。 |
Hooks¶
以下字段可以出现在 [Server] 或 [Client] 中:
PreUp = ip rule add from 10.44.0.2 table 100
PostUp = ip route add default dev qre0 table 100
PreDown = ip route del default dev qre0 table 100
PostDown = ip rule del from 10.44.0.2 table 100
| Hook | 执行时机 |
|---|---|
PreUp |
up 同步内核配置前。 |
PostUp |
地址配置成功后、保存 state 前。 |
PreDown |
down 删除地址和设备前。 |
PostDown |
删除内核设备后、移除 state 前。 |
hooks 通过 sh -c 执行,是兼容行为。生产部署更推荐把路由策略写入明确的系统管理配置,减少 profile 对 shell 环境的依赖。
验证配置¶
showconf 会输出标准化 JSON,并在字段缺失、格式错误、section 混用或重复字段时返回非零退出码。strip 按 profile 名称读取配置目录,适合检查 daemon 实际会读取的文件。