認証フィールドによってバージョンが決まります
TUIC は QUIC と TLS 1.3 上で動作します。現在のコアには独立した version フィールドがなく、認証フィールドに基づいてプロトコル分岐が選ばれます。空でない token が存在する場合は v4、それ以外は v5 を使用します。
どちらのバージョンにも、名前、type: tuic、サーバー、ポートが必要です。v4 では token、v5 では UUID とパスワードをさらに指定します。クライアントのバージョンをサーバー側と一致させる必要があります。
| プロトコルバージョン | 指定必須 | 省略必須 | 現在の実装における選択条件 |
|---|---|---|---|
| TUIC v4 | token | uuid、password | token が空でない |
| TUIC v5 | uuid、password | token | token が空 |
name必須- ノード名です。ポリシーグループやルールから参照されます。
type: tuic必須- TUIC アウトバウンドを選択します。
server / port必須- サーバーアドレスと単一の UDP 待受ポートを指定します。
tokenTUIC v4- v4 のユーザー識別子です。v5 を使う場合は指定しないでください。
uuid / passwordTUIC v5- v5 のユーザー UUID とパスワードです。v4 を使う場合は指定しないでください。
サーバーアドレスと TLS 検証
TUIC は TLS 1.3 を使用します。 sni を指定しない場合は server をサーバー名として使用し、 alpn を指定しない場合はクライアントが h3 を使用します。接続先アドレス、SNI、証明書名は個別に制御できますが、説明可能な一貫性を保ってください。
ip任意- server の DNS 解決結果を上書きします。実際の接続先 IP だけを変更し、デフォルトの SNI は変更しません。
sniTLS- TLS Server Name を設定します。接続先 IP と証明書のドメインが異なる場合は特に重要です。
alpnデフォルトは h3- サーバーが対応する ALPN の一覧を指定します。通常はデフォルト値を上書きする必要はありません。
skip-cert-verifyリスク- 証明書の検証を省略します。リスクを明確に理解している場合にだけ有効にしてください。
name-cert-verifyTLS- 証明書名の検証対象を個別に指定します。
fingerprintTLS- サーバー証明書のフィンガープリントを固定します。
certificate / private-keymTLS- サーバー側でクライアント証明書が必要な場合に、ペアで指定します。
ech-opts現在は機能しません- TUIC のオプションとしてこのフィールドは解析されますが、現在のダイヤル実装では TLS ハンドシェイクに適用されません。指定しただけで ECH が有効になったと考えないでください。
disable-sni高リスク- TLS Server Name を空にします。現在の実装では証明書の検証も強制的に省略され、SNI を隠すだけではありません。
QUIC の接続確立と接続ライフサイクル
TUIC の遅延関連オプションは、QUIC ハンドシェイク、タイムアウト、並行ストリームの動作を変えます。デフォルト値は一般的な状況に対応しているため、サーバー側の要件またはトラブルシューティング結果に根拠がある場合にだけ上書きしてください。
heartbeat-intervalデフォルトは 10000 ミリ秒- QUIC のキープアライブを送信する間隔です。単位は秒ではなくミリ秒です。
reduce-rtt0-RTT- QUIC の 0-RTT を許可して接続時間を短縮しますが、初期データにはリプレイ攻撃のリスクがあります。
request-timeoutデフォルトは 8000 ミリ秒- TUIC プロキシリクエストを確立する際のタイムアウトです。現在の実装では v4 クライアントの分岐だけが読み取り、v5 では無視されます。
congestion-controller任意- cubic、new_reno、bbr から選択できます。省略時は QUIC ライブラリのデフォルト動作を維持します。
bbr-profileBBR のみ- BBR では standard、conservative、aggressive のプリセットを選択できます。
max-open-streamsデフォルトは 100- 同時に開く QUIC ストリームの数を制限します。大きすぎる値は、メモリ使用量とスケジューリング負荷を増やす可能性があります。
fast-open任意- プロキシリクエストの確立待ちを短縮します。現在の TUIC v4 クライアント分岐では、このフィールドが直接使用されます。
UDP リレーとパケットサイズ
TUIC は TCP ストリームと UDP リレーの両方に対応しています。UDP リレーモードをサーバー実装と互換にし、パケットサイズはパス MTU に従ってください。値を大きくすればスループットが上がるわけではありません。
udp-relay-modeデフォルトは native- native または quic を選択できます。quic を明示しない限り、現在の実装では native を使用します。
max-udp-relay-packet-sizeデフォルトは 1252- UDP リレーのペイロード上限です。クライアントはさらに、QUIC Datagram の上限と v4/v5 のヘッダーオーバーヘッドに応じて調整します。
max-datagram-frame-size高度な設定- QUIC Datagram フレームの上限を制御します。現在の実装では最大 1400 バイトです。
disable-mtu-discovery高度な設定- パス MTU 探索を無効にします。回線に MTU の問題があると確認できた場合にだけ使用してください。
recv-window-conn / recv-window高度な設定- 単一ストリームおよび接続全体の QUIC 受信ウィンドウをそれぞれ制御します。通常はデフォルト値を維持してください。
ポート、難読化、セッションの境界
TUIC と Hysteria2 はどちらも QUIC を使いますが、設定できる機能は異なります。別のプロトコルのフィールドを、名前から推測してコピーしないでください。
| 機能 | TUIC の境界 | 使用しない項目 |
|---|---|---|
| ポート指定 | 単一の値 port | Hysteria2 の ports、hop-interval |
| 難読化 | プロトコル固有の obfs フィールドはありません | salamander、gecko、obfs-password |
| 接続のキープアライブ | heartbeat-interval と QUIC ストリーム | AnyTLS の idle-session-* |
| 認証 | v4 の token、または v5 の UUID とパスワード | Hysteria の auth-str |
v5 と v4 の設定例
以下に二つの独立したノードを示します。実際に使う際は、サーバーのバージョンと一致する認証フィールドの組み合わせだけを残してください。
- v5 ノードに token を残すと、現在の実装では v4 の分岐でクライアントが作成されます。
- UUID の形式が無効で、解析結果が v5 サーバーの認証を通過できません。
- heartbeat-interval を秒単位だと考えて 10 と指定すると、実際には 10 ミリ秒になります。
- disable-sni を有効にしても証明書が通常どおり検証されると誤解しています。現在の実装では証明書の検証も省略されます。
proxies:
- name: tuic-v5
type: tuic
server: server.example.com
port: 10443
uuid: 00000000-0000-0000-0000-000000000001
password: replace-with-v5-password
sni: server.example.com
alpn:
- h3
udp-relay-mode: native
- name: tuic-v4
type: tuic
server: server.example.com
port: 10443
token: replace-with-v4-token
sni: server.example.com
alpn:
- h3
udp-relay-mode: native