4 คะแนน โดย GN⁺ 2024-08-18 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Magic Wormhole เป็นไลบรารีและเครื่องมือบรรทัดคำสั่ง wormhole สำหรับย้ายไฟล์ ไดเรกทอรี และข้อความสั้น ๆ ขนาดเท่าใดก็ได้อย่างปลอดภัยจากคอมพิวเตอร์เครื่องหนึ่งไปยังอีกเครื่องหนึ่ง
  • ปลายทางทั้งสองฝั่งของการถ่ายโอนจะถูกระบุด้วย wormhole code เดียวกัน โดยทั่วไปอุปกรณ์ผู้ส่งจะสร้างโค้ดและแสดงผล แล้วให้นำไปกรอกบนอุปกรณ์ผู้รับ
  • โค้ดใช้รายการคำที่สั้นและออกเสียงได้ง่ายสำหรับมนุษย์ และฝั่งผู้รับมี การเติมข้อความอัตโนมัติด้วย Tab สำหรับคำในโค้ด จึงมักพิมพ์เพียงไม่กี่ตัวอักษรก็พอ
  • wormhole code เป็นแบบ ใช้ครั้งเดียว ไม่จำเป็นต้องจดจำ และโปรแกรมใช้เซิร์ฟเวอร์สองตัวแยกกันคือ mailbox server และ transit relay
  • Magic Wormhole เผยแพร่ภายใต้ สัญญาอนุญาต MIT รองรับ Python 3.10 ขึ้นไป และทดสอบถึงเวอร์ชัน 3.12

ความสามารถที่ Magic Wormhole มีให้

  • Magic Wormhole เป็นโครงการที่มีเป้าหมายเพื่อ “ส่งจากคอมพิวเตอร์เครื่องหนึ่งไปยังอีกเครื่องหนึ่งอย่างปลอดภัย”
  • แพ็กเกจนี้มีให้ในสองรูปแบบ
    • ไลบรารี

      • เครื่องมือบรรทัดคำสั่ง wormhole
      • สิ่งที่ถ่ายโอนได้มีดังนี้
      • ไฟล์ขนาดใดก็ได้
      • ไดเรกทอรี
      • ข้อความสั้น ๆ

วิธีถ่ายโอนที่อิงกับ wormhole code

  • เอ็นด์พอยต์ทั้งสองจะถูกระบุด้วย wormhole code เดียวกัน
  • ลำดับการทำงานทั่วไปมีดังนี้
    • อุปกรณ์ผู้ส่งสร้างโค้ดและแสดงบนหน้าจอ
    • บนอุปกรณ์ผู้รับ ให้กรอกโค้ดดังกล่าว
  • โค้ดสั้น ออกเสียงง่าย และใช้รายการคำที่แยกแยะกันได้ชัดเจนทางเสียง
  • ฝั่งผู้รับรองรับ การเติมข้อความอัตโนมัติด้วย Tab สำหรับคำในโค้ด จึงมักพิมพ์เพียงไม่กี่ตัวอักษรก็เพียงพอ
  • wormhole code เป็นแบบ ใช้ครั้งเดียว และไม่จำเป็นต้องจดจำ

โครงสร้างเซิร์ฟเวอร์

  • โปรแกรมนี้ใช้เซิร์ฟเวอร์สองตัว และซอร์สโค้ดของแต่ละตัวอยู่ในที่เก็บแยกกัน

เอกสารและสื่อการบรรยาย

  • เอกสารทั้งหมดดูได้ที่ เอกสาร Magic Wormhole หรือในไดเรกทอรีย่อย docs/ ของที่เก็บ
  • มีสื่อการบรรยายจาก PyCon 2016 ให้ใช้งาน

สัญญาอนุญาต ความเข้ากันได้ และการติดตั้ง

  • Magic Wormhole เผยแพร่ภายใต้ สัญญาอนุญาต MIT โดยมีรายละเอียดอยู่ในไฟล์ LICENSE
  • ไลบรารีรองรับ Python 3.10 ขึ้นไป และผ่านการทดสอบถึง 3.12
  • แพ็กเกจ Magic Wormhole ถูกรวมอยู่ในหลายระบบปฏิบัติการ
  • หากต้องการติดตั้งโดยไม่ใช้แพ็กเกจของระบบปฏิบัติการ ให้ทำตาม Installation docs

