การรับส่งข้อมูล UDP ผ่านอุโมงค์ SSH


66

ชื่อค่อนข้างจะรวมมันขึ้นมา ฉันต้องการส่งทราฟฟิก UDP ผ่านอุโมงค์ SSH โดยเฉพาะฉันต้องสามารถส่งแพ็กเก็ต UDP ผ่านช่องสัญญาณและให้เซิร์ฟเวอร์สามารถส่งกลับมาให้ฉันได้อีกด้านหนึ่ง ฉันรู้วิธีการเชื่อมต่อ TCP มันเป็นไปได้กับ UDP?

คำตอบ:


36

คู่มือขนาดเล็กนี้จะบอกวิธีการส่งทราฟฟิก UDP ผ่าน SSH โดยใช้เครื่องมือที่ได้มาตรฐาน (ssh, nc, mkfifo) พร้อมกับระบบปฏิบัติการ UNIX

ดำเนินการการทันเนล UDP ผ่านการเชื่อมต่อ SSH

ทีละขั้นตอนเปิดพอร์ต TCP ไปข้างหน้าด้วยการเชื่อมต่อ SSH ของคุณ

บนเครื่องโลคัลของคุณ (โลคัล) เชื่อมต่อกับเครื่องไกล (เซิร์ฟเวอร์) โดย SSH ด้วยตัวเลือกเพิ่มเติม -L เพื่อให้ SSH กับพอร์ต TCP ไปข้างหน้า:

local# ssh -L 6667:localhost:6667 server.foo.com

สิ่งนี้จะทำให้การเชื่อมต่อ TCP บนหมายเลขพอร์ต 6667 ของเครื่องภายในของคุณถูกส่งต่อไปยังหมายเลขพอร์ต 6667 บน server.foo.com ผ่านช่องทางที่ปลอดภัย ตั้งค่า TCP เป็น UDP ไปข้างหน้าบนเซิร์ฟเวอร์

บนเซิร์ฟเวอร์เราเปิดฟังบนพอร์ต TCP 6667 ซึ่งจะส่งข้อมูลไปยังพอร์ต UDP 53 ของ IP ที่ระบุ หากคุณต้องการส่งต่อ DNS อย่างฉันคุณสามารถใช้ IP ของเนมเซิร์ฟเวอร์แรกที่คุณจะพบใน /etc/resolv.conf แต่ก่อนอื่นเราต้องสร้าง Fifo Fifo จำเป็นต้องมีการสื่อสารสองทางระหว่างสองช่องทาง ท่อเปลือกอย่างง่ายจะสื่อสาร 'อินพุตมาตรฐานไปยังกระบวนการที่ถูกต้อง' ของอินพุตด้านซ้าย

server# mkfifo /tmp/fifo
server# nc -l -p 6667 < /tmp/fifo | nc -u 192.168.1.1 53 > /tmp/fifo

สิ่งนี้จะทำให้ทราฟฟิก TCP บนพอร์ตของเซิร์ฟเวอร์ 6667 ถูกส่งต่อไปยังทราฟฟิก UDP บนพอร์ต 53.16 ของ 192.168.1.1 และการตอบกลับจะกลับมา ตั้งค่า UDP เป็น TCP ไปข้างหน้าบนเครื่องของคุณ

ตอนนี้เราต้องทำสิ่งที่ตรงกันข้ามกับสิ่งที่ทำบนเครื่องในท้องถิ่น คุณต้องมีสิทธิ์การเข้าถึงแบบพิเศษเพื่อผูกพอร์ต UDP 53

local# mkfifo /tmp/fifo
local# sudo nc -l -u -p 53 < /tmp/fifo | nc localhost 6667 > /tmp/fifo

วิธีนี้จะช่วยให้ทราฟฟิก UDP บนพอร์ตของเครื่องภายใน 53 ส่งต่อไปยังทราฟฟิก TCP บนพอร์ตของเครื่องภายใน 6667 เพลิดเพลินไปกับเซิร์ฟเวอร์ DNS ในเครื่องของคุณ :)

ตามที่คุณอาจคาดเดาได้ในขณะนี้เมื่อมีการสืบค้น DNS ในเครื่องโลคัลเช่นบนพอร์ต UDP ท้องถิ่น 53 มันจะถูกส่งต่อไปยังพอร์ต TCP ท้องถิ่น 6667 จากนั้นไปยังพอร์ต TCP ของเซิร์ฟเวอร์ 6667 จากนั้นไปยังเซิร์ฟเวอร์ DNS ของเซิร์ฟเวอร์ , UDP พอร์ต 53 จาก 192.168.1.1 ในการเพลิดเพลินกับบริการ DNS ในเครื่องของคุณให้ใส่บรรทัดต่อไปนี้เป็นเนมเซิร์ฟเวอร์แรกใน /etc/resolv.conf ของคุณ:

nameserver 127.0.0.1

28
วิธีนี้ไม่ปลอดภัย ไม่รับประกันการสตรีม TCP เพื่อรักษาขอบเขตของข้อความดังนั้นเดตาแกรม UDP เดี่ยวอาจถูกแบ่งเป็นส่วน ๆ ทำลายโปรโตคอลใด ๆ
Juho Östman

