4 คะแนน โดย GN⁺ 2025-06-02 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • เป็นเครื่องมือที่กักโปรแกรม Linux ใด ๆ ไว้ในสภาพแวดล้อมเครือข่ายแยกต่างหาก และบังคับให้ทราฟฟิกทั้งหมดวิ่งผ่าน Tor เพื่อลดความเสี่ยงการรั่วไหลจากการพึ่งพาการตั้งค่าพร็อกซีรายแอป
  • หัวใจหลักคือ network namespace ของเคอร์เนล Linux โดยทำให้แอปมองเห็นเฉพาะ onion0 แทนอินเทอร์เฟซของระบบ เพื่อให้เชื่อมต่อเลี่ยงได้ยากขึ้น
  • torsocks เดิมใช้วิธี override ฟังก์ชัน libc จึงอาจมีข้อมูลรั่วใน static binary หรือการเรียกที่ไม่ผ่าน libc อย่างในระบบนิเวศ Zig
  • oniux เป็นเครื่องมือ Rust สำหรับ Linux เท่านั้นที่อิง Arti และ onionmasq ส่วน torsocks เป็นอิมพลีเมนต์ C ที่อิง CTor ใช้งานได้ข้ามแพลตฟอร์ม และเป็นแนวทางที่ใช้กันมานานกว่า 15 ปี
  • ผู้ใช้สามารถเติม oniux ไว้หน้าคำสั่งเดิมเพื่อรัน curl, bash, hexchat ฯลฯ ได้ แต่ควรคำนึงว่าเป็นเครื่องมือใหม่และยังอยู่ในเชิงทดลอง

ปัญหาการแยก Tor ที่ oniux ต้องการแก้

  • เมื่อรันแอปหรือบริการที่ให้ความสำคัญกับความเป็นส่วนตัว แพ็กเก็ตทั้งหมดต้องออกไปผ่าน Tor เท่านั้นจริง ๆ
  • หากป้อนค่าพร็อกซีผิด หรือมี system call เกิดขึ้นนอก SOCKS wrapper ข้อมูลอาจถูกเปิดเผยได้
  • oniux เป็นยูทิลิตี้บรรทัดคำสั่งที่ใช้ namespace ของ Linux เพื่อให้การแยกเครือข่าย Tor แก่แอปพลิเคชัน third-party
  • ทำงานบน Arti และ onionmasq โดยนำโปรแกรม Linux ไปไว้ใน network namespace ของตัวเองและ route ผ่าน Tor
  • ด้านบนของเอกสารมีคำเตือนว่า oniux มีเว็บไซต์แยกแล้ว และเลขเวอร์ชันของบทความนี้ล้าสมัยไปมาก

บทบาทของ Linux namespace

  • namespace เป็นฟีเจอร์การแยกของเคอร์เนล Linux ที่ถูกนำมาใช้ราวปี 2000
  • สามารถแยกบางส่วนของแอปพลิเคชันออกจากส่วนที่เหลือของระบบได้อย่างปลอดภัย
  • namespace แบ่งออกเป็นหลายรูปแบบตามสิ่งที่ต้องการแยก
    • network namespace
    • mount namespace
    • process namespace
    • และรูปแบบอื่น ๆ อีกหลายแบบ
  • โดยทั่วไปทรัพยากรระบบของ Linux สามารถถูกเข้าถึงแบบ global โดยทุกแอปพลิเคชัน
    • นาฬิกาของระบบปฏิบัติการ
    • รายการโปรเซสทั้งหมด
    • ระบบไฟล์
    • รายชื่อผู้ใช้
  • namespace จะ containerize บางส่วนของแอปพลิเคชันออกจากส่วนที่เหลือของระบบปฏิบัติการ และ Docker ก็ใช้ฟีเจอร์นี้เมื่อให้ isolation primitive

วิธีผสาน Tor กับ namespace

  • oniux รันแต่ละแอปพลิเคชันไว้ภายใน network namespace ที่ไม่สามารถเข้าถึงอินเทอร์เฟซเครือข่ายทั้งระบบได้
  • ใน namespace นั้นจะมีเฉพาะอินเทอร์เฟซเครือข่ายกำหนดเองชื่อ onion0 แทนอินเทอร์เฟซของระบบอย่าง eth0
  • วิธีนี้อาศัย security primitive ที่เคอร์เนลของระบบปฏิบัติการ提供ให้ เพื่อแยกการเข้าถึง Tor ของแอปพลิเคชันใด ๆ
  • ต่างจากวิธี SOCKS วิธีนี้ช่วยลดสถานการณ์ที่ข้อมูลรั่วเพราะนักพัฒนาพลาด ทำให้บางการเชื่อมต่อไม่ผ่าน SOCKS ที่ตั้งค่าไว้

