|
1 | | -<config-dsl version="3" target-version="2.0.0-dev4"> |
| 1 | +<config-dsl version="4" target-version="2.0.0-dev4"> |
| 2 | + <ui title="配置文件生成器" brand="TUIC" mark="T" eyebrow="TUIC 2.0.0-dev4 · QUINN" |
| 3 | + description="填写连接信息,生成相互匹配的服务端与客户端配置。" |
| 4 | + reference="https://docs.ihsin.dev/tuic/tools/config-generator-reference/" mode-field="mode" format-field="format" |
| 5 | + export-hint="复制和下载始终包含真实密码。配对模式请分别保存两份配置。"> |
| 6 | + <section name="addresses" label="连接信息"/> |
| 7 | + <section name="authentication" label="用户认证"/> |
| 8 | + <section name="tls" label="TLS 与证书"> |
| 9 | + <notice when="acme" text="域名需指向服务器,ACME HTTP-01 验证使用 TCP 80;同时开放 TUIC 的 UDP 监听端口。"/> |
| 10 | + <notice when="serverSelf" text="自签名仅用于受控测试。配对测试需明确跳过证书校验。"/> |
| 11 | + </section> |
| 12 | + <section name="local" label="本地代理" when="client"/> |
| 13 | + <section name="transport" label="高级选项" detail="日志 · 重连 · 端口转发" collapsed="true"> |
| 14 | + <notice text="客户端 UDP 模式、自定义信任证书和拥塞控制暂未接入运行逻辑,本生成器不输出这些选项。"/> |
| 15 | + </section> |
| 16 | + <notice when="insecureClient" text="当前客户端配置跳过证书校验,仅适合受控测试。"/> |
| 17 | + <notice when="exposedLocal" text="SOCKS5 正在监听非回环地址且未启用认证,请确认访问范围。"/> |
| 18 | + <notice when="zeroRtt" text="0-RTT 早期数据可能被重放。"/> |
| 19 | + <notice text="此处仅检查配置字段。证书文件、DNS、防火墙和实际连接需要在部署环境验证。"/> |
| 20 | + </ui> |
| 21 | + <validators> |
| 22 | + <validator name="required" kind="required" message="请填写此项。"/> |
| 23 | + <validator name="host" kind="host" message="请输入可连接的域名或 IP,不含端口、路径或通配监听地址。"/> |
| 24 | + <validator name="port" kind="integer" min="1" max="65535" message="端口必须是 1–65535 的整数。"/> |
| 25 | + <validator name="socket" kind="socket" message="请输入有效的 IP:端口;IPv6 使用方括号。"/> |
| 26 | + <validator name="email" kind="email" message="请填写有效的邮箱地址。"/> |
| 27 | + <validator name="socks-credential" kind="length" nonblank="true" min="1" max="255" message="SOCKS5 认证字段必须为 1–255 字节。"/> |
| 28 | + <validator name="milliseconds" kind="integer" min="1" max="9007199254740991" message="请输入大于 0 的安全整数(毫秒)。"/> |
| 29 | + <validator name="seconds" kind="integer" min="1" max="9007199254740991" message="请输入大于 0 的安全整数(秒)。"/> |
| 30 | + <validator name="endpoint" kind="endpoint" message="目标必须是域名或 IP 加端口。"/> |
| 31 | + <validator name="password" kind="length" min="1" message="请输入密码,或点击生成凭据。"/> |
| 32 | + <validator name="uuid" kind="uuid" transform="trim lowercase" message="请输入非全零的标准 UUID,或点击生成凭据。"/> |
| 33 | + <validator name="domain" kind="domain" message="请填写有效的 DNS 域名。"/> |
| 34 | + <validator name="publicDomain" kind="public-domain" message="请填写公开域名。"/> |
| 35 | + <validator name="loopback" kind="loopback-socket" message="请使用回环监听地址。"/> |
| 36 | + </validators> |
| 37 | + <effects><reset on="tlsMode" target="insecure"/></effects> |
| 38 | + <rules> |
| 39 | + <assert key="sni" when="client" message="请填写证书对应的 DNS 域名作为 SNI。"><valid ref="clientSni" rule="domain"/></assert> |
| 40 | + <assert key="hostname" when="server" message="请填写有效的证书域名。"><valid ref="serverHostname" rule="domain"/></assert> |
| 41 | + <assert key="hostname" when="acme" message="ACME 需要公开域名。"><valid ref="serverHostname" rule="publicDomain"/></assert> |
| 42 | + <assert key="insecure" when="pairedSelf" message="自签名测试需要明确开启跳过证书校验,或改用受信任证书。"><truthy from="/insecure"/></assert> |
| 43 | + <assert key="maxBackoff" when="validBackoff" message="最大等待不能小于首次等待。"><compare op="gte"><source from="/maxBackoff" transform="integer"/><source from="/initialBackoff" transform="integer"/></compare></assert> |
| 44 | + <unique collection="users" key="uuid" message="UUID 重复,请为每个用户使用不同 UUID。"><source from="uuid" transform="trim lowercase"/></unique> |
| 45 | + <unique collection="forwards" key="listen" when="validBinding" message="同一协议的监听地址重复。"><source from="protocol"/><source from="listen" transform="socket"/></unique> |
| 46 | + <assert collection="forwards" key="listen" when="validPorts" message="请使用与 SOCKS5 不同的监听端口。"><compare op="ne"><source from="listen" transform="port"/><source from="/local" transform="port"/></compare></assert> |
| 47 | + </rules> |
2 | 48 | <inputs> |
3 | 49 | <field name="mode" type="enum" default="pair" section="mode" label="生成模式"> |
4 | 50 | <option value="pair" label="配对生成" /> |
|
49 | 95 | <field name="initialBackoff" type="string" default="500" section="transport" label="首次重连等待(毫秒)" placeholder="500" hint="首次重连前等待的时间。" widget="number" when="reconnect" rule="milliseconds" /> |
50 | 96 | <field name="maxBackoff" type="string" default="30000" section="transport" label="最大重连等待(毫秒)" placeholder="30000" hint="应大于或等于首次等待时间。" widget="number" when="reconnect" rule="milliseconds" /> |
51 | 97 | <field name="activeUser" type="integer" default="0" section="internal" label="客户端使用的用户" /> |
52 | | - <collection name="users" initial-items="1"> |
53 | | - <field name="uuid" type="string" default="" label="UUID" rule="uuid" /> |
54 | | - <field name="password" type="string" default="" label="密码" widget="password" rule="password" /> |
| 98 | + <collection name="users" initial-items="1" min-items="1" label="用户" section="authentication" add-label="+ 添加用户" generate-label="生成凭据" hint="配对配置自动使用相同的 UUID 和密码。" selected-by="activeUser" all-when="server" select-when="client"> |
| 99 | + <field name="uuid" type="string" default="" label="UUID" rule="uuid" generator="uuid-v4" /> |
| 100 | + <field name="password" type="string" default="" label="密码" widget="password" rule="password" generator="hex" bytes="24" /> |
55 | 101 | </collection> |
56 | | - <collection name="forwards" initial-items="0" when="client"> |
| 102 | + <collection name="forwards" initial-items="0" when="client" label="转发" section="transport" add-label="+ 添加转发" hint="服务端默认拦截回环和私有目标地址。"> |
57 | 103 | <field name="protocol" type="enum" default="tcp" label="转发协议"> |
58 | 104 | <option value="tcp" label="TCP" /> |
59 | 105 | <option value="udp" label="UDP" /> |
|
74 | 120 | <condition name="zeroRtt"><truthy from="/zeroRtt"/></condition> |
75 | 121 | <condition name="udp"><eq from="protocol" value="udp"/></condition> |
76 | 122 | <condition name="ip"><ip ref="host"/></condition> |
| 123 | + <condition name="serverSelf"><all><use ref="server"/><use ref="self"/></all></condition> |
| 124 | + <condition name="pairedSelf"><all><use ref="serverSelf"/><use ref="client"/></all></condition> |
| 125 | + <condition name="insecureClient"><all><use ref="client"/><truthy from="/insecure"/></all></condition> |
| 126 | + <condition name="exposedLocal"><all><use ref="client"/><not><truthy from="/localAuth"/></not><valid from="/local" rule="socket"/><not><valid from="/local" rule="loopback"/></not></all></condition> |
| 127 | + <condition name="validBackoff"><all><use ref="reconnect"/><valid from="/initialBackoff" rule="milliseconds"/><valid from="/maxBackoff" rule="milliseconds"/></all></condition> |
| 128 | + <condition name="validBinding"><valid from="listen" rule="socket"/></condition> |
| 129 | + <condition name="validPorts"><all><use ref="validBinding"/><valid from="/local" rule="socket"/></all></condition> |
77 | 130 | </conditions> |
78 | 131 | <values> |
79 | 132 | <value name="host"><source from="/host" transform="trim unbracket"/></value> |
|
82 | 135 | </values> |
83 | 136 | <!-- TUIC 4719113 / Wind 9025349: literal output names, no executable code. --> |
84 | 137 | <outputs> |
85 | | - <object name="server" when="server"> |
| 138 | + <object name="server" when="server" label="服务端" filename="server" command="tuic-server -c {filename}"> |
86 | 139 | <string name="server" from="/listen" transform="trim"/> |
87 | 140 | <enum name="log_level" from="/logLevel" options="logLevel"/> |
88 | 141 | <boolean name="zero_rtt_handshake" value="true" when="zeroRtt"/> |
|
106 | 159 | </object></object> |
107 | 160 | </object> |
108 | 161 | </object> |
109 | | - <object name="client" when="client"> |
| 162 | + <object name="client" when="client" label="客户端" filename="client" command="tuic-client -c {filename}"> |
110 | 163 | <string name="server"><endpoint><source ref="host"/><source from="/port" transform="integer"/></endpoint></string> |
111 | 164 | <!-- Explicit IP also avoids the baseline client's IPv6 DNS formatting issue. --> |
112 | 165 | <string name="ip" ref="host" when="ip"/> |
|
0 commit comments