- เป็นเครื่องมือที่กักโปรแกรม 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
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 ความคิดเห็น
ดูเหมือนว่า Tor จะไม่ได้แย่สำหรับเรื่องความเป็นส่วนตัวนัก แต่ผมก็ยังไม่แน่ใจว่ามันเป็นเครื่องมือที่เหมาะกับการไม่เปิดเผยตัวตนหรือเปล่า อีกทั้งก็มีคนพูดกันว่าโหนดทางออกถูกหน่วยงานของรัฐเข้าควบคุมไว้แล้วด้วย
ความคิดเห็นจาก Hacker News
ราว 10 ปีก่อน ตอนที่ network namespace เพิ่งเริ่มเป็นที่พูดถึง เคยคุยกับนักพัฒนา Tor เรื่องนี้
ฟีดแบ็กที่ได้รับตอนนั้นคือ มันเป็นวิธีที่ง่ายมากที่จะทำให้ผู้คนเข้าใจผิดว่าปลอดภัย ทั้งที่ยังรั่วไหลข้อมูลที่ระบุตัวตนได้ออกไปจำนวนมาก จึงไม่ได้ผลักดันต่อ
คนที่อยู่ภายใต้ภัยคุกคามร้ายแรงควรใช้ Tor Browser และต้องระวังช่องทางรั่วไหลอื่น ๆ ต่อไปก็จริง แต่ถ้า Tor ถูกใช้แพร่หลายไปทุกที่ การสอดส่องในวงกว้างคงยากขึ้นมาก
ตอนนี้การสอดส่องในวงกว้างสามารถตรวจจับได้ว่าใครใช้ Tor แต่ถ้าทุกคนใช้กันอยู่แล้ว ข้อเท็จจริงนั้นก็แทบไม่มีความหมาย
ทั้งหมดนี้ไม่ได้ใช้ได้เฉพาะกับ TCP เหรอ? กล่าวอีกอย่างคือ สงสัยว่ากิจกรรมที่ไม่ใช่ TCP จะป้องกันได้อย่างไร
โปรเจกต์นี้เป็นความพยายามในการสร้างสแตกเครือข่ายแบบ user-space อย่างง่ายที่จัดการสถานะของ TCP และ UDP ได้ เพื่อให้ส่งต่อทราฟฟิกไปยังเครือข่าย Tor ได้
คำแนะนำการติดตั้งหน้าแรกใช้งานไม่ได้ ต้องเปลี่ยนเลขเวอร์ชันจาก 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
https://raw.githubusercontent.com/orjail/orjail/master/usr/s...
ตอนแรกคิดว่านี่เป็นวิธีส่งทราฟฟิกผ่าน 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
https://tpo.pages.torproject.net/core/arti/
เรื่องน่าสนุกคือ สิ่งนี้เสียอยู่ใน curl มาตลอด 5 ปี และตัวอย่างในบล็อกก็เช่นกัน เพราะนักพัฒนา Tor เคยยืนกรานว่าแอปไม่ควรพยายาม resolve ชื่อโดเมน
.onion: https://daniel.haxx.se/blog/2025/05/16/leeks-and-leaks/หวังว่าจะหาทางแก้ได้
แปลว่าตอนนี้เข้าถึงเว็บไซต์ Tor ด้วย Chrome ได้แล้วใช่ไหม?
จริง ๆ แล้ว SOCKS proxy ที่ช่วย route ทราฟฟิกผ่านโปรโตคอลใดก็ได้สร้างได้ค่อนข้างง่าย เช่น ใช้ SOCKS5 proxy เป็นชั้นแปลง เพื่อให้บริการหรือเข้าชมเว็บไซต์ผ่าน syncthing ได้: https://github.com/acheong08/syndicate
ในตัวอย่างใช้ hexchat กระบวนการแบบนี้รันด้วยการตั้งค่าของผู้ใช้หรือเปล่า? ถ้าลืมเปลี่ยนการตั้งค่า ชื่อผู้ใช้ IRC จะไม่รั่วออกไปเหรอ
ถ้าเปิดเบราว์เซอร์ คุกกี้ก็อาจรั่วด้วยไหม?
กรณีล็อกอิน Gmail ผ่าน Tor ก็คงพูดแบบเดียวกันได้ ถ้าไม่ใช่ HTTPS น่ะนะ
ข้อเท็จจริงที่ว่าชื่อผู้ใช้ทั้งหมดที่เชื่อมต่อไปยัง IRC host เดียวกันเป็นคนเดียวกันก็ยังคงถูกเปิดเผยได้
ถ้าพยายามรักษาความไม่เปิดเผยตัวตน IRC ดูค่อนข้างอันตราย เพราะมีคนจำนวนมากบันทึกเวลา disconnect ไว้ และสามารถนำไปหาความสัมพันธ์กับเหตุการณ์เครือข่ายล่มอื่น ๆ ได้
ประสบการณ์ของนักพัฒนา ตรงนี้ทำออกมาได้ดีมาก ใช้ง่ายจนคนโง่ก็ใช้ได้ คนทำเก่งมาก <3
ดีเลย ทีนี้ช่วยเขียน prototype ใหม่เป็น C แล้วผมยินดีจะใช้