ความแตกต่างระหว่าง oniux กับ torsocks

  • torsocks เป็นเครื่องมือที่ override ฟังก์ชัน libc ที่เกี่ยวกับเครือข่าย เพื่อส่งทราฟฟิกไปยัง SOCKS proxy ที่ Tor ให้มา
  • วิธีนี้รองรับข้ามแพลตฟอร์มได้มากกว่า oniux แต่ข้อมูลอาจรั่วใน system call ที่ไม่ผ่าน libc แบบ dynamic link
  • โดยเฉพาะ pure static binary และแอปพลิเคชันในระบบนิเวศ Zig จะอยู่นอกขอบเขตการรองรับของ torsocks
  • oniux

    • เป็นแอปพลิเคชันแบบ standalone
    • ใช้ namespace ของ Linux
    • ทำงานได้กับทุกแอปพลิเคชัน
    • มีโครงสร้างที่ทำให้แม้แต่แอปพลิเคชันประสงค์ร้ายก็ไม่สามารถรั่วข้อมูลได้
    • สำหรับ Linux เท่านั้น
    • เป็นเครื่องมือใหม่และเชิงทดลอง
    • ใช้ Arti เป็นเอนจิน
    • เขียนด้วย Rust
  • torsocks

    • ต้องมี Tor daemon ที่กำลังรันอยู่
    • ใช้แฮ็ก ld.so preload
    • ทำงานเฉพาะกับแอปพลิเคชันที่ทำ system call ผ่าน libc
    • แอปพลิเคชันประสงค์ร้ายสามารถสร้าง system call ด้วย raw assembly ทำให้ข้อมูลรั่วได้
    • รองรับข้ามแพลตฟอร์ม
    • ผ่านการพิสูจน์มานานกว่า 15 ปี
    • ใช้ CTor เป็นเอนจิน
    • เขียนด้วย C

การติดตั้งและตัวอย่างการใช้งาน

  • ต้องมีระบบ Linux และ Rust toolchain
  • ติดตั้งด้วย cargo install
cargo install --git https://gitlab.torproject.org/tpo/core/oniux --tag v0.4.0 oniux
  • สามารถรันคำขอ HTTPS แบบง่ายผ่าน Tor ได้
oniux curl https://icanhazip.com
  • รองรับคำขอ IPv6 ด้วย
oniux curl -6 https://ipv6.icanhazip.com
  • เข้าถึง onion service ได้เช่นกัน
oniux curl http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion/…
  • เปิดใช้งาน logging ได้ด้วย RUST_LOG=debug
RUST_LOG=debug oniux curl https://icanhazip.com
  • หากรันทั้ง shell ผ่าน Tor จะสามารถแยกโปรเซสทั้งหมดภายในนั้นได้
oniux bash
  • ในสภาพแวดล้อมเดสก์ท็อป สามารถแยกแอปพลิเคชันกราฟิกได้ด้วย
oniux hexchat

ลำดับการทำงานภายใน

  • oniux เริ่มจากสร้าง child process ด้วย system call clone(2)
  • child process จะถูกแยกไว้ภายใน network, mount, PID และ user namespace ของตัวเอง
  • จากนั้น child process จะ mount สำเนา /proc ของตัวเอง และตั้งค่า UID/GID mapping ให้ตรงกับ UID และ GID ของ parent process
  • เพื่อให้แอปพลิเคชัน resolve ชื่อผ่าน Tor จะสร้างไฟล์ชั่วคราวที่มีรายการ nameserver แล้ว bind mount ไฟล์นั้นไปที่ /etc/resolv.conf
  • child process ใช้ onionmasq เพื่อสร้าง TUN interface ชื่อ onion0
  • ต่อจากนั้นตั้งค่าอินเทอร์เฟซด้วยงาน rtnetlink(7) ซึ่งรวมถึงงานอย่างการกำหนด IP address
  • child process ส่ง file descriptor ของ TUN interface ไปยัง parent process ผ่าน Unix Domain socket
  • parent process จะรอข้อความนี้หลังจากรัน clone(2) ครั้งแรก
  • เมื่อส่งเสร็จแล้ว child process จะสละ capability ทั้งหมดที่ได้มาจากการเป็น root process ของ user namespace
  • สุดท้ายจึงรันคำสั่งที่ผู้ใช้ระบุด้วยฟังก์ชันของไลบรารีมาตรฐาน Rust

