เครื่องมือบรรทัดคำสั่งสำหรับการขุดอุโมงค์ดาตาแกรม UDP ผ่าน TCP
มันมีประโยชน์อย่างยิ่งสำหรับการขุดอุโมงค์ UDP บน SSH
เครื่องมือนี้ได้รับการออกแบบมาโดยเฉพาะสำหรับการใช้งานที่คุณมีสองแอปพลิเคชันที่ต้องสื่อสารกันผ่าน UDP โดยไม่มีความสัมพันธ์ระหว่างไคลเอนต์และเซิร์ฟเวอร์ที่ชัดเจน นั่นคือ แอปพลิเคชันใดแอปพลิเคชันหนึ่งอาจเริ่มต้นแพ็กเก็ต และจะต้องกำหนดค่าด้วยที่อยู่ของอีกแอปหนึ่งเมื่อเริ่มต้นระบบ (กล่าวคือ พอร์ตไม่สามารถสุ่มได้)
คุณเรียกใช้ udp-over-tcp
บนโฮสต์ของแอปพลิเคชันทั้งสอง แต่ละอินสแตนซ์ทำหน้าที่เป็นแบบจำลองภายในเครื่องชนิดหนึ่งบนแอปพลิเคชันที่ทำงานบนอีกอินสแตนซ์หนึ่ง หากแอปพลิเคชันบนโฮสต์หนึ่งฟังบนพอร์ต UDP P ดังนั้น udp-over-tcp
จะฟังบนพอร์ต UDP P บนโฮสต์ อื่น และตรวจสอบให้แน่ใจว่าการรับส่งข้อมูลไปยังแบบจำลอง P ไปที่พอร์ต P ของแอปพลิเคชันจริง สิ่งสำคัญที่สุดคือ udp-over-tcp
จะทำสิ่งนี้กับพอร์ตของทั้งสองแอปพลิเคชันพร้อมกันและเชื่อมโยงพอร์ตต่างๆ มันจะ "แกล้งทำเป็น" อย่างมีประสิทธิภาพว่าแต่ละแอปพลิเคชันทำงานอยู่ในเครื่องซึ่งกันและกัน
โดยพื้นฐานแล้ว หากแอปพลิเคชันบนโฮสต์หนึ่งส่งดาตาแกรมจากพอร์ต P ไปยังพอร์ต (แบบจำลองในเครื่อง) Q ดาตาแกรมจะมาถึงพอร์ตของแอปพลิเคชันจริง (ระยะไกล) Q พร้อมด้วยพอร์ตต้นทางของ P ซึ่งหมายความว่าแอปพลิเคชันจะเห็นที่อยู่เดียว (localhost) และพอร์ตเดียวกันเสมอ (พอร์ตของแอปพลิเคชันอื่น) และคู่ที่อยู่-โฮสต์เดียวกันนั้นยังสามารถใช้ในการกำหนดค่าเพียร์สำหรับแอปพลิเคชันได้
หวังว่าแผนภาพต่อไปนี้สามารถช่วยในการทำความเข้าใจการตั้งค่า udp-over-tcp
ได้:
โปรแกรมนี้ได้รับการคอมไพล์ไว้ล่วงหน้าสำหรับหลายแพลตฟอร์ม (ขอบคุณ cargo-dist!) และควรสามารถเรียกใช้งานได้ทันทีโดยไม่ต้องพึ่งพาใดๆ
หรือคุณสามารถติดตั้งผ่าน Cargo ได้ด้วย
$ cargo install udp-over-tcp
คุณมีแอปพลิเคชัน UDP ที่ทำงานบนโฮสต์ X บนพอร์ต A คุณต้องการให้แอปพลิเคชันดังกล่าวพูดคุยกับแอปพลิเคชัน UDP ที่ทำงานบนโฮสต์ Y บนพอร์ต B และคุณยังต้องการให้แอปพลิเคชันบน Y พูดคุยกับ A บน X เยี่ยมมาก ดังต่อไปนี้:
บนโฮสต์ใดโฮสต์หนึ่ง (ในที่นี้ X) ขั้นแรกให้สร้างอุโมงค์ TCP ไปยังโฮสต์อื่น:
ssh -L 7878:127.0.0.1:7878 $Y
ถัดไป ให้รัน udp-over-tcp บนโฮสต์ทั้งสอง โดยอันหนึ่งมี --tcp-listen
และอีกอันหนึ่งมี --tcp-connect
ควรใช้ --tcp-listen
บนโฮสต์ที่การส่งต่ออนุญาตให้เชื่อมต่อ ได้ (ที่นี่ Y) คุณสามารถเรียกใช้ตามลำดับใดก็ได้ แต่แนวทางปฏิบัติที่ดีที่สุดคือการฟังก่อน:
Y $ udp-over-tcp --tcp-listen 7878 --udp-bind $A --udp-sendto $B
X $ udp-over-tcp --tcp-connect 7878 --udp-bind $B --udp-sendto $A
บน Y สิ่งนี้จะฟังบนพอร์ต UDP $A ส่งต่อสิ่งเหล่านั้นผ่าน TCP ไปยัง X จากนั้นส่งไปยังพอร์ต UDP $A ที่นั่น บน X สิ่งนี้จะฟังบนพอร์ต UDP $B ส่งต่อสิ่งเหล่านั้นผ่าน TCP ไปยัง Y จากนั้นส่งไปยังพอร์ต UDP $B ที่นั่น
ตอนนี้กำหนดค่าแอปพลิเคชันบน X ให้ส่งไปที่ 127.0.0.1:$B และกำหนดค่าแอปพลิเคชันบน Y ให้ส่งไปที่ 127.0.0.1:$A กล่าวอีกนัยหนึ่งคือพอร์ตเดียวกันที่อยู่ IP ในเครื่อง
แต่ละอาร์กิวเมนต์ใช้หมายเลขพอร์ต (ตามด้านบน) หรือ addr:port เพื่อระบุที่อยู่ (ที่อยู่เริ่มต้นคือ 0.0.0.0 สำหรับ Listen/bind และ 127.0.0.1 สำหรับเชื่อมต่อ/Sendto)
มีเครื่องมืออื่นๆ ที่สามารถช่วยแก้ปัญหานี้ได้ แม้ว่าจะมีคุณสมบัติที่แตกต่างจากเครื่องมือนี้ก็ตาม
โซลูชันที่ใช้ nc
หรือ socat
จะไม่รักษาขอบเขตดาตาแกรม UDP ซึ่งหมายความว่า sendmsg
UDP สองครั้งสามารถทำให้ข้อความเดียว (รวมกัน) มาถึงผ่าน recvfrom
แอปพลิเคชัน UDP จำนวนมากไม่ยืดหยุ่นต่อสิ่งนี้เนื่องจากต้องใช้ UDP ในการจัดเฟรมข้อความ
udp-over-tcp ของ mullvad ให้การส่งต่อแบบไม่มีทิศทางเท่านั้น เราสามารถเรียกใช้อินสแตนซ์เพิ่มเติมของเครื่องมือเพื่อส่งต่อในทิศทางอื่นได้ แม้ว่าการทำเช่นนั้นหมายความว่าพอร์ตต้นทางของดาตาแกรมขาเข้าจะไม่ตรงกับพอร์ตปลายทางของดาตาแกรมขาออก อย่างไรก็ตาม นี่อาจเป็นเรื่องปกติสำหรับแอปพลิเคชันสไตล์ไคลเอ็นต์-เซิร์ฟเวอร์ที่พอร์ตของไคลเอ็นต์ไม่สำคัญ
ได้รับอนุญาตภายใต้ข้อใดข้อหนึ่ง
ตามตัวเลือกของคุณ
เว้นแต่คุณจะระบุไว้เป็นอย่างอื่นอย่างชัดเจน การสนับสนุนใดๆ ที่ส่งโดยเจตนาเพื่อรวมไว้ในผลงานของคุณ ตามที่กำหนดไว้ในใบอนุญาต Apache-2.0 จะต้องได้รับใบอนุญาตแบบคู่ตามที่กล่าวไว้ข้างต้น โดยไม่มีข้อกำหนดหรือเงื่อนไขเพิ่มเติมใดๆ