fiord Advent Calendar 2025 6 日目の内容となります。
Browser-in-the-Browser について再度調べてから記事を書こう!と思っていたら、つい別のコンテンツがあったことを思い出しました。
仮想ブラウザ
Browser.lol というサービスをご存じでしょうか?仮想ブラウザを利用できるサービスで、端末外部にある別のインスタンス上で動いているウェブブラウザの画面をブラウザ内に表示し、端末とは隔離された環境でブラウザを使える、というものです。
セキュリティ的な観点であれば、VPN に類似した使い方も可能で、「仮想ブラウザからのみアクセス可能」といった制御も可能かもしれません。
一方で、端末の設定を変えたくない場合、つまり特定のバージョンのブラウザを利用して操作する/検証するような作業においても有用であると考えられます。
大まかな仕組み
インスタンスをリクエスト時に立ち上げ(あるいは用意しておき)、専用のブラウザを立ち上げてその画面をクライアントと共有します。
この画面共有に関してはサンドボックスサービスの技術と重複することとなり、大まかに下記の 2 つがあるかと思います。
- VNC/RDP over WebSocket 系: n.eko(WebRTC) で利用されています。後者と比べて若干遅いですが、愚直な方法な分互換性も高いです。
- Headless Browser + 差分をストリーミングする: BrowserBox がそうであると推測してます。Headless Browser を起動し、スクリーンショットを定期的に取得します。画像差分をストリーミングすることで通信量を抑えて、結果的にフレームレートを高めようとするものです。Headless であるため、必ずしも正常に動作する保証は出来ないかと。
試しに n.eko を使ってみる
n.eko は Docker を用いてローカルにサーバーを用意することが出来ます。試しに使ってみましょう。
$ git clone https://github.com/m1k1o/neko.git
$ docker compose up
この際、自分の環境(Windows11/WSL)では、下記のような docker-compose.yml にしました。
services:
neko:
image: "ghcr.io/m1k1o/neko/firefox:latest"
restart: "unless-stopped"
shm_size: "2gb"
cap_add:
- SYS_ADMIN
security_opt:
- "apparmor=unconfined"
ports:
- "8080:8080"
- "52000-52100:52000-52100/udp"
environment:
NEKO_DESKTOP_SCREEN: "1920x1080@30"
NEKO_MEMBER_MULTIUSER_USER_PASSWORD: neko
NEKO_MEMBER_MULTIUSER_ADMIN_PASSWORD: admin
NEKO_WEBRTC_EPR: "52000-52100"
NEKO_WEBRTC_ICELITE: 1
NEKO_WEBRTC_NAT1TO1: "127.0.0.1"
この状態で、http://localhost:8080 に接続し、ユーザー名はお好きなように、パスワードはデフォルトでは neko(通常ユーザ)、admin(管理者ユーザ)を入力してください。これは docker-compose.yml にて環境変数で指定されたものとなります。
n.eko は通常の仮想ブラウザのみならず、この仮想ブラウザを複数人で共有、チャットすることが可能です。これは面白い機能だと思います。
クライアントから n.eko が動作するサーバーを経由し、実際には n.eko 内部で動作するブラウザから外部へリクエストを行うため、VPN のような機能を有します。
また、ベースとなる Docker Image を変えることで、ブラウザのバージョンも変更出来そうです。ただし、この機能に関してはサービスとして動いている Browser.lol(無料版はリクエスト数に制限がありそう)や Browserling(無料版は 3 分/セッション)などを利用することが望ましいです。
まとめ(とおまけ)
このように、使い方次第では便利になりそうな技術として、仮想ブラウザを紹介しました。
...ところで、この機能は VPN として機能すると話しました。従業員が不正に情報を流出させる際のルートとして利用されないか心配です。
もし業務上利用しないのであれば、当該サービスのドメインへのアクセスはブロックしてしまった方がよいのかもしれません。

