websockify เดิมชื่อ wsproxy และเป็นส่วนหนึ่งของโครงการ noVNC
ในระดับพื้นฐานที่สุด websockify เพียงแปลการรับส่งข้อมูล WebSockets เป็นการรับส่งข้อมูลซ็อกเก็ตปกติ Websockify ยอมรับการจับมือ WebSockets แยกวิเคราะห์ จากนั้นเริ่มส่งต่อการรับส่งข้อมูลระหว่างไคลเอนต์และเป้าหมายในทั้งสองทิศทาง
ความมุ่งมั่น ประกาศ และข่าวสารที่โดดเด่นจะถูกโพสต์ไปที่ @noVNC
หากคุณเป็นนักพัฒนา/ผู้รวมระบบ/ผู้ใช้ websockify (หรือต้องการเป็น) โปรดเข้าร่วมกลุ่มสนทนา noVNC/websockify
สามารถส่งข้อบกพร่องและคำขอคุณสมบัติผ่านปัญหา GitHub
หากคุณต้องการแสดงความขอบคุณต่อ 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 แบบเก่า
ในการเข้ารหัสการรับส่งข้อมูลโดยใช้รูปแบบ URI ของ WebSocket 'wss://' คุณต้องสร้างใบรับรองและคีย์เพื่อให้ 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 และ URL ของ WebSocket ของคุณคือ wss://my.local:8001 ให้เรียกดู https:/ ก่อน /my.local:8001 เพิ่มข้อยกเว้น จากนั้นเรียกดู https://my.local:8443 และเพิ่มข้อยกเว้นอื่น จากนั้นหน้า html ที่แสดงบน :8443 จะสามารถเปิด WSS เป็น :8001 ได้
หากคุณมีใบรับรอง SSL เชิงพาณิชย์/ที่ถูกต้องซึ่งมีใบรับรองกลางตั้งแต่หนึ่งใบขึ้นไป ให้ต่อใบรับรองเหล่านั้นเป็นไฟล์เดียว ใบรับรองเซิร์ฟเวอร์ก่อน จากนั้นจึงต่อใบรับรองกลางจาก CA ฯลฯ ชี้ไปที่ไฟล์นี้ด้วยตัวเลือก --cert
จากนั้น ไปยังคีย์ด้วย --key
สุดท้าย ใช้ --ssl-only
ตามความจำเป็น
สิ่งเหล่านี้ไม่จำเป็นสำหรับการทำงานขั้นพื้นฐาน
Daemonizing: เมื่อระบุตัวเลือก -D
แล้ว websockify จะทำงานอยู่เบื้องหลังเป็นกระบวนการ daemon
SSL (wss:// WebSockets URI): สิ่งนี้ถูกตรวจพบโดยอัตโนมัติโดย websockify โดยการดมไบต์แรกที่ส่งจากไคลเอนต์ จากนั้นล้อมซ็อกเก็ตหากข้อมูลเริ่มต้นด้วย 'x16' หรือ 'x80' (บ่งชี้ SSL)
การบันทึกเซสชัน: คุณลักษณะนี้ที่ช่วยให้สามารถบันทึกการรับส่งข้อมูลที่ส่งและรับจากไคลเอนต์ไปยังไฟล์โดยใช้ตัวเลือก --record
Mini-webserver: websockify สามารถตรวจจับและตอบสนองต่อคำขอเว็บปกติบนพอร์ตเดียวกันกับพร็อกซี WebSockets ฟังก์ชั่นนี้เปิดใช้งานด้วยตัวเลือก --web DIR
โดยที่ DIR เป็นรากของไดเร็กทอรีเว็บที่จะให้บริการ
สรุปโปรแกรม: ดูส่วน "สรุปโปรแกรม" ด้านล่าง
ไฟล์บันทึก: websockify สามารถบันทึกข้อมูลการบันทึกทั้งหมดในไฟล์ได้ ฟังก์ชั่นนี้เปิดใช้งานด้วยตัวเลือก --log-file FILE
โดยที่ FILE เป็นไฟล์ที่ควรบันทึกบันทึก
ปลั๊กอินการรับรองความถูกต้อง: websockify สามารถเรียกร้องการรับรองความถูกต้องสำหรับการเชื่อมต่อ websocket และหากคุณใช้ --web-auth
ก็ร้องขอคำขอเว็บปกติเช่นกัน ฟังก์ชันนี้เปิดใช้งานด้วยตัวเลือก --auth-plugin CLASS
และ --auth-source ARG
โดยที่ CLASS มักจะมาจาก auth_plugins.py และ ARG คือการกำหนดค่าของปลั๊กอิน
ปลั๊กอินโทเค็น: อินสแตนซ์เดียวของ websockify สามารถเชื่อมต่อไคลเอนต์กับเป้าหมายที่กำหนดค่าไว้ล่วงหน้าหลายรายการ ขึ้นอยู่กับโทเค็นที่ไคลเอนต์ส่งโดยใช้พารามิเตอร์ URL token
หรือชื่อโฮสต์ที่ใช้ในการเข้าถึง 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 ยังมีความสามารถในการเปิดโปรแกรมบนระบบท้องถิ่นและการรับส่งข้อมูล WebSockets พร็อกซีไปยังพอร์ต TCP ปกติที่โปรแกรมเป็นเจ้าของ/ผูกไว้
สิ่งนี้สามารถทำได้โดยไลบรารี LD_PRELOAD ( rebind.so
) ซึ่งดักฟังการเรียกของระบบ bind() โดยโปรแกรม พอร์ตที่ระบุถูกย้ายไปยังพอร์ตสูงฟรีของ localhost/loopback ใหม่ websockify จากนั้นพรอกซีการรับส่งข้อมูล WebSockets ที่ส่งตรงไปยังพอร์ตดั้งเดิมไปยังพอร์ตใหม่ (ย้าย) ของโปรแกรม
โหมดการตัดคำของโปรแกรมถูกเรียกใช้โดยการแทนที่เป้าหมายด้วย --
ตามด้วยบรรทัดคำสั่งของโปรแกรมที่จะตัด
`./run 2023 -- PROGRAM ARGS`
ตัวเลือก --wrap-mode
สามารถใช้เพื่อระบุการดำเนินการที่จะดำเนินการเมื่อโปรแกรมที่ wrap ออกหรือ daemonizes
นี่คือตัวอย่างของการใช้ websockify เพื่อล้อมคำสั่ง vncserver (ซึ่งมีพื้นหลัง) เพื่อใช้กับ noVNC:
`./run 5901 --wrap-mode=ignore -- vncserver -geometry 1024x768 :1`
นี่คือตัวอย่างของการห่อ telnetd (จาก krb5-telnetd) telnetd ออกหลังจากการเชื่อมต่อปิด ดังนั้นโหมด wrap จึงถูกตั้งค่าให้สร้างคำสั่งใหม่:
`sudo ./run 2023 --wrap-mode=respawn -- telnetd -debug 2023`
หน้า wstelnet.html
ในโปรเจ็กต์ websockify-js สาธิตไคลเอ็นต์ telnet ที่ใช้ WebSockets อย่างง่าย (ใช้ 'localhost' และ '2023' สำหรับโฮสต์และพอร์ตตามลำดับ)
ดาวน์โหลดหนึ่งในรีลีสหรือเวอร์ชันการพัฒนาล่าสุด แยกออกแล้วรัน python3 setup.py install
เป็น root ในไดเร็กทอรีที่คุณแตกไฟล์ โดยปกติแล้ว การดำเนินการนี้จะติดตั้ง numpy เพื่อประสิทธิภาพที่ดีขึ้นด้วย หากคุณยังไม่ได้ติดตั้ง อย่างไรก็ตาม numpy เป็นทางเลือก หากคุณไม่ต้องการติดตั้ง numpy หรือหากคุณไม่สามารถคอมไพล์ได้ คุณสามารถแก้ไข setup.py และลบบรรทัด install_requires=['numpy'],
ก่อนที่จะรัน python3 setup.py install
หลังจากนั้น websockify ควรพร้อมใช้งานในเส้นทางของคุณ เรียกใช้ websockify --help
เพื่อยืนยันว่าติดตั้งอย่างถูกต้อง
คุณยังสามารถเรียกใช้ websockify โดยใช้ Docker, Podman, Singularity, udocker หรือรันไทม์คอนเทนเนอร์ที่คุณชื่นชอบซึ่งรองรับอิมเมจคอนเทนเนอร์ OCI
จุดเริ่มต้นของรูปภาพคือคำสั่ง 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