YakitとProxyブラウザ拡張機能の連携がもたらす新たなミッドルウェア体験

Yakitユーザーにとって、設定不要のブラウザ環境は大きな利便性を提供しています。ワンクリックで、事前に設定済みのYakit MITMプロキシ環境を持つブラウザが起動され、通常のブラウザと完全に分離された運用が可能です。

この体験をさらに強化し、従来のProxy SwitchyOmegaのような切り替え機能を代替するため、独自のブラウザ拡張機能を開発しました。現在、設定不要ブラウザの起動は、固定のchromeFlagsではなく、--load-extensionオプションを使って自作の拡張を読み込む形になっています。

拡張機能は、現在アクセス中のページがhttp://mitm/である場合に、content.jsを注入して「現在プロキシ制御中」という通知を表示します。また、拡張をツールバーにピン留めすることで、後続の操作がよりスムーズになります。

注:現在のフローティングUIは、特定のドメインにアクセス時のみ表示されます。他のサイトでは拡張アイコンから手動で操作可能です。

デフォルトのプロキシ設定は、「設定不要Chromeを起動」時に指定した値(例:http://127.0.0.1:9999)に基づいています。拡張の有効化後、ブラウザは通常の動作と同様に扱えます。

  • [Yakit MITM]を選択すると、通信はすべてYakitのMITMプロキシ経由で処理されます。
  • [システムプロキシ]を選択すると、通常のブラウザと同じように直接接続され、Yakitのミドルウェアには通らない。

カスタムプロキシの追加も簡単に行えます。内部実装では、Chrome Extensions API の chrome.proxy を利用しており、主な構成は以下の通りです:

Chrome Proxy設定のモード

proxy.ProxyConfigオブジェクト内で定義されるmode属性によって、全体的なプロキシ振る舞いが決定されます。

  • direct:すべての接続が直接行われ、プロキシは使用しない。他のパラメータは不要。
  • auto_detect:PACスクリプトによって自動的にプロキシ設定が決定される。
  • pac_script:指定されたURLまたはdata内のスクリプト内容に基づき、プロキシ設定が適用される。他のパラメータは不可。
  • fixed_servers:proxy.ProxyRulesに記述された固定サーバーを使用。詳細なルール構造は該当文書参照。
  • system:OSのグローバル設定を反映。他の設定は無効。

プロキシ設定のコード例

fixed_servers モード

const proxyConfig = {
  mode: 'fixed_servers',
  rules: {
    singleProxy: {
      scheme: 'http',
      host: '127.0.0.1',
      port: 9999
    },
    bypassList: ['localhost', '127.0.0.1']
  }
};

await new Promise(resolve => {
  chrome.proxy.settings.set({
    value: proxyConfig,
    scope: 'regular'
  }, resolve);
});

pac_script モード

const config = {
  mode: 'pac_script',
  pacScript: {
    data: `function FindProxyForURL(url, host) {
      if (host === 'www.yaklang.com')
        return 'PROXY 127.0.0.1:2080';
      return 'DIRECT';
    }`
  }
};

await new Promise(resolve => {
  chrome.proxy.settings.set({
    value: config,
    scope: 'regular'
  }, resolve);
});

プロジェクト構成

db/                 # IndexedDB操作用
public/
  - background.js   # 拡張のバックグラウンドスクリプト
  - content.js      # ページ内挿入用のコンテンツスクリプト
  - proxy/          # プロキシ関連ロジック
manifest.json       # 拡張定義ファイル
src/
  - components/     # Reactコンポーネント
  - pages/          # ページビュー
  - types/          # TypeScript型定義
  - network/        # ネットワーク通信処理

manifest.jsonでは、proxy権限を明示的に宣言する必要があります:

{
  "manifest_version": 3,
  "name": "Yakit Chrome Endpoint",
  "permissions": [
    "proxy"
  ],
  ...
}

現状のUIとユーザーインターフェースはまだ簡素であり、改善の余地があります。しかし、Proxy SwitchyOmegaが広く支持されている理由が理解できます。その切り替え機能の直感性と使いやすさは、今後の参考となるべき点です。

タグ: Yakit Chrome Extensions proxy MITM PAC Script

10月24日 02:13 投稿