websockify は以前は wsproxy という名前で、noVNC プロジェクトの一部でした。
最も基本的なレベルでは、websockify は WebSocket トラフィックを通常のソケット トラフィックに変換するだけです。 Websockify は WebSocket ハンドシェイクを受け入れ、それを解析し、クライアントとターゲットの間で双方向のトラフィックの転送を開始します。
注目すべきコミット、発表、ニュースは @noVNC に投稿されます
あなたが websockify 開発者/インテグレーター/ユーザーである (またはなりたい) 場合は、noVNC/websockify ディスカッション グループに参加してください。
バグや機能リクエストは、github Issue 経由で送信できます。
websockify に感謝の意を示したい場合は、Compassion International、SIL、Habitat for Humanity、Electronic Frontier Foundation、Against Malaria Foundation、Nothing But Nets などの非営利団体に寄付してください。その場合は @noVNC にツイートしてください。 。
websockify 0.5.0 以降では、HyBi / IETF 6455 WebSocket プロトコルのみがサポートされます。古い Base64 エンコード データ形式はサポートされていません。
WebSocket 'wss://' URI スキームを使用してトラフィックを暗号化するには、Websockify がロードするための証明書とキーを生成する必要があります。デフォルトでは、Websockify は証明書ファイル名self.pem
をロードしますが、 --cert=CERT
および--key=KEY
オプションはファイル名をオーバーライドできます。 openssl を使用して自己署名証明書を生成できます。共通名を尋ねられたら、プロキシが実行されるサーバーのホスト名を使用します。
openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem
自己署名証明書が機能するには、クライアント/ブラウザーに自己署名証明書を理解させる必要があります。これを行うには、それを承認された証明書としてインストールするか、最初に移動して承認する HTTPS 接続に同じ証明書を使用します。通常、ブラウザは「信頼できる証明書?」を提供しません。無効な証明書を使用して WSS ソケットを開いてプロンプトを表示するため、これら 2 つの方法のいずれかで WSS ソケットを受け入れるようにする必要があります。
ポートは、ブラウザによって接続を区別するものと見なされます。たとえば、Web サイトの URL が https://my.local:8443 で、WebSocket URL が wss://my.local:8001 の場合、最初に https:/ を参照します。 /my.local:8001 に例外を追加し、次に https://my.local:8443 を参照して別の例外を追加します。その後、:8443 上で提供される HTML ページは、:8001 に対して WSS を開くことができるようになります。
1 つ以上の中間証明書を含む商用/有効な SSL 証明書がある場合は、それらを 1 つのファイルに連結します (最初にサーバー証明書、次に CA からの中間証明書など)。 --cert
オプションでこのファイルを指定し、次に--key
を使用してキーにも。最後に、必要に応じて--ssl-only
使用します。
これらは基本的な操作には必要ありません。
デーモン化: -D
オプションが指定されている場合、websockify はデーモン プロセスとしてバックグラウンドで実行されます。
SSL (wss:// WebSockets URI): これは、クライアントから送信された最初のバイトをスニッフィングし、データが 'x16' または 'x80' (SSL を示す) で始まる場合にソケットをラップすることで、websockify によって自動的に検出されます。
セッション記録: --record
オプションを使用して、クライアントから送受信されたトラフィックをファイルに記録できるようにする機能です。
ミニ Web サーバー: websockify は、WebSocket プロキシと同じポート上の通常の Web リクエストを検出して応答できます。この機能は、 --web DIR
オプションを使用してアクティブ化されます。ここで、DIR は、提供する Web ディレクトリのルートです。
プログラムのラップ: 以下の「プログラムのラップ」セクションを参照してください。
ログ ファイル: websockify はすべてのログ情報をファイルに保存できます。この機能は、 --log-file FILE
オプションで有効になります。FILE は、ログを保存するファイルです。
認証プラグイン: websockify は、websocket 接続に対して認証を要求できます。 --web-auth
使用する場合は、通常の Web リクエストに対しても認証を要求できます。この機能は--auth-plugin CLASS
および--auth-source ARG
オプションでアクティブ化されます。通常、CLASS は auth_plugins.py の 1 つで、ARG はプラグインの設定です。
トークン プラグイン: websockify の単一インスタンスは、 token
URL パラメーターを使用してクライアントによって送信されたトークン、または--host-token
使用する場合は websockify に到達するために使用されるホスト名に応じて、クライアントを複数の異なる事前構成ターゲットに接続できます。この機能は、 --token-plugin CLASS
および--token-source ARG
オプションでアクティブ化されます。通常、CLASS は token_plugins.py の 1 つで、ARG はプラグインの設定です。
websockify の主な実装は Python です。姉妹リポジトリである websockify-js (JavaScript/Node.js) および websockify-other (C、Clojure、Ruby) では、他の言語による代替実装がいくつか用意されています。
さらに、websockify「プロトコル」を実装する外部プロジェクトが他にもいくつかあります。詳細については、代替実装の機能マトリックスを参照してください。
websockify は、ソース アドレスからターゲット アドレス (別のシステム上にある可能性があります) へのプロキシに加えて、ローカル システム上でプログラムを起動し、プログラムが所有/バインドしている通常の TCP ポートに WebSocket トラフィックをプロキシする機能を備えています。
これは、プログラムによる binding() システムコールをインターセプトする LD_PRELOAD ライブラリ ( rebind.so
) によって実現されます。指定されたポートは、新しいローカルホスト/ループバックの空き高ポートに移動されます。その後、websockify は、元のポートに送られた WebSocket トラフィックをプログラムの新しい (移動された) ポートにプロキシします。
プログラム ラップ モードは、ターゲットを--
に置き換え、その後にラップするプログラム コマンド ラインを続けることによって呼び出されます。
`./run 2023 -- PROGRAM ARGS`
--wrap-mode
オプションを使用すると、ラップされたプログラムが終了またはデーモン化するときに実行するアクションを指定できます。
以下は、websockify を使用して、noVNC で使用する vncserver コマンド (それ自体をバックグラウンド化する) をラップする例です。
`./run 5901 --wrap-mode=ignore -- vncserver -geometry 1024x768 :1`
これは、telnetd をラップする例です (krb5-telnetd から)。 telnetd は接続が閉じた後に終了するため、コマンドを再生成するようにラップ モードが設定されます。
`sudo ./run 2023 --wrap-mode=respawn -- telnetd -debug 2023`
websockify-js プロジェクトのwstelnet.html
ページは、単純な WebSocket ベースの Telnet クライアントを示しています (ホストとポートにはそれぞれ「localhost」と「2023」を使用します)。
いずれかのリリースまたは最新の開発バージョンをダウンロードして解凍し、ファイルを解凍したディレクトリで root としてpython3 setup.py install
実行します。通常、これにより、パフォーマンスを向上させるために numpy もインストールされます (まだインストールされていない場合)。ただし、numpy はオプションです。 numpy をインストールしたくない場合、またはコンパイルできない場合は、 python3 setup.py install
実行する前に、setup.py を編集してinstall_requires=['numpy'],
行を削除できます。
その後、websockify がパスで利用できるようになります。 websockify --help
実行して、正しくインストールされていることを確認します。
Docker、Podman、Singularity、udocker、または OCI コンテナ イメージをサポートするお気に入りのコンテナ ランタイムを使用して websockify を実行することもできます。
イメージのエントリポイントはrun
コマンドです。
イメージを構築するには:
./docker/build.sh
ビルドしたら、 run
コマンドに指定するのと同じ引数を使用して起動し、ポート マッピングの割り当てを行うことができます。
docker run -it --rm -p <port>:<container_port> novnc/websockify <container_port> <run_arguments>
たとえば、トラフィックをローカル ポート 7000 から 10.1.1.1:5902 に転送するには、次を使用できます。
docker run -it --rm -p 7000:80 novnc/websockify 80 10.1.1.1:5902
--web
または--cert
オプションなど、ファイルを含める必要がある場合は、必要なファイルを/data
ボリュームにマウントするだけで、通常の方法でそれらを参照できます。
docker run -it --rm -p 443:443 -v websockify-data:/data novnc/websockify --cert /data/self.pem --web /data/noVNC :443 --token-plugin TokenRedis --token-source myredis.local:6379 --ssl-only --ssl-version tlsv1_2