プログラミング
Rama 0.4: システムプロキシとPACサポート
Rama 0.4: System proxy and PAC support (plabayo.tech)
要約
Rama 0.4がリリースされ、システム全体のプロキシ設定とプロキシ自動設定(PAC)ファイルのサポートが追加されました。このバージョンでは、ttRPCおよびgRPCのサポート、HAR WebSocket処理の改善、その他多数の機能強化も行われています。
全文翻訳
0.3のリリースから6週間後、約束された2〜8週間のリリースサイクル内で、Rama 0.4をリリースできたことを誇りに思います。このリリースは、多くの改善を行うことができただけでなく、長らくバックログにあったいくつかの項目に取り組むことができたため、非常に満足しています。
Ramaは初めてですか?プロジェクトのREADMEにある紹介をお読みください。その後、Rama 101のブログシリーズを読むことをお勧めします。
技術的な詳細については、https://github.com/plabayo/rama/blob/main/CHANGELOG.mdにある完全なCHANGELOG(rama 0.4リリースノートを含む)をお読みください。また、いつでもRamaでサポートされているプロトコルやその他の機能の概要をhttps://ramaproxy.org/#featuresで見つけることができます。
システムプロキシ設定
Ramaは長らくHTTP、TLS上のHTTP(HTTPS)、およびSOCKS5プロキシをサポートしてきました。最も簡単な方法は、ProxyRoute(s)(以前はProxyAddressとして直接挿入されていました)を使用して直接設定することです。アプリケーション内では、これらはハードコーディングされるか、何らかの設定を介して公開されます。ブラウザやエディタなどがその例で、設定ファイルやGUIを介してプロキシを設定できます。このアプローチについては、Ramaブックの「Application Proxies」の章で詳しく読むことができます。
アプリケーションは、HTTP_PROXY環境変数もサポートしていることがよくあります。curlはCGIの理由で小文字のhttp_proxyバリアントを使用しますが、ProxyEnvLayerを使用する際には、デフォルトでこの規則に従います。とはいえ、ALL_PROXY、HTTPS_PROXY、NO_PROXYなど、より一般的な環境変数もあります。特にNO_PROXYは、一部の(サブ)ドメインがプロキシを経由しないようにするためのバイパスルールを追加するために使用されます。これらすべてが、ProxyEnvLayerおよびNoProxyEnvLayerを介してサポートされるようになりました。
しかし、ご存知かもしれませんが、オペレーティングシステムはシステム全体でプロキシを設定することも許可しています。ここでは、HTTP、HTTPS、SOCKS5プロキシを設定できるほか、プロキシしないもののバイパスルールも設定できます。これらはすべて、前述の環境変数と非常によく似ていますが、システム全体です。もちろん、一般的に、アプリケーションがこれらのシステム設定設定を尊重することを強制するものは何もありません。それは、アプリケーションがそれを望まないか、単にそのための組み込み機能を持っていないかのいずれかです(これは、これまでRamaを使用して構築されたネットワーククライアントの場合でした)。Rama 0.4では、SystemProxyLayerを介してこれが標準でサポートされています。Ramaブックの「System Proxies」の章で、これらの設定がどのように機能するかを詳しく学ぶことができます。
システム設定では、JavaScriptファイルを使用してプロキシを動的に選択することもできます。これはプロキシ自動設定(PAC)として知られています。これを行うには、JavaScriptランタイムが必要です。これはRama 0.4より前にRamaが提供していたものではありません。今、私たちはそれを持っています。rama-jsにより、WASMランタイム内でJavaScriptランタイムを実行できるようになりました(wasmtimeを使用します。これは将来的にrama-wasmを構築するためにも使用するランタイムです)。これは、JavaScriptランタイムがクラッシュしてもプロセス全体が停止しないように、分離を提供するため重要です。Google Chromeのようなアプリケーションは、JavaScriptエンジンを別のOSプロセスで実行します。Ramaフレームワーク内では、代わりにWASMランタイム内でこれを行うことを選択しました。同じ分離ですが、Ramaを使用して構築された任意のアプリケーションが別のプロセスを実行およびバンドルすることを許可する必要はありません。
Ramaは現在、PACサポートをrama-pacクレートを介して提供しており、PACランタイムを介してPACスクリプトを評価できるだけでなく、すべての目的がドメインXをプロキシルールYにルーティングすることである場合にスクリプトを簡単に生成することもできます。
これらの新しいRamaフレームワークの機能を試したい場合は、コマンドラインアプリケーション(CLI)でも簡単に試すことができます。Ramaブックの「rama binary」の章でインストール方法を学ぶことができます。
クライアント送信コマンドは標準でサポートされています(環境変数やコマンド引数で上書きしない限り)。
現在、rama pacサブコマンドがあり、PACスクリプトを生成したり、REPLを介してPACスクリプトを評価したりできます。後者は特に便利です。なぜなら、これ以前はPACファイルで遊ぶことができる環境は非常に古く、あまり知られていないアプリケーションだけだったからです... 私に言わせれば、ネットワークCLIツールキットへのもう一つの素晴らしい追加です。
tTRPCとgRPC
プロトコルに関しては、Ramaは現在、新しいrama-ttrpcクレートを介してttRPCもサポートしています。これはgRPCの軽量な代替手段と見なすことができ、TCPのようなトランスポートプロトコル上で直接実行されますが、依然としてprotobuf(proto)コントラクトを介します。
ただし、この分野で新しいクレートはこれだけではありません。rama-grpc-macrosクレートもあり、Ramaは、単一行のprotoを書くことなく、代わりに独自のコーデック(オプションでSerdeによって駆動される、define_serviceを参照)を利用して、gRPCクライアント側およびサーバー側のコードを生成する能力をもたらします。すでにgRPCを使用しており、スタック全体を制御している人々にとって素晴らしいでしょう。
HAR WebSockets
HAR(HTTP Archive)にはWebSocketデータ用のサポートがあることが判明しました。この最後の瞬間のRama 0.4のサプライズは、商用パートナーのおかげで私たちの注意を引きました。ただし、これはあまり知られていない機能です。数年前にChromeに追加されましたが、他の多くのアプリケーションはまだそれを採用していません。そのため、実装のガイドとして主にChromeを使用しました。
現在サポートされており、以前のHARエクスポート実装が、一貫性と順序付けのためにメモリに保持しすぎていたことが判明しました。これらはすべて解決され、ストリーム全体をメモリにバッファリングすることなく、HTTPおよびWSデータをディスクにきれいにストリーミングできるようになりました。
Rama CLIのsendコマンドも、実行したHTTP/WS会話のHARファイルをエクスポートするサポートを追加しました。これを行うには、--har引数を使用できます。
その他の変更と改善
いくつかの破壊的変更と多数の改善があります。完全なリストについては、チェンジログを参照してください。しかし、いくつか例を挙げると:
私たちのピーカー(トランスポートストリーム上で流れるプロトコルをチェックするために使用されます。Ramaブックの「Protocol Inspection」の章を参照してください)は、バイトがもはやヒューリスティクスを満たせない場合に、できるだけ早く失敗できるようになり、いくつかの軽微なバグ修正も受けました。HTTPピーカーローターは、HTTPヘッダー行と混同される可能性のある一般的なメソッド名をスキップするようにオプトインできるようになりました。PINGのような一部のケースでは、これらはタイムアウトまでピーカーロジックを不必要に遅延させる可能性があり、理想的ではありません。この追加設定を使用すると、ほとんど、あるいはすべてのそのようなエッジケースを防ぐことができるはずです。
このリリースでは、Apple Network Extensionサポートにもさらに改善が加えられました。これは、L4およびL3プロキシをAppleプラットフォーム用に構築するためにそれを依存している人々にとって、大いに感謝されるでしょう。
私たちの(クライアント)接続サービスは、わずかに異なるトレイトシグネチャを持つようになり、より良いエラー処理と、いつ再試行すべきか、いつ完全に失敗すべきかを知るなどのスマートな意思決定が可能になりました。
PACの関数として、入力拡張機能に複数のプロキシルート(アドレス)を挿入できるようになり、指定された順序で試行されます。既存のプロキシDB機能も、デフォルトでこれをうまく利用していますが、古いランダムな単一プロキシ選択動作が必要な場合は、引き続きオプトインできます。
感謝
このリリースを、Ramaを可能にした、そして可能にし続けているすべての人々に感謝する機会としたいと思います。貢献者、私たちが依存しているプロジェクト、そして私たちがフォークしたプロジェクト、より広いTokioおよびRustエコシステム、スポンサー、そしてもちろん商用パートナーです。
今後のリリースを非常に楽しみにしています。
ヒント
興味がありますか?マイルストーンをご覧ください。
このブログRSSフィードを購読するか、Ramaで作成した独自のシステム内でプライバシーを考慮してメールを保存する、私たち自身が書いたニュースレターを購読することもできます。
Ramaだけで、または組織と共に何かを構築していますか?メールまたはDiscordで私たちと共有してください。
Ramaで構築していますか?