Repository navigation
v0.8.0
Veil v0.8.0 リリースノート — API サーバライブラリ・サービスメッシュ・動的設定
Veil v0.8.0 は、「veil を組み込む API サーバライブラリ(Rust・C・Python)」・「Istio / Linkerd のメッシュのプロキシの置き換え」・「制御プレーンからの動的設定(VDS)と ACME」 の 3 本柱のリリースです。
あわせて、待ち受け設定を listen / listen_cleartext の 2 つに整理しました(旧キーは起動エラーになります。アップグレード手順)。公開の前に、攻撃面ごとのセキュリティ監査で見つかった要求の密輸・ルート制限の素通り・本文の上限漏れを直しました。リリース前には 6 OS・2 アーキテクチャのすべてで単体・統合・E2E・ライブラリの試験と性能の計測を回し直しています。
目次
- API サーバライブラリ(Rust・C・Python)
- サービスメッシュのデータプレーン(Istio・Linkerd)
- 動的設定・証明書・コンテナ運用
- セキュリティ監査と主な不具合修正
- 性能(v0.8.0)
- 既知の制限事項・運用上の注意点
- アップグレード手順
- 公開先と配布物
主なハイライト
+--------------------------------------------------------------------------------------------------+
| Veil v0.8.0 |
+--------------------------------------------------------------------------------------------------+
| 1. API サーバライブラリ: #[veil::route]・OpenAPI・gRPC・L4 ハンドラ、C API、Python(veil-api) |
| ネイティブハンドラは tokio 上の axum と同等、Python は FastAPI の 2.1〜2.5 倍 |
| 2. Istio のサイドカー / ゲートウェイ / waypoint と Linkerd のプロキシを veil で置き換え |
| Istio のサイドカーで最大 rps 2.1 倍・要求あたりの CPU 0.41 倍(本家 Envoy 比) |
| 3. VDS(gRPC 双方向ストリーム / REST、ACK・NACK・冗長化)と ACME(HTTP-01) |
| 4. 待ち受けを listen(TLS)と listen_cleartext(平文 HTTP/1.1 + h2c)に整理(旧キーは削除) |
| 5. セキュリティ監査: 要求の密輸・パスの正規化・本文の上限・キャッシュの共有など 21 件を修正 |
| 6. HTTP/3: 輻輳制御 cubic・経路 MTU の探索・本文のゼロコピー。対 nginx 1.21×(Linux) |
| 7. ghcr.io のイメージ(io_uring が使えなければ epoll 版へ自動切替)・crates.io・PyPI へ公開 |
+--------------------------------------------------------------------------------------------------+
1. API サーバライブラリ(Rust・C・Python)
Why it matters: veil のネットワーク層(io_uring・TLS・kTLS・HTTP/1.1・2・3・ホットリロード・サンドボックス)を、プロキシの裏にアプリを置く代わりに、アプリそのものとして使えるようにしました。プロキシ用のビルド(
full*)にはライブラリのコードは入りません。
使い方の全体は docs/guide/library.md(日本語)にあります。
| 対象 | 内容 | チケット |
|---|---|---|
| Rust | #[veil::route] でハンドラ登録、FastAPI 方式の引数束縛と自動バリデーション(422)、config.toml の取り込みとビルダでの上書き |
F-188 |
| OpenAPI | 3.1 の自動生成・Swagger UI・#[derive(veil::Schema)] |
F-189 |
| tower / tokio | Service / Layer 互換。veil::tokio(tokio 無しの互換層)で axum・hyper・reqwest などが動く |
F-190・F-198・F-204 |
| gRPC | unary・ストリーミング 3 種・デッドライン・圧縮(tokio 非依存)。veil-build が .proto から生成 |
F-197・F-208・F-209 |
| GraphQL | 利用者が async-graphql を載せる形(サンプル examples/api/rust-graphql) |
F-191・F-207 |
| L4 | TCP / UDP のリスナーに Rust 関数をハンドラとして登録 | F-192 |
| C | libveil.so / libveil.a + veil.h |
F-193・F-210 |
| Python | PyO3 の veil-api(import veil)。FastAPI 風デコレータ、grpcio の生成コードもそのまま使える |
F-194・F-210・F-212 |
| 成果物 | C ライブラリ・Python wheel・Rust ソースを 1 個の zip に | F-195 |
性能は library.md の「性能」(F-201・F-202・F-205・F-206)。Rust のネイティブハンドラは tokio 上の axum と同等、Python は FastAPI の 2.1〜2.5 倍です。
2. サービスメッシュのデータプレーン(Istio・Linkerd)
Why it matters: 制御プレーン(istiod、Linkerd の destination・identity・policy)を無改造のまま、注入されるプロキシ(Envoy・linkerd2-proxy)だけを veil に替えられます。veil の Pod と本家のプロキシの Pod は同じメッシュで相互に通信します。
詳細は docs/guide/mesh.md(日本語)。対応範囲は F-215〜F-225 です(透過転送・ワークロード ID の mTLS・L7 の重み付き分割やリトライ・認可・観測・Istio のサイドカー / ゲートウェイ / waypoint・Linkerd のプロキシ)。
kind の上の fortio の計測(mesh.md の「性能」):
| 経路 | 本家 | veil |
|---|---|---|
| Istio のサイドカー、HTTP/1.1 の最大 rps / 要求あたりの CPU(両側) | 3,221 / 685 µs | 6,732 / 280 µs |
| Istio のゲートウェイ、HTTP/1.1 の最大 rps | 5,597 | 11,125 |
| Linkerd のサイドカー、HTTP/1.1 / gRPC の最大 rps | 4,109 / 2,835 | 7,261 / 4,814 |
メッシュのプロキシを残して、その横でサイドカーとして veil を動かす構成(F-196)は docs/guide/kubernetes.md です。
3. 動的設定・証明書・コンテナ運用
| 機能 | 内容 | ガイド |
|---|---|---|
| VDS(F-04・F-199・F-211) | 制御プレーンからルート・アップストリームを配信。gRPC の双方向ストリーム(既定)か REST。検証に失敗したスナップショットは NACK して前の設定のまま。状態のメトリクス・管理 API・冗長化・初回の待ち | vds.md |
| ACME(F-05) | HTTP-01 で証明書を自動発行・更新し、既存のホットリロードで差し替え | acme.md |
| 環境変数の上書き(F-179) | VEIL_OVERRIDE_<n> に --override と同じ書式。優先は TOML < 環境変数 < CLI |
configuration.md |
| 証明書の受け渡し(F-180) | Docker secrets・Kubernetes Secret(..data の付け替えで自動リロード) |
tls.md |
| 待ち受けの整理(F-200) | listen(TLS の HTTP/1.1・2・3)と listen_cleartext(平文 HTTP/1.1・h2c)。旧キーは削除 |
§7 |
| コンテナイメージ(F-237) | ghcr.io/aofusa/veil(amd64・arm64)。io_uring が使えない環境(Docker の既定の seccomp・Linkerd の RuntimeDefault)では同梱の epoll 版へ execve |
kubernetes.md の「イメージ」・packaging/README.md |
4. セキュリティ監査と主な不具合修正
公開の前に Claude Security のプラグインで攻撃面ごとに監査し(F-236)、CRITICAL・HIGH を 0 にしました。設定で影響を受けるものは docs/guide/security.md に追記しています。個々の内容は各チケットにあります。
| 分類 | チケット |
|---|---|
| 要求の密輸(HTTP/2・3 → HTTP/1.1 のフィールド、chunked の終端の後ろのバイトと緩い解析、WebSocket のハンドシェイクの後ろのバイト) | B-135・B-142・B-143・B-145 |
ルート制限の素通り(正規化していないパス・IPv4 射影の IPv6・ルートキャッシュの固定シード・Respond/Redirect の [route.security]) |
B-138・B-139・B-141・B-148・B-133 |
| 要求ヘッダのポリシーが HTTP/1.1 にしか効かない(HTTP/2・3・WebSocket) | B-136・B-144 |
| 本文の上限が無い(HTTP/2・3 のバッファ経路・gRPC の解凍)・検査順のずれ | B-146・B-147・B-127・B-132 |
| 共有キャッシュが利用者ごとの応答を保存(Authorization・Set-Cookie・Vary) | B-140 |
メッシュ(XFF の左端・管理ポートの /shutdown)、Proxy-Wasm のホストを落とせる確保 |
B-137・B-149・B-131・B-134 |
| 依存の RUSTSEC 勧告(rustls 0.23.46・pyo3 0.29・wasmtime 36.0.18・quinn-proto) | B-155 |
そのほかの主な修正:
- io_uring の制限付きリングがバッファ選択の op を全部拒否していた(B-128)。 HTTP/3 の multishot 受信は常にフォールバックしていました。
- HTTP/1.1 のパイプラインの 2 つ目以降を本文として捨てていた(B-129)。 HTTP/2 の閉じたストリームの扱いで接続が止まる・切れる問題(B-121・B-123・B-130)。
- コンテナで起動後最初の静的配信が 404(B-154)。 seccomp のプロファイルに openat2 がありませんでした。
- Linux aarch64(glibc)で seccomp を有効にすると起動直後に abort(B-156)。 aarch64 の許可リストに rseq がなく、glibc 2.35 以降が
Fatal glibc error: rseq registration failedで止まっていました(glibc/arm64のイメージ・arm64の deb・aarch64の rpm と gnu の tar.gz)。 - 平文リスナーが最初のバイトを 200ms しか待たなかった(B-122)。
- reactor のタイマーの切り捨てで poller が空回り(B-152)。
5. 性能(v0.8.0)
結果の正は docs/perf/README.md、改善の内容は F-240 です。v0.8.0 から、nginx 側にも中継・圧縮・HTTP/3 の「同じ仕事の相手」を置いて比べています。
| 計測 | 結果 |
|---|---|
| Linux x86_64、対 nginx(中央値) | HTTP/1.1 1.29×・HTTP/2 1.76×・HTTP/3 1.21×・h2c 2.48×。全 120 構成で nginx 以上 |
| Linux x86_64、対 v0.7 系の main | 全体 1.002、HTTP/3 1.138 |
| FreeBSD 14.3 aarch64、要求あたりの CPU(nginx / veil) | 16 項目中 15 項目で 1.00 以上(HTTP/2 静的 1.52〜1.57、h2c 1.60〜1.79) |
6. 既知の制限事項・運用上の注意点
- FreeBSD の HTTP/3 54KB は、要求あたりの CPU が nginx の 1.06 倍(スループットは同等)。 v0.8.0 で 1.15 倍から縮めましたが、残りは quiche の送出と損失回復の内部処理です(docs/perf/README.md)。
- ライブラリの制限は library.md の「制限事項」、メッシュの違い・制限は mesh.md の「違い・制限」 にあります。未着手の残件は F-226(TOML のルートのタイムアウト・リトライ・ミラー)・F-227(RuntimeDefault の下の io_uring)・F-228(ztunnel)・F-229(ext_authz)・F-230(メッシュの試験の残り)です。
- API ライブラリ:
App::tokio_service(axum の Router のマウント)はネイティブハンドラの 76% です(F-235。目標の 85% に届かず)。HTTP/3 では io_uring が epoll より 2 割遅い(F-214)、HTTP/2 の PING の受け付け方針は未実装(F-213)。 - Windows の E2E は配布物でのスモークだけです。 E2E のハーネスが UDS など Windows で使えない構成を含むためです(platform_verification.md)。Windows aarch64 の配布物は実機で確かめていません。
- v0.7 系からの制約はそのまま。 NetBSD・BSD aarch64 の Wasm は Pulley で、NetBSD は
paxctl +mが要ります(platforms.md)。
7. アップグレード手順
- 待ち受けの旧キーは削除されました(F-200)。
tls_only・http・h2c_enabled・h2c_listen・h2c_http1・http3_enabledを書くと、移行先を示すエラーで起動しません。対応表は examples/config.toml の冒頭 と configuration.md にあります。平文のリスナーは既定で https への 301 だけを返します。平文で配信するときはenable_secure_redirect = falseを書いてください。 - 要求のパスを正規化してから照合・転送します(B-148、
[security] path_normalization = "base"が既定)。%XXの戻し・./..の除去をした後のパスが上流に届きます。以前の動作は"off"です。 - 共有キャッシュは
Authorization付きの要求を素通りし、Set-Cookieの応答を保存しません(B-140)。 利用者ごとの応答をキャッシュしたいときはkey_headersに入れます(compression-cache.md)。 - HTTP/3 の既定が変わりました(F-240)。 輻輳制御
cubic(以前はbbr)、max_udp_payload_size = 1452とdiscover_pmtu = true、reactor のrecv_drain_max = 1024。 - ライブラリとして使う場合のクレート名は
veil-proxyです(F-238)。veil = { package = "veil-proxy", version = "0.8" }と書けば、コードのveil::はそのままです。Python はpip install veil-api。
設定の検証とリロード、ソースからのビルドは v0.7 系と同じです(running.md・building.md)。
関連
- 計測: docs/perf/README.md
- 全プラットフォーム検証: docs/perf/platform_verification.md
- 利用ガイド: docs/guide/
- 設定の全キー: examples/config.toml
- チケット: docs/backlog/backlog.md の F-04・F-05・F-179〜F-240、B-120〜B-156
8. 公開先と配布物
タグ v0.8.0 の push で、.github/workflows/release.yml が次を公開します(packaging/README.md の「公開」)。
| 公開先 | 中身 |
|---|---|
ghcr.io/aofusa/veil |
latest=musl=musl-v0.8.0、glibc=glibc-v0.8.0(linux/amd64・linux/arm64、cosign 署名) |
| crates.io | veil-proxy・veil-proxy-macros・veil-proxy-build(docs.rs) |
| PyPI | veil-api(manylinux・musllinux・macOS・Windows の wheel と sdist。文書は Read the Docs) |
以下の配布物は、すべて --profile dist(fat LTO・codegen-units=1・シンボル除去)で直列にビルドしました。packaging/scripts/verify-artifacts.sh で最終のソースから作られたことを確かめています。Linux・macOS・Windows x86_64 の配布物は、実機または VM でそのバイナリを起動して確認しました。
| ファイル | 対象 | 備考 | SHA-256 |
|---|---|---|---|
veil_0.8.0_amd64.deb |
Linux x86_64(Debian / Ubuntu) | glibc 2.28 互換 | 49680193f5447c945b0b2f65cae9dcdaab79a64989f38af52d102a4ac67180a7 |
veil_0.8.0_arm64.deb |
Linux aarch64(Debian / Ubuntu) | glibc 2.28 互換 | a201cd8327293d9a72285e1321caa4d76a42c15026a7ef6f6395f45992ac3341 |
veil-0.8.0-1.x86_64.rpm |
Linux x86_64(RHEL / Amazon Linux 2023 など) | glibc 2.28 互換 | 451881b8713486b499ace865dbacbfa7950aef1d93d0efc3e5b529972cfe7a7c |
veil-0.8.0-1.aarch64.rpm |
Linux aarch64(RHEL / Amazon Linux 2023 など) | glibc 2.28 互換 | 6966c1086ef01e80285dcb38e0a7c16b2aeea5d36dda30032ee03c2c0497b5ec |
veil-0.8.0-x86_64-unknown-linux-gnu.tar.gz |
Linux x86_64 | glibc 2.28 互換 | e73b9c00fadddd874109b32da4f8f259dc2a315efaf6336c39099d45c9a9257a |
veil-0.8.0-aarch64-unknown-linux-gnu.tar.gz |
Linux aarch64 | glibc 2.28 互換 | e282f78217b1823f1333646b3bbba05c098d9caae04a1274864c33a075d9e8a1 |
veil-0.8.0-x86_64-unknown-linux-musl.tar.gz |
Linux x86_64 | musl 静的リンク | c6ef20d1e56af599437e7f4bbc0655bce0e571e5b572e9236ca769bc1b04d055 |
veil-0.8.0-aarch64-unknown-linux-musl.tar.gz |
Linux aarch64 | musl 静的リンク | ba6fa92517ed54b7eac79ad67692ee12e7cc44ed251d6ed2f9a1c588c57aac0f |
veil-0.8.0-universal2-apple-darwin.tar.gz |
macOS(x86_64 + Apple Silicon) | universal2 | 9ea553a0f27a1303ed910815f5e8e9ea5255ea30b090fb61b01d96f7dfeb3f3b |
veil-0.8.0-x86_64-pc-windows-msvc.zip |
Windows x86_64 | d0532d9eb8f3b062e1d460f981f25791867b026c5de6aa3a3225cf15b10f2b9b |
|
veil-0.8.0-aarch64-pc-windows-msvc.zip |
Windows aarch64 | 実機未検証 | 7284c1fb122dc614158b3fa6f75b0ade0d1f8f3cfe4d81ad88d43040bff73805 |
veil-0.8.0-x86_64-unknown-freebsd.tar.gz |
FreeBSD 14.3 x86_64 | 0d1e02e40433242de797633c03d76d7aced2cdf481c5f2ad5aa8d11e9c67804b |
|
veil-0.8.0-aarch64-unknown-freebsd.tar.gz |
FreeBSD 14.3 aarch64 | Wasm は Pulley | e2565686c443e3a95865b053b1c32ff75de8ddae64f61f0cc1b5d073ccf0453f |
veil-0.8.0-x86_64-unknown-openbsd.tar.gz |
OpenBSD 7.9 x86_64 | Wasm は Pulley | 4c0bb0bf44e416fdf17160ac2eb7f93438c519d71cd9f6f56ed6df4fa5256299 |
veil-0.8.0-aarch64-unknown-openbsd.tar.gz |
OpenBSD 7.9 aarch64 | Wasm は Pulley | dbc9372f88b7e4fda5118b6478b9a3618be09695942382bd2f7a3a750208e147 |
veil-0.8.0-x86_64-unknown-netbsd.tar.gz |
NetBSD 10.1 x86_64 | Wasm は Pulley・paxctl +m が必要 |
35371a661e05398f76acdff338aee413b5e7f92c56fe4509a1dc2ca0c0467191 |
veil-0.8.0-aarch64-unknown-netbsd.tar.gz |
NetBSD 10.1 aarch64 | Wasm は Pulley・paxctl +m が必要 |
808062d0a0f8ed109f06cf34cd8b3a29dfff9b26a2fd451ee7ad306c6f8eb197 |
veil-lib-0.8.0-x86_64-linux-gnu.zip |
API ライブラリ(C・Python wheel・Rust ソース) | manylinux_2_28 | b27be924425552698d504478c926137e4e2b220fdec97eb1cbdfae4eac9694fd |