websockify 以前名為 wsproxy,是 noVNC 專案的一部分。
在最基本的層面上,websockify 只是將 WebSocket 流量轉換為正常的套接字流量。 Websockify 接受 WebSockets 握手,解析它,然後開始在客戶端和目標之間雙向轉送流量。
值得注意的提交、公告和新聞發佈到@noVNC
如果您是 websockify 開發人員/整合商/使用者(或想成為),請加入 noVNC/websockify 討論群組
錯誤和功能請求可以透過 github issues 提交。
如果您想對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 套接字來提示,因此您需要讓它透過這兩種方法之一接受它。
這些連接埠可能會被瀏覽器視為區分連接,例如,如果您的網站url 是https://my.local:8443,而您的WebSocket url 是wss://my.local:8001,則首先瀏覽到https://my.local:8001。然後透過 :8443 提供的 html 頁面將能夠開啟 WSS 到 :8001
如果您擁有具有一個或多個--cert
證書的商業/有效 SSL 證書,請將它們連接到一個文件中,首先是伺服器證書,然後是來自 CA 的中間證書,等等。文件,然後也可以使用--key
來指定金鑰。最後,根據需要使用--ssl-only
。
這些對於基本操作來說並不是必要的。
守護程式:當指定-D
選項時,websockify 作為守護程式在背景運行。
SSL(wss:// WebSockets URI):websockify 透過嗅聞從客戶端發送的第一個位元組,然後如果資料以「x16」或「x80」(表示SSL)開頭,則包裝套接字,從而自動檢測到SSL。
會話記錄:此功能允許使用--record
選項將從用戶端傳送和接收的流量記錄到檔案中。
迷你網頁伺服器:websockify 可以偵測並回應與 WebSockets 代理程式相同連接埠上的正常 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 中的一個,ARG 是插件的配置。
令牌外掛程式:websockify 的單一實例可以將客戶端連接到多個不同的預先配置目標,具體取決於客戶端使用token
URL 參數發送的令牌,或用於存取 websockify 的主機名稱(如果您使用--host-token
。此功能透過--token-plugin CLASS
和--token-source ARG
選項激活,其中 CLASS 通常是 token_plugins.py 中的一個,ARG 是插件的配置。
websockify 的主要實作是用 python 實現的。我們的姊妹儲存庫 websockify-js (JavaScript/Node.js) 和 websockify-other (C、Clojure、Ruby) 中提供了其他語言的多種替代實作。
此外,還有其他幾個實現 websockify「協議」的外部項目。有關詳細信息,請參閱替代實施功能矩陣。
除了從來源位址代理程式到目標位址(可能位於不同的系統上)之外,websockify 還能夠在本機系統上啟動程式並將 WebSocket 流量代理到該程式擁有/綁定的普通 TCP 連接埠。
這是透過 LD_PRELOAD 函式庫 ( rebind.so
) 完成的,它攔截程式的 bind() 系統呼叫。指定的連接埠被移到新的 localhost/loopback 空閒高端口。然後,websockify 將定向到原始連接埠的 WebSocket 流量代理到程式的新(已移動)連接埠。
透過用--
取代目標,後面跟著要換行的程式命令列來呼叫程式換行模式。
`./run 2023 -- PROGRAM ARGS`
--wrap-mode
選項可用來指示當包裝的程式退出或守護程式時要採取的動作。
以下是使用 websockify 包裝 vncserver 指令(本身為後台)以與 noVNC 一起使用的範例:
`./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
頁面示範了一個簡單的基於 WebSockets 的 telnet 用戶端(分別使用「localhost」和「2023」作為主機和連接埠)。
下載其中一個版本或最新的開發版本,將其解壓縮並在解壓縮檔案的目錄中以 root 身分執行python3 setup.py install
。通常,如果您還沒有安裝 numpy,它也會安裝以獲得更好的性能。但是,numpy 是可選的。如果您不想安裝 numpy 或無法編譯它,可以編輯 setup.py 並刪除install_requires=['numpy'],
運行python3 setup.py install
之前的行。
之後,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