4P by GN⁺ | ★ favorite | 댓글 1개
  • Magic Wormhole은 한 컴퓨터에서 다른 컴퓨터로 임의 크기의 파일, 디렉터리, 짧은 텍스트를 안전하게 옮기기 위한 라이브러리와 wormhole 명령줄 도구를 제공함
  • 전송 양쪽 끝은 동일한 wormhole code로 식별되며, 일반적으로 송신 기기가 코드를 생성해 표시하고 수신 기기에 입력함
  • 코드는 짧고 사람이 발음하기 쉬운 단어 목록을 사용하며, 수신 측은 코드 단어 탭 자동완성을 제공해 보통 몇 글자만 입력하면 됨
  • wormhole code는 일회용이며 외울 필요가 없고, 프로그램은 별도 저장소의 mailbox server와 transit relay 두 서버를 사용함
  • Magic Wormhole은 MIT 라이선스로 배포되며 Python 3.10 이상과 호환되고 3.12까지 테스트됨

Magic Wormhole이 제공하는 기능

  • Magic Wormhole은 “한 컴퓨터에서 다른 컴퓨터로 안전하게 가져오기”를 목표로 하는 프로젝트임
  • 패키지는 두 가지 형태를 제공함
    • 라이브러리

      • wormhole이라는 명령줄 도구
      • 전송 대상은 다음을 포함함
      • 임의 크기의 파일
      • 디렉터리
      • 짧은 텍스트 조각

wormhole code 기반 전송 방식

  • 두 엔드포인트는 동일한 wormhole code를 사용해 식별됨
  • 일반적인 흐름은 다음과 같음
    • 송신 기기가 코드를 생성하고 화면에 표시함
    • 수신 기기에서 해당 코드를 입력함
  • 코드는 짧고 사람이 발음하기 쉬우며, 음성적으로 구분되는 단어 목록을 사용함
  • 수신 측은 코드 단어에 대해 탭 자동완성을 제공하므로 보통 몇 글자만 입력하면 됨
  • wormhole code는 일회용이며 외울 필요가 없음

서버 구성

  • 이 프로그램은 두 개의 서버를 사용하며, 각 서버의 소스 코드는 별도 저장소에 있음

문서와 발표 자료

  • 전체 문서는 Magic Wormhole 문서 또는 저장소의 docs/ 하위 디렉터리에서 확인할 수 있음
  • PyCon 2016 발표 자료가 제공됨

라이선스, 호환성, 설치

  • Magic Wormhole은 MIT 라이선스로 배포되며 자세한 내용은 LICENSE 파일에 있음
  • 라이브러리는 Python 3.10 이상과 호환되고, 3.12까지 테스트됨
  • Magic Wormhole 패키지는 여러 운영체제에 포함되어 있음
  • OS 패키지 없이 설치하려면 Installation docs를 따르면 됨

댓글과 토론

