Repo นี้มีไคลเอนต์และเซิร์ฟเวอร์ที่อนุญาตให้คุณส่งสัญญาณการรับส่งข้อมูล TCP และ UDP ผ่านโปรโตคอลเครือข่ายอื่น ๆ
ปัจจุบันอุโมงค์ที่รองรับคือ:
เครื่องมือหลักเขียนด้วยภาษา Rust และการทดสอบแบบ end-to-end เขียนด้วย Python
docker pull ghcr.io/dlemel8/tunneler-server:latest
docker pull ghcr.io/dlemel8/tunneler-client:latest
cargo --version || curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo build --release
นอกจากนี้ยังมีไฟล์นักเทียบท่าหากคุณต้องการสร้างอิมเมจนักเทียบท่าในเครื่อง
docker run -e LOCAL_PORT=45301
-e REMOTE_PORT=5201
-e REMOTE_ADDRESS=localhost
-e TUNNELED_TYPE=udp
--rm -p 45301:45301 ghcr.io/dlemel8/tunneler-server:latest tcp
./target/release/client
--tunneled-type tcp
--remote-address 1.1.1.1
--remote-port 53
--log-level debug
dns
--read-timeout-in-milliseconds 100
--idle-client-timeout-in-milliseconds 30000
เรียกใช้อิมเมจนักเทียบท่าหรือไบนารีที่คอมไพล์ด้วย --help
เพื่อดูข้อมูลเพิ่มเติม
cargo test --all-targets
python3 -m pip install -r e2e_tests/requirements.txt
PYTHONPATH=. python3 -m pytest -v
repo นี้มีตัวอย่างการปรับใช้เซิร์ฟเวอร์บางส่วนโดยใช้ Docker Compose:
คุณสามารถเรียกใช้แต่ละตัวอย่างในเครื่องหรือปรับใช้โดยใช้ Terraform และ Ansible ดูข้อมูลเพิ่มเติมได้ที่นี่
แต่ละไฟล์ปฏิบัติการประกอบด้วย 2 องค์ประกอบที่สื่อสารผ่านช่องทางของสตรีมไคลเอ็นต์ (ตัวอ่านและตัวเขียนไบต์จำนวนไบต์):
ทราฟฟิกที่ใช้ TCP จะถูกแปลงเป็นสตรีมเล็กน้อย การแปลงการรับส่งข้อมูลตาม UDP ขึ้นอยู่กับโปรโตคอลทันเนล
การรับส่งข้อมูลแบบ UDP ยังต้องมีวิธีในการระบุไคลเอ็นต์ที่มีอยู่เพื่อดำเนินการต่อเซสชันของตน วิธีแก้ไขคือแคชไคลเอ็นต์ในหน่วยความจำที่แมปตัวระบุของไคลเอ็นต์กับสตรีม
ในการแปลงการรับส่งข้อมูล UDP เป็นสตรีม ส่วนหัวขนาด 2 ไบต์ (ใน big endian) จะอยู่ข้างหน้าแต่ละเพย์โหลดแพ็กเก็ต
UDP Listener ใช้ที่อยู่แพ็กเก็ตเพียร์ขาเข้าเป็นกุญแจสำคัญในการแคชไคลเอ็นต์
เรามีความท้าทายบางประการที่นี่:
เพื่อแก้ปัญหาความท้าทายเหล่านั้น แต่ละเซสชันของไคลเอ็นต์จะเริ่มต้นด้วยการสร้างรหัสไคลเอ็นต์แบบสุ่ม (ตัวอักษรและตัวเลข 4 ตัว) ลูกค้าอ่านข้อมูลไปยังช่องสัญญาณและเรียกใช้ผ่านไปป์ไลน์ของตัวเข้ารหัส:
จากนั้นข้อมูลที่เข้ารหัสจะถูกใช้เป็นชื่อของแบบสอบถาม TXT DNS
หากคุณเป็นเจ้าของเซิร์ฟเวอร์ DNS ที่เชื่อถือได้ ไคลเอนต์สามารถส่งคำขอไปยังตัวแก้ไข DNS แบบเรียกซ้ำได้ ตัวแก้ไขจะได้รับ IP ของคุณจากผู้รับจดทะเบียนชื่อโดเมนของคุณและส่งต่อคำขอไปยัง IP ของคุณ อีกทางเลือกหนึ่ง (เร็วกว่าแต่ชัดเจนกว่าสำหรับเครื่องมือวิเคราะห์การรับส่งข้อมูล) คือการกำหนดค่าไคลเอนต์ให้ส่งคำขอไปยัง IP ของคุณโดยตรง (บนพอร์ต UDP/53 หรือเซิร์ฟเวอร์พอร์ตอื่น ๆ ที่กำลังฟังอยู่)
เซิร์ฟเวอร์ถอดรหัสข้อมูล (โดยไม่สนใจการรับส่งข้อมูลที่ไม่ใช่ไคลเอ็นต์) และใช้ Client ID เป็นกุญแจสำคัญในการแคชไคลเอ็นต์
เพื่อจัดการกับการตอบสนองของเซิร์ฟเวอร์ขนาดใหญ่และ TCP ACK ที่ว่างเปล่า การหมดเวลาการอ่านจะใช้ทั้งในไคลเอนต์และเซิร์ฟเวอร์ หากหมดเวลาการอ่าน ข้อความว่างเปล่าจะถูกส่งไป ทั้งไคลเอนต์และเซิร์ฟเวอร์ใช้การหมดเวลาที่ไม่ได้ใช้งานเพื่อหยุดการส่งต่อและล้างทรัพยากรในเครื่อง
ในการใช้การรับรองความถูกต้องร่วมกัน เราใช้ผู้ออกใบรับรองส่วนตัว:
ทั้งไคลเอ็นต์และเซิร์ฟเวอร์ได้รับการกำหนดค่าให้ใช้คีย์และใบรับรองในการจับมือ TLS ใบรับรอง CA ถูกใช้เป็นใบรับรองหลัก
เนื่องจากมีการใช้ส่วนขยายการระบุชื่อเซิร์ฟเวอร์ ไคลเอนต์จึงร้องขอชื่อเซิร์ฟเวอร์เฉพาะ และเซิร์ฟเวอร์กำลังให้บริการใบรับรองเฉพาะเมื่อมีการร้องขอชื่อนั้นเท่านั้น ชื่อเซิร์ฟเวอร์จะต้องเป็นส่วนหนึ่งของใบรับรองด้วย เช่น ชื่อทางเลือกของหัวเรื่อง