2
มันอาจจะดีถ้าใช้พอร์ต 1153 แทน 6667 (จากตัวอย่าง SSH ของมนุษย์) ซึ่ง IRC ใช้
phil pirozhkov

1
@ JuhoÖstmanขอบคุณที่ชี้ให้เห็นข้อผิดพลาดนี้ การรับรู้ปัญหา ... คุณเรียกใช้วิธีแก้ปัญหาหรือไม่? ข้อความที่มีขนาดเล็กพอจะเป็นวิธีที่จะทำให้ทำงานได้หรือไม่
มนุษยชาติ

4
วิธีแก้ปัญหาคือการเพิ่มความยาวให้กับแต่ละแพ็กเก็ตก่อนที่จะส่งผ่านสตรีม TCP และสร้างแพ็กเก็ตดั้งเดิมขึ้นมาใหม่ มันง่ายที่จะเขียนสคริปต์ C เพื่อทำสิ่งนั้น แต่ฉันไม่แน่ใจว่ามีวิธีแก้ปัญหาที่พร้อมใช้งานอยู่หรือไม่ ในทางปฏิบัติ TCP มักจะดูเหมือนว่าจะรักษาขอบเขตของข้อความในกรณีนี้ แต่ความล้มเหลวที่แปลกสามารถเกิดขึ้นได้ตลอดเวลา
Juho Östman

ฉันประสบปัญหาอื่นกับสิ่งนี้: ไปป์และ Fifo ถูกบัฟเฟอร์ดังนั้นขอบเขตของเฟรมจะหายไป เฟรม UDP จำนวนมากสามารถต่อกันเป็นหนึ่งเฟรม TCP
Julio Guerra

26

ตัวอย่างนี้(ฉันคิดว่าคำตอบของ John นั้นเหมือนกันในที่อื่น) อธิบายวิธีเข้าถึงบริการ UDP / DNS ของเครื่องอื่นผ่านการเชื่อมต่อ TCP / SSH

เราจะส่งต่อการรับส่งข้อมูลภายใน UDP / 53 ไปยัง TCP จากนั้นรับส่งข้อมูล TCP ด้วยกลไกการส่งต่อพอร์ตของ SSH ไปยังเครื่องอื่นจากนั้น TCP ไปยัง UDP / 53 ที่ปลายอีกด้านหนึ่ง
โดยปกติแล้วคุณสามารถทำได้ด้วย openvpn
แต่ที่นี่เราจะทำมันด้วยเครื่องมือที่ง่ายกว่านี้คือ openssh และ netcat เท่านั้น

ในตอนท้ายของหน้านั้นเป็นอีกความคิดเห็นที่มีการอ้างอิงถึง ' socat',
การเข้าถึง UDP / DNS เดียวกันกับ

ฝั่งเซิร์ฟเวอร์: socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
ฝั่งไคลเอ็นต์:socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353

อ้างถึงตัวอย่าง socatสำหรับข้อมูลเพิ่มเติม


3
ดูเหมือนว่าสิ่งนี้มีประโยชน์สำหรับฉันมากกว่าคำตอบที่ยอมรับ ผมจำเป็นต้องมีการเปลี่ยนเส้นทางทิศทางเดียวของวิดีโอสตรีม (TS / UDP) ... ssh orig_strm_src socat udp4-listen:4003,reuseaddr,fork STDOUT| socat STDIN udp-sendto:localhost:4003
nhed

FWIW ฉันได้เขียนคำแนะนำโดยละเอียดเพิ่มเติมในหน้าแรกของฉันเพื่ออธิบายวิธีตั้งค่า socat ผ่าน SSH สำหรับการส่งต่อ UDP มันใช้ SNMP เป็นตัวอย่าง
Peter V. Mørch

20

SSH (อย่างน้อย OpenSSH) มีการสนับสนุน VPN ง่าย ๆ ใช้-wหรือTunnelตัวเลือกในsshไคลเอนต์คุณสามารถสร้างtunอุปกรณ์ที่ปลายทั้งสองซึ่งสามารถใช้ในการส่งต่อการรับส่งข้อมูล IP ใด ๆ (โปรดดูTunnelในหน้าคู่มือของssh_config(5)) โปรดทราบว่าต้องใช้ OpenSSH (และอาจเป็นสิทธิ์ของรูท) ที่ปลายทั้งสอง


สิ่งนี้ต้องการสิทธิ์รูทบนเครื่องรีโมตแม้ว่าจะใช้ช่องสัญญาณ UDP ของพอร์ตที่ไม่ได้รับการยกเว้นและตั้งค่า PermitRootLogin เป็น 'ไม่' เลวมาก.
phil pirozhkov

@grawity ขอขอบคุณที่ชี้ให้เห็นตัวเลือกนี้ซึ่งแม้เมื่อชี้ให้เห็นโดย philpirozhkov การเข้าสู่ระบบรากที่จำเป็น ฉันสงสัยว่าอาจมีวิธีที่จะหลอกลวงให้มันไม่ต้องการรากได้หรือไม่?
humanityANDpeace