Hacker News 의견들
  • 이상한 네트워크 환경에서 시스템 간 대용량 파일을 옮길 때 몇 년째 써왔는데, 거의 항상 문제없이 동작함
    좀 더 특이한 테스트로는 직접 Magic Wormhole 릴레이를 띄워서, 아주 큰 파일 복사를 더 빠르고 안정적으로 만들도록 조정할 수 있었음
    Google Drive는 수십 GB 파일을 던지면 너무 자주 무너져서 아직도 싫음
    https://www.jeffgeerling.com/blog/2023/my-own-magic-wormhole...

    • 이런 도구들이 발전하지 않는 건 꽤 치명적임. 6년쯤 전에 PAKE 주변으로 활동이 활발했지만, 아직도 느린 릴레이 서버 없이 쓰기 위한 안정적인 홀 펀칭과, 긴 고대역폭 경로에서 대량 데이터를 빠르게 보내기 위한 여러 동시 TCP 스트림 또는 신중히 설계된 UDP 프로토콜이 부족함
      마지막으로 Wormhole로 대량 데이터를 보내려 했을 때는 대역폭-지연 곱 때문에 20MB/s로 제한됐고, 결국 평범한 HTTP에 aria2c와 다중 스트림을 써서 1Gbps 회선을 꽉 채웠음
      PAKE 기반 도구들이 장거리 대용량 전송에서 Globus 같은 과하게 복잡한 독점 도구를 완전히 대체하지 못할 이유가 없다고 보는데, 현실은 과거에 머물러 있음
    • 릴레이 서버는 NAT를 뚫기 위한 초기 핸드셰이크에만 쓰이고, 이후 전송은 P2P일 거라고 예상했음
      일부 네트워크 제한이 있을 때만 실제 데이터가 릴레이를 지나갈 텐데, 그렇지 않다면 무료 릴레이 운영 비용을 어떻게 감당하는지 궁금함
    • scp, LocalSend, magic wormhole, sharedrop.io를 조합해서 쓰고, 급할 때 로컬 다운로드용으로 python -m http.server도 가끔 씀
      이 xkcd 만화가 2011년과 똑같이 아직도 유효하다는 게 아쉬움: https://xkcd.com/949/
  • 이건 한 가지 기능을 엄청 잘하는 단일 기능 유틸리티 중 하나인데, 너무 잘 동작하면서도 튀지 않아서 완전히 눈에 띄지 않음
    이런 훌륭한 창작물들에 더 감사해야겠다고 느낌

  • 비슷한 프로젝트로 좋은 기능이 있는 croc을 쓰고 있음: https://github.com/schollz/croc

  • wormhole로 70GB 파일을 한 번 옮겨봤음. 예전엔 도저히 못 했을 일임
    릴레이 서버 대역폭을 쓴 건 알고 있어서, 곧바로 Debian에 기부했음. apt 패키지 버전의 릴레이를 Debian이 운영한다고 알고 있었음

    • Magic Wormhole 작성자임. 릴레이 서버는 내가 운영하지만, Debian 메인테이너가 패키지 버전에 대체 호스트명을 넣어두는 데 동의했음
      업스트림 git 코드가 쓰는 주소와 같은 곳을 가리키는 CNAME이라, 비용 부담이 생기면 쉽게 바꿀 수 있게 하려는 목적이었음
      지금까지는 문제가 되지 않았고, 월 10~15TB 정도를 옮기지만 어차피 임대 중인 다른 서버들과 대역폭 풀을 공유해서 초과 요금을 낸 적은 한 번뿐임
      누가 내게 기부하더라도 솔직히 그대로 Debian에 보낼 것 같음
      가끔 누군가가 반 테라바이트를 흘려보내면, 더 느리지만 정액제인 제공업체로 옮기거나, 더 나은 속도 제한 코드를 구현하거나, 클라이언트가 전송할 데이터 양을 미리 밝히고 서버가 거절할 수 있는 프로토콜 확장을 드디어 구현해야겠다고 생각함
      하지만 아직 우선순위가 충분히 높아진 적은 없음
    • 이쯤 내려와서야 핵심이 조금 보임. 이게 단일 서버나 소수의 기부형 릴레이 서버에 의존하는 건지 궁금함
      NAT 대 NAT 통과가 가장 큰 동기인 건 분명함. 양쪽 장벽이 없다면 그냥 scp, rsync, sftp를 쓰면 되니까
      릴레이 서버를 설정할 수 있는지도 궁금함. 어느 정도 하드코딩된 것처럼 보였음
    • wormhole 전송 프로토콜은 직접 연결을 시도해서 릴레이를 통한 데이터 전송을 피하려고 함
  • 우연히 이것도 발견했음. “새 기능과 개선이 들어간 Magic Wormhole의 Rust 구현”: https://github.com/magic-wormhole/magic-wormhole.rs

    • 다른 구현에 있는 기능 몇 가지가 빠져 있음. 예를 들어 zip을 보내고 올바르게 풀리게 하는 기능이 없음
  • 작성자임. 질문 있으면 답할 수 있음

    • wormhole을 많이 쓰지만 ssh/scp만큼 안전한지 알아보는 걸 미뤄와서, 항상 전송할 파일을 gpg로 암호화한 뒤 wormhole에 넣음
      이건 편집증적인 행동일까?
    • 새 머신에서 VM을 부트스트랩하려고만 필요했는데, 결국 여러 용도로 계속 쓰게 됐음. 훌륭한 프로젝트임
    • 질문이 몇 가지 있음. 앱이 있는지, 데이터가 QR 코드에 담기엔 너무 클 때 비밀번호를 QR 코드로 공유할 수 있는지 궁금함
      양자 컴퓨팅에는 어떻게 대응할 계획인지, 저장 후 나중에 복호화하는 공격에 대비해 양자내성 암호로 전환할 계획이 있는지도 궁금함
      프로토콜을 TURN 서버 같은 더 일반적인 프록시 위로 확장할 수 있는지도 알고 싶음
  • 다른 도구들도 몇 가지 있음
    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
      특히 어떤 기기에도 서드파티 앱을 설치할 필요가 없어서 마음에 듦
      Mac의 Safari에서는 보통 Chrome만큼 잘 안 되는 것 같지만, Windows에서 iOS, Windows에서 macOS, macOS에서 iOS로 설치 없이 전송해본 적 있음
    • 같은 네트워크에 있다면 크로스 플랫폼 오픈소스 AirDrop 대안인 LocalSend가 있음: https://github.com/localsend/localsend
    • Tailscale의 킬러 기능인 TailDrop이 있음. 온갖 기기 사이에서 신뢰성 있게 파일 전송 가능함
    • 두 기기를 같은 WiFi 네트워크에 연결하고 python -m http.server 같은 HTTP 서버를 쓰면 됨
    • https://mobiussync.com/
  • 관련 글: Magic Wormhole: Get things from one computer to another, safely - https://news.ycombinator.com/item?id=27262193 - 2021년 5월, 댓글 178개

  • Tailscale에도 이제 Taildrop이 있음: https://tailscale.com/kb/1106/taildrop

    • Taildrop도 괜찮지만, 명령줄 도구가 괜찮다면 Wormhole이 훨씬 더 유연하고 쓰기 쉬움
      여기서는 Tailscale을 전반적으로 쓰고 있는데도, 여전히 파일을 wormhole로 자주 보냄