สถานะเชิงทดลองและข้อควรระวังในการใช้งาน

  • oniux เป็นฟีเจอร์ที่ค่อนข้างใหม่ และใช้ซอฟต์แวร์ Tor รุ่นใหม่อย่าง Arti และ onionmasq
  • ขณะนี้ทำงานได้ตามที่คาดหวัง แต่ torsocks ถูกใช้งานมานานกว่า 15 ปี จึงมีประสบการณ์ภาคสนามมากกว่า
  • เป้าหมายคือให้ oniux บรรลุระดับความเป็นผู้ใหญ่ใกล้เคียงกับ torsocks

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

 
ndrgrd 2025-06-03

ดูเหมือนว่า Tor จะไม่ได้แย่สำหรับเรื่องความเป็นส่วนตัวนัก แต่ผมก็ยังไม่แน่ใจว่ามันเป็นเครื่องมือที่เหมาะกับการไม่เปิดเผยตัวตนหรือเปล่า อีกทั้งก็มีคนพูดกันว่าโหนดทางออกถูกหน่วยงานของรัฐเข้าควบคุมไว้แล้วด้วย

 
GN⁺ 2025-06-02
ความคิดเห็นจาก Hacker News
  • ราว 10 ปีก่อน ตอนที่ network namespace เพิ่งเริ่มเป็นที่พูดถึง เคยคุยกับนักพัฒนา Tor เรื่องนี้
    ฟีดแบ็กที่ได้รับตอนนั้นคือ มันเป็นวิธีที่ง่ายมากที่จะทำให้ผู้คนเข้าใจผิดว่าปลอดภัย ทั้งที่ยังรั่วไหลข้อมูลที่ระบุตัวตนได้ออกไปจำนวนมาก จึงไม่ได้ผลักดันต่อ

    • ผมมองว่าการที่ฝั่ง Tor ผลักดันไปในทิศทางนั้นเป็น ความผิดพลาดเชิงกลยุทธ์
      คนที่อยู่ภายใต้ภัยคุกคามร้ายแรงควรใช้ Tor Browser และต้องระวังช่องทางรั่วไหลอื่น ๆ ต่อไปก็จริง แต่ถ้า Tor ถูกใช้แพร่หลายไปทุกที่ การสอดส่องในวงกว้างคงยากขึ้นมาก
      ตอนนี้การสอดส่องในวงกว้างสามารถตรวจจับได้ว่าใครใช้ Tor แต่ถ้าทุกคนใช้กันอยู่แล้ว ข้อเท็จจริงนั้นก็แทบไม่มีความหมาย
    • แปลกนะ torsocks กับ torify ก็ทำสิ่งเดียวกัน แค่แข็งแรงน้อยกว่าเท่านั้น
  • ทั้งหมดนี้ไม่ได้ใช้ได้เฉพาะกับ TCP เหรอ? กล่าวอีกอย่างคือ สงสัยว่ากิจกรรมที่ไม่ใช่ TCP จะป้องกันได้อย่างไร

    • ไม่รู้รายละเอียดมากนัก แต่ใน https://gitlab.torproject.org/tpo/core/onionmasq เขียนไว้แบบนี้
      โปรเจกต์นี้เป็นความพยายามในการสร้างสแตกเครือข่ายแบบ user-space อย่างง่ายที่จัดการสถานะของ TCP และ UDP ได้ เพื่อให้ส่งต่อทราฟฟิกไปยังเครือข่าย Tor ได้
    • ผู้ใช้ Tor Browser จัดการกับ YouTube หรือ DNS อย่างไร? สงสัยด้วยว่า HTTP/3 จะเป็นอย่างไร
    • กิจกรรมที่ไม่ใช่ TCP จะไม่ถูก route และการส่งจะล้มเหลว
  • คำแนะนำการติดตั้งหน้าแรกใช้งานไม่ได้ ต้องเปลี่ยนเลขเวอร์ชันจาก 0.4.0 เป็น 0.5.0
    cargo install --git https://gitlab.torproject.org/tpo/core/oniux oniux@0.5.0

  • Oniux ดูเหมือนเครื่องมือที่รองรับแบบ “เป็นทางการ” คล้าย orjail ส่วน orjail ไม่มี commit มา 4 ปีแล้ว แต่ยังทำงานได้ดีมากในฐานะ shell script ที่ใช้เครื่องมือ iptables/iproute [1]
    orjail ยังมีตัวเลือกให้รันร่วมกับ firejail เพื่อเพิ่มการแยกกักด้วย ซึ่งดูเหมือนเป็นฟีเจอร์ที่ Oniux ยังไม่มี
    [1] https://github.com/orjail/orjail/blob/master/usr/sbin/orjail

  • ตอนแรกคิดว่านี่เป็นวิธีส่งทราฟฟิกผ่าน tor daemon ที่รันอยู่ในเครื่อง เหมือน torsocks
    แต่เห็นว่าแม้หยุด tor daemon ในเครื่องแล้ว oniux ยังทำงานต่อได้ ส่วน torify กับ torsocks ใช้งานไม่ได้ เอกสารก็เขียนไว้แบบนั้นจริง ๆ ค่อนข้างดีเลย
    ใช้งานใน Docker ได้ด้วย แต่ต้องใช้ --privileged พอลอกไบนารีไปไว้ในคอนเทนเนอร์ debian:12 ก็ทำงานได้ที่นั่นเช่นกัน:
    docker run -it --rm --privileged -v "$PWD/oniux:/usr/bin/oniux" debian:12

  • เรื่องน่าสนุกคือ สิ่งนี้เสียอยู่ใน curl มาตลอด 5 ปี และตัวอย่างในบล็อกก็เช่นกัน เพราะนักพัฒนา Tor เคยยืนกรานว่าแอปไม่ควรพยายาม resolve ชื่อโดเมน .onion: https://daniel.haxx.se/blog/2025/05/16/leeks-and-leaks/
    หวังว่าจะหาทางแก้ได้

  • แปลว่าตอนนี้เข้าถึงเว็บไซต์ Tor ด้วย Chrome ได้แล้วใช่ไหม?

    • ทำได้ก็จริง แต่ขอร้องว่าอย่าทำเลย มันจะยิ่งทำให้คุณโดดเด่นกว่าเดิม Tor Browser มีกลยุทธ์ป้องกัน fingerprint หลายอย่างที่ Chrome ไม่มี
    • เมื่อก่อนก็ทำได้ถ้ากำหนดแค่ environment variable หรือการตั้งค่า proxy พอร์ตมาตรฐานของ tor daemon คือ 9050
      จริง ๆ แล้ว SOCKS proxy ที่ช่วย route ทราฟฟิกผ่านโปรโตคอลใดก็ได้สร้างได้ค่อนข้างง่าย เช่น ใช้ SOCKS5 proxy เป็นชั้นแปลง เพื่อให้บริการหรือเข้าชมเว็บไซต์ผ่าน syncthing ได้: https://github.com/acheong08/syndicate
  • ในตัวอย่างใช้ hexchat กระบวนการแบบนี้รันด้วยการตั้งค่าของผู้ใช้หรือเปล่า? ถ้าลืมเปลี่ยนการตั้งค่า ชื่อผู้ใช้ IRC จะไม่รั่วออกไปเหรอ
    ถ้าเปิดเบราว์เซอร์ คุกกี้ก็อาจรั่วด้วยไหม?

    • เป็นการแยกประเด็นความรับผิดชอบกัน Tor พยายามอย่างมากเพื่อป้องกันการระบุตัวตนจาก fingerprint แต่โดยส่วนตัวมองว่า จุดประสงค์หลักของ Tor และ Oniux คือทำให้ตามรอย IP ต้นทางไม่ได้
      กรณีล็อกอิน Gmail ผ่าน Tor ก็คงพูดแบบเดียวกันได้ ถ้าไม่ใช่ HTTPS น่ะนะ
    • ไม่เข้าใจว่าชื่อผู้ใช้รั่วหมายถึงอะไร ข้อเท็จจริงที่ว่าชื่อผู้ใช้นั้นใช้ Tor อาจถูกเปิดเผยได้
      ข้อเท็จจริงที่ว่าชื่อผู้ใช้ทั้งหมดที่เชื่อมต่อไปยัง IRC host เดียวกันเป็นคนเดียวกันก็ยังคงถูกเปิดเผยได้
      ถ้าพยายามรักษาความไม่เปิดเผยตัวตน IRC ดูค่อนข้างอันตราย เพราะมีคนจำนวนมากบันทึกเวลา disconnect ไว้ และสามารถนำไปหาความสัมพันธ์กับเหตุการณ์เครือข่ายล่มอื่น ๆ ได้
  • ประสบการณ์ของนักพัฒนา ตรงนี้ทำออกมาได้ดีมาก ใช้ง่ายจนคนโง่ก็ใช้ได้ คนทำเก่งมาก <3

    • ไม่ใช่เลย คนโง่นี่มีความคิดสร้างสรรค์นะ ความระมัดระวังด้านปฏิบัติการ ที่จำเป็นเพื่อใช้สิ่งนี้โดยยังรักษาความไม่เปิดเผยตัวตนนั้นยากเกินไปสำหรับผู้ใช้ส่วนใหญ่
  • ดีเลย ทีนี้ช่วยเขียน prototype ใหม่เป็น C แล้วผมยินดีจะใช้

    • ตัวนี้เขียนด้วย Rust ทำไมถึงต้องมีเวอร์ชัน C?