ชื่อค่อนข้างจะรวมมันขึ้นมา ฉันต้องการส่งทราฟฟิก UDP ผ่านอุโมงค์ SSH โดยเฉพาะฉันต้องสามารถส่งแพ็กเก็ต UDP ผ่านช่องสัญญาณและให้เซิร์ฟเวอร์สามารถส่งกลับมาให้ฉันได้อีกด้านหนึ่ง ฉันรู้วิธีการเชื่อมต่อ TCP มันเป็นไปได้กับ UDP?
ชื่อค่อนข้างจะรวมมันขึ้นมา ฉันต้องการส่งทราฟฟิก UDP ผ่านอุโมงค์ SSH โดยเฉพาะฉันต้องสามารถส่งแพ็กเก็ต UDP ผ่านช่องสัญญาณและให้เซิร์ฟเวอร์สามารถส่งกลับมาให้ฉันได้อีกด้านหนึ่ง ฉันรู้วิธีการเชื่อมต่อ TCP มันเป็นไปได้กับ UDP?
คำตอบ:
คู่มือขนาดเล็กนี้จะบอกวิธีการส่งทราฟฟิก 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
ตัวอย่างนี้(ฉันคิดว่าคำตอบของ 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สำหรับข้อมูลเพิ่มเติม
ssh orig_strm_src socat udp4-listen:4003,reuseaddr,fork STDOUT| socat STDIN udp-sendto:localhost:4003
SSH (อย่างน้อย OpenSSH) มีการสนับสนุน VPN ง่าย ๆ ใช้-w
หรือTunnel
ตัวเลือกในssh
ไคลเอนต์คุณสามารถสร้างtun
อุปกรณ์ที่ปลายทั้งสองซึ่งสามารถใช้ในการส่งต่อการรับส่งข้อมูล IP ใด ๆ (โปรดดูTunnel
ในหน้าคู่มือของssh_config(5)
) โปรดทราบว่าต้องใช้ OpenSSH (และอาจเป็นสิทธิ์ของรูท) ที่ปลายทั้งสอง
ip tuntap add
อุปกรณ์ประปาและทำให้พวกเขาเป็นเจ้าของโดยผู้ใช้ที่ระบุโดยใช้
tun
อุปกรณ์ล่วงหน้าดังนี้: sudo ip tuntap add mode tun
แต่เมื่อใช้-w
ตัวเลือกดังนี้: ssh $Server -w $port
ฉันได้รับTunnel device open failed. Could not request tunnel forwarding.
ฉันทำอะไรผิด
หรือคุณสามารถใช้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/
ฉันไม่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 บนไคลเอนต์ ที่ควรทำ
VPN เป็นโซลูชันที่ดีกว่าถ้าคุณสามารถเข้าถึงพอร์ต UDP
หากคุณมีสิทธิ์เข้าถึงพอร์ต TCP SSH เท่านั้นอุโมงค์ SSH นั้นดีพอ ๆ กับ VPN อย่างน้อยสำหรับ ping และ backtracking แพ็กเก็ต