1 ความคิดเห็น

 
GN⁺ 2024-08-18
ความคิดเห็นจาก Hacker News
  • ผมใช้มันมาหลายปีแล้วเวลาโอนไฟล์ ขนาดใหญ่ ระหว่างระบบในสภาพแวดล้อมเครือข่ายแปลก ๆ และแทบจะทำงานได้ไม่มีปัญหาเสมอ
    สำหรับการทดสอบที่แปลกกว่านั้น ผมเคยตั้ง Magic Wormhole relay เอง แล้วปรับแต่งให้การคัดลอกไฟล์ขนาดใหญ่มากเร็วและเสถียรกว่าเดิมได้
    ผมยังไม่ชอบ Google Drive อยู่ดี เพราะพอโยนไฟล์ระดับหลายสิบ GB เข้าไป มันล่มบ่อยเกินไป
    https://www.jeffgeerling.com/blog/2023/my-own-magic-wormhole...

    • การที่เครื่องมือแบบนี้ไม่พัฒนาต่อถือว่าค่อนข้างร้ายแรง ราว ๆ 6 ปีก่อนมีกิจกรรมรอบ ๆ PAKE คึกคักมาก แต่จนถึงตอนนี้ก็ยังขาดทั้ง hole punching ที่เสถียรเพื่อใช้งานโดยไม่ต้องพึ่ง relay server ที่ช้า และการใช้ TCP หลายสตรีมพร้อมกันหรือโปรโตคอล UDP ที่ออกแบบอย่างรอบคอบ เพื่อส่งข้อมูลปริมาณมากได้เร็วบนเส้นทางระยะไกลที่มีแบนด์วิดท์สูง
      ครั้งสุดท้ายที่ผมพยายามส่งข้อมูลจำนวนมากด้วย Wormhole มันถูกจำกัดอยู่ที่ 20MB/s เพราะ bandwidth-delay product สุดท้ายเลยใช้ HTTP ธรรมดาร่วมกับ aria2c และหลายสตรีม จนใช้สาย 1Gbps ได้เต็ม
      ผมไม่เห็นเหตุผลว่าทำไมเครื่องมือที่ใช้ PAKE จะมาแทนเครื่องมือ proprietary ที่ซับซ้อนเกินจำเป็นอย่าง Globus สำหรับการถ่ายโอนขนาดใหญ่ระยะไกลไม่ได้ แต่ความเป็นจริงยังติดอยู่กับอดีต
    • ผมคาดว่า relay server จะถูกใช้เฉพาะตอน initial handshake เพื่อเจาะ NAT และหลังจากนั้นการส่งข้อมูลจะเป็น P2P
      ข้อมูลจริงน่าจะวิ่งผ่าน relay เฉพาะเมื่อมีข้อจำกัดเครือข่ายบางอย่างเท่านั้น ถ้าไม่ใช่อย่างนั้นก็สงสัยว่าเขารับต้นทุนการรัน relay ฟรีได้อย่างไร
    • ผมใช้ scp, LocalSend, magic wormhole, sharedrop.io ผสมกัน และบางครั้งก็ใช้ python -m http.server สำหรับดาวน์โหลดในเครื่องแบบฉุกเฉิน
      น่าเสียดายที่การ์ตูน xkcd นี้ยังใช้ได้จริงไม่ต่างจากปี 2011: https://xkcd.com/949/
  • นี่เป็นหนึ่งใน ยูทิลิตีแบบหน้าที่เดียว ที่ทำสิ่งเดียวได้ดีมาก ๆ แต่เพราะมันทำงานดีเกินไปและไม่เรียกร้องความสนใจ เลยแทบไม่เป็นที่สังเกตเลย
    รู้สึกว่าเราควรขอบคุณผลงานยอดเยี่ยมแบบนี้ให้มากขึ้น

  • ผมใช้ croc ซึ่งเป็นโปรเจกต์คล้ายกันและมีฟีเจอร์ดี ๆ: https://github.com/schollz/croc

    • เมื่อก่อนผมใช้ https://file.pizza ค่อนข้างเยอะ เพราะชื่อจำง่าย
    • อาจจะดีกว่าถ้ายังคงใช้ wormhole ต่อไป
      https://redrocket.club/posts/croc/
  • ผมเคยย้าย ไฟล์ 70GB ด้วย wormhole ครั้งหนึ่ง เมื่อก่อนคงเป็นเรื่องที่ทำไม่ได้เลย
    ผมรู้ว่ามันใช้แบนด์วิดท์ของ relay server เลยบริจาคให้ Debian ทันที เพราะเข้าใจว่า Debian เป็นผู้รัน relay ของเวอร์ชันแพ็กเกจ apt

    • ผมเป็นผู้เขียน Magic Wormhole เอง relay server ผมเป็นคนรัน แต่ผู้ดูแลแพ็กเกจของ Debian ยอมใส่ hostname สำรองไว้ในเวอร์ชันแพ็กเกจ
      มันเป็น CNAME ที่ชี้ไปยังที่อยู่เดียวกับที่โค้ด upstream git ใช้ จุดประสงค์คือเผื่อมีภาระค่าใช้จ่าย จะได้เปลี่ยนได้ง่าย
      จนถึงตอนนี้ยังไม่เป็นปัญหา ปริมาณที่ส่งอยู่ราว 10–15TB ต่อเดือน แต่ก็แชร์พูลแบนด์วิดท์กับเซิร์ฟเวอร์อื่น ๆ ที่เช่าอยู่แล้ว จึงเคยจ่ายค่าเกินโควตาแค่ครั้งเดียว
      ถ้ามีใครบริจาคให้ผม พูดตรง ๆ ผมก็คงส่งต่อไปให้ Debian เหมือนเดิม
      บางครั้งเมื่อมีใครสักคนปล่อยข้อมูลครึ่งเทราไบต์ผ่านเข้ามา ผมก็คิดว่าควรย้ายไปผู้ให้บริการที่ช้ากว่าแต่คิดราคาเหมาจ่าย หรือไม่ก็ implement โค้ดจำกัดความเร็วที่ดีกว่านี้ หรือในที่สุดก็ implement ส่วนขยายโปรโตคอลที่ให้ไคลเอนต์แจ้งล่วงหน้าว่าจะส่งข้อมูลเท่าไร แล้วให้เซิร์ฟเวอร์ปฏิเสธได้
      แต่จนถึงตอนนี้มันยังไม่เคยมีความสำคัญสูงพอ
    • เลื่อนลงมาถึงตรงนี้ถึงเริ่มเห็นแก่นของเรื่องนิดหน่อย ผมสงสัยว่าสิ่งนี้พึ่งพาเซิร์ฟเวอร์เดียวหรือ relay server แบบรับบริจาค จำนวนน้อยหรือไม่
      เห็นได้ชัดว่าแรงจูงใจหลักคือการทะลุ NAT ถึง NAT เพราะถ้าทั้งสองฝั่งไม่มีกำแพงกั้น ก็ใช้ scp, rsync, sftp ได้เลย
      ผมก็สงสัยด้วยว่าสามารถตั้งค่า relay server ได้ไหม ดูเหมือนจะถูก hardcode ไว้พอสมควร
    • โปรโตคอลส่งข้อมูลของ wormhole จะพยายามใช้ การเชื่อมต่อโดยตรง เพื่อหลีกเลี่ยงการส่งข้อมูลผ่าน relay
  • บังเอิญเจอสิ่งนี้ด้วย “implementation ภาษา Rust ของ Magic Wormhole ที่มีฟีเจอร์และการปรับปรุงใหม่”: https://github.com/magic-wormhole/magic-wormhole.rs

    • ยังขาดฟีเจอร์บางอย่างที่มีใน implementation อื่น เช่น ยังไม่มีฟีเจอร์ส่ง zip แล้วให้แตกไฟล์ออกมาได้ถูกต้อง
  • ผมเป็นผู้เขียน ถ้ามีคำถามก็ตอบได้

    • ผมใช้ wormhole เยอะ แต่ผัดผ่อนการตรวจสอบว่ามันปลอดภัยเท่า ssh/scp หรือไม่ เลยเข้ารหัสไฟล์ที่จะส่งด้วย gpg ก่อนเสมอ แล้วค่อยใส่เข้า wormhole
      แบบนี้ถือว่าหวาดระแวงเกินไปไหม?
    • ตอนแรกแค่ต้องใช้เพื่อ bootstrap VM บนเครื่องใหม่ แต่สุดท้ายก็ใช้ต่อเรื่อย ๆ ในหลายงาน เป็นโปรเจกต์ที่ยอดเยี่ยม
    • มีคำถามอยู่สองสามข้อ อยากรู้ว่ามีแอปไหม และเมื่อข้อมูลใหญ่เกินกว่าจะใส่ใน QR code ได้ สามารถแชร์รหัสผ่านเป็น QR code ได้หรือไม่
      มีแผนรับมือควอนตัมคอมพิวติงอย่างไร และมีแผนย้ายไปใช้การเข้ารหัสแบบทนควอนตัมเพื่อป้องกันการโจมตีแบบเก็บข้อมูลไว้แล้วค่อยถอดรหัสภายหลังหรือไม่
      อีกอย่างอยากรู้ว่าสามารถขยายโปรโตคอลให้ทำงานบนพร็อกซีทั่วไปกว่าเดิม เช่น TURN server ได้หรือไม่
  • ยังมีเครื่องมืออื่น ๆ อีกหลายตัว
    p2pcopy https://github.com/psantosl/p2pcopy
    pcp https://github.com/dennis-tra/pcp
    wormhole-william https://github.com/psanford/wormhole-william

  • อาจเป็นคำถามโง่ ๆ ก็ได้ แต่ถ้าระหว่าง iPhone กับ MacBook ควรทำแบบนี้ยังไงดี?
    AirDrop ถูกปิดตามนโยบาย, พื้นที่เก็บข้อมูล iCloud ก็เต็มเพราะผมขี้เกียจจัดการ, และบนอุปกรณ์อื่นทั้งหมดผมใช้ Syncthing แต่หาไคลเอนต์ที่ใช้กับ iPhone ของบริษัทไม่ได้

    • ผมใช้ sharedrop.io อยู่ ซึ่งเป็นโอเพนซอร์สด้วยและทำงานได้ค่อนข้างดี: https://github.com/szimek/sharedrop
      ชอบเป็นพิเศษตรงที่ไม่ต้องติดตั้งแอป third-party บนอุปกรณ์ใด ๆ
      บน Safari ของ Mac ดูเหมือนโดยทั่วไปจะทำงานได้ไม่ดีเท่า Chrome แต่ผมเคยส่งจาก Windows ไป iOS, Windows ไป macOS, และ macOS ไป iOS โดยไม่ต้องติดตั้งอะไร
    • ถ้าอยู่ในเครือข่ายเดียวกัน มี LocalSend ซึ่งเป็น ทางเลือกแทน AirDrop แบบโอเพนซอร์สข้ามแพลตฟอร์ม: https://github.com/localsend/localsend
    • มี TailDrop ซึ่งเป็นฟีเจอร์เด็ดของ Tailscale สามารถส่งไฟล์ระหว่างอุปกรณ์สารพัดชนิดได้อย่างน่าเชื่อถือ
    • เชื่อมต่ออุปกรณ์ทั้งสองเข้ากับเครือข่าย WiFi เดียวกัน แล้วใช้ HTTP server อย่าง python -m http.server ก็ได้
    • https://mobiussync.com/
  • บทความที่เกี่ยวข้อง: Magic Wormhole: Get things from one computer to another, safely - https://news.ycombinator.com/item?id=27262193 - พฤษภาคม 2021, 178 ความคิดเห็น

  • ตอนนี้ Tailscale ก็มี Taildrop แล้ว: https://tailscale.com/kb/1106/taildrop

    • Taildrop ก็ใช้ได้ดี แต่ถ้าคุณโอเคกับเครื่องมือบรรทัดคำสั่ง Wormhole ยืดหยุ่นกว่าและใช้ง่ายกว่ามาก
      ที่นี่เราใช้ Tailscale โดยรวมอยู่แล้ว แต่ก็ยังส่งไฟล์ด้วย wormhole บ่อย ๆ