4
@humanityANDpeace: คุณสามารถ precreate ถัง / ip tuntap addอุปกรณ์ประปาและทำให้พวกเขาเป็นเจ้าของโดยผู้ใช้ที่ระบุโดยใช้
grawity

สวัสดี @grawity ฉันชอบโซลูชันของคุณ แต่ไม่สามารถใช้งานได้ ฉันทำtunอุปกรณ์ล่วงหน้าดังนี้: sudo ip tuntap add mode tunแต่เมื่อใช้-wตัวเลือกดังนี้: ssh $Server -w $portฉันได้รับTunnel device open failed. Could not request tunnel forwarding.ฉันทำอะไรผิด
Lucas Aimaretto

16

หรือคุณสามารถใช้ssf (ซึ่งถูกออกแบบมาเพื่อจัดการกับกรณีการใช้งานนี้) โดยใช้คำสั่งง่ายๆ:


ด้านลูกค้า:

#>./ssfc -U 53:192.168.1.1:53 server.foo.com

คำสั่งนี้เปลี่ยนเส้นทางพอร์ตท้องถิ่น 53 (dns) ไปยัง 192.168.1.1 พอร์ต 53 ผ่านช่องสัญญาณที่ปลอดภัยระหว่าง localhost และ server.foo.com


คุณจะต้องใช้เซิร์ฟเวอร์ ssf (แทน- หรือถัดจาก -เซิร์ฟเวอร์ ssh ของคุณ):

#>./ssfs

โดยวิธีการทั้งลูกค้าและฝั่งเซิร์ฟเวอร์ของ ssf ทำงานบน Windows / Linux / Mac นี่เป็นแอปพลิเคชัน userland ดังนั้นคุณจึงไม่จำเป็นต้องมี tun / tap หรือ VPN

ในการเปลี่ยนเส้นทางพอร์ต 53 คุณจะต้องมีสิทธิ์ระดับผู้ดูแลระบบโดยไม่คำนึงถึงเครื่องมือที่คุณใช้

สำหรับข้อมูลเพิ่มเติมรายละเอียดใช้เคสหรือดาวน์โหลด: https://securesocketfunneling.github.io/ssf/


โปรดตอบด้วยความระมัดระวัง "นี่คือผลิตภัณฑ์ของฉัน" มันเป็นจดหมายขยะ ผมขอแนะนำให้อ่านและตามแนวทางจากศูนย์ช่วยเหลือ
หนัก

7
อย่างมากก็คือปลั๊กไร้ยางอาย อย่างไรก็ตามวิธีการแก้ปัญหาอาจเหมาะสมกับคำขอของคุณ โดยวิธีการที่ SSF เป็น OpenSource และไม่แสวงหาผลกำไร
ssf-Developers

11
@heavyd: ถ้าเขาโพสต์สคริปต์แฮ็คจำนวนมากมันจะเป็นที่ยอมรับได้ แต่เพราะเขาทำเครื่องมือโอเพนซอร์สที่สมบูรณ์แบบ มันตอบคำถามเดิมได้อย่างสมบูรณ์แบบ
Synthead

ฉันต้องยอมรับอย่างเสียไม่ได้ว่านี่เป็นเครื่องมือที่ฉันกำลังมองหาอย่างแน่นอนแม้ว่ามันจะเป็นปลั๊กที่ไร้ยางอาย
therealrootuser

9

ฉันไม่ncสามารถทำงานกับ SNMP ได้เนื่องจากไคลเอนต์ SNMP เลือกพอร์ต UDP แหล่งใหม่และหลายคนสามารถใช้งานได้ในครั้งเดียว

แต่ฉันได้เขียนโพสต์ที่อธิบายถึงวิธีการใช้กับโพสต์บล็อกsocatนี้โดยใช้ SNMP เป็นตัวอย่าง เป็นหลักโดยใช้สองขั้วเริ่มต้นด้วยภาพรวม:

ภาพรวม

อาคารหนึ่ง:

client$ ssh -L 10000:localhost:10000 server
server$ socat -T10 TCP4-LISTEN:10000,fork UDP4:switch:161

สิ่งนี้จะสร้างการส่งต่อ SSH ของพอร์ต TCP 10000 และเรียกใช้ socat บนเซิร์ฟเวอร์ สังเกตว่าที่อยู่ IP ของสวิตช์นั้นถูกกล่าวถึงในบรรทัดคำสั่ง socat เป็น“ สวิตช์”

อาคารสอง:

client$ sudo socat UDP4-LISTEN:161,fork TCP4:localhost:10000

ที่ตั้งค่า socat บนไคลเอนต์ ที่ควรทำ


นี้ทำงานให้ฉัน :)
พอล Fenney

4

VPN เป็นโซลูชันที่ดีกว่าถ้าคุณสามารถเข้าถึงพอร์ต UDP

หากคุณมีสิทธิ์เข้าถึงพอร์ต TCP SSH เท่านั้นอุโมงค์ SSH นั้นดีพอ ๆ กับ VPN อย่างน้อยสำหรับ ping และ backtracking แพ็กเก็ต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.