Lưu lượng UDP thông qua đường hầm SSH


66

Tiêu đề khá nhiều tổng hợp nó lên. Tôi muốn gửi lưu lượng UDP thông qua một đường hầm SSH. Cụ thể, tôi cần có thể gửi các gói UDP qua đường hầm và để máy chủ có thể gửi chúng lại cho tôi ở phía bên kia. Tôi biết làm thế nào để làm điều đó cho các kết nối TCP. Đây có phải là có thể với UDP?

Câu trả lời:


36

Hướng dẫn nhỏ này cho bạn biết cách gửi lưu lượng UDP qua SSH bằng các công cụ đạt tiêu chuẩn (ssh, nc, mkfifo) với hầu hết các hệ điều hành giống UNIX.

Thực hiện đường hầm UDP thông qua kết nối SSH

Từng bước Mở cổng chuyển tiếp TCP bằng kết nối SSH của bạn

Trên máy cục bộ (cục bộ) của bạn, kết nối với máy (máy chủ) ở xa bằng SSH, với tùy chọn -L bổ sung để SSH có cổng TCP chuyển tiếp:

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

Điều này sẽ cho phép các kết nối TCP trên cổng số 6667 của máy cục bộ của bạn được chuyển tiếp đến cổng số 6667 trên server.foo.com thông qua kênh bảo mật. Thiết lập chuyển tiếp TCP sang UDP trên máy chủ

Trên máy chủ, chúng tôi mở một trình lắng nghe trên cổng TCP 6667 sẽ chuyển tiếp dữ liệu tới cổng UDP 53 của một IP được chỉ định. Nếu bạn muốn thực hiện chuyển tiếp DNS như tôi, bạn có thể lấy IP của máy chủ tên đầu tiên bạn sẽ tìm thấy trong /etc/resolv.conf. Nhưng trước tiên, chúng ta cần tạo ra một fifo. Fifo là cần thiết để có liên lạc hai chiều giữa hai kênh. Một ống vỏ đơn giản sẽ chỉ giao tiếp đầu ra tiêu chuẩn 'đầu ra tiêu chuẩn sang đầu vào tiêu chuẩn' bên phải.

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

Điều này sẽ cho phép lưu lượng TCP trên cổng 6667 của máy chủ được chuyển tiếp đến lưu lượng UDP trên cổng 53.168.1.1 và phản hồi sẽ quay trở lại. Thiết lập chuyển tiếp UDP sang TCP trên máy của bạn

Bây giờ, chúng ta cần làm ngược lại với những gì đã được thực hiện trên máy cục bộ. Bạn cần quyền truy cập được mã hóa để ràng buộc cổng UDP 53.

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

Điều này sẽ cho phép lưu lượng UDP trên cổng 53 của máy cục bộ được chuyển tiếp đến lưu lượng TCP trên cổng 6667 của máy cục bộ. Tận hưởng máy chủ DNS cục bộ của bạn :)

Như bạn có thể đoán bây giờ, khi một truy vấn DNS sẽ được thực hiện trên máy cục bộ, ví dụ trên cổng UDP cục bộ 53, nó sẽ được chuyển tiếp đến cổng TCP cục bộ 6667, sau đó đến cổng TCP 6667 của máy chủ, sau đó đến máy chủ DNS của máy chủ , Cổng UDP 53 của 192.168.1.1. Để tận hưởng các dịch vụ DNS trên máy cục bộ của bạn, hãy đặt dòng sau làm máy chủ tên đầu tiên trong /etc/resolv.conf:

nameserver 127.0.0.1

28
Giải pháp này không an toàn. Các luồng TCP không được đảm bảo để duy trì ranh giới thông báo, do đó, một datagram UDP duy nhất có thể được chia thành nhiều phần, phá vỡ mọi giao thức.
Juho Östman

2
Cũng có thể tốt khi sử dụng cổng 1153 thay vì 6667 (từ ví dụ về SSH của người đàn ông), được IRC sử dụng.
phil pirozhkov

1
@ JuhoÖstman Cảm ơn bạn đã chỉ ra cạm bẫy này. Nhận thức được vấn đề ... bạn đã chạy accros một giải pháp chưa? tin nhắn đủ nhỏ sẽ là một cách để làm cho nó có khả năng làm việc?
nhân

4
Giải pháp sẽ là thêm trước một chiều dài cho mỗi gói trước khi chúng được gửi qua luồng TCP và xây dựng lại các gói ban đầu từ đó. Thật dễ dàng để viết một tập lệnh C để làm điều đó, nhưng tôi không chắc liệu một giải pháp có sẵn có tồn tại hay không. Trong thực tế, TCP dường như thường duy trì ranh giới tin nhắn trong trường hợp này, nhưng những thất bại kỳ lạ có thể xảy ra bất cứ lúc nào.
Juho Östman

Tôi phải đối mặt với một vấn đề khác với điều này: ống và fifo được đệm để ranh giới khung bị mất. Vì vậy, nhiều khung UDP có thể được nối vào một khung TCP.
Julio Guerra

26

Ví dụ này (tôi nghĩ câu trả lời của John chỉ ra điều tương tự ở một nơi khác), mô tả cách truy cập các dịch vụ UDP / DNS của máy khác qua kết nối TCP / SSH.

Chúng tôi sẽ chuyển tiếp lưu lượng UDP / 53 cục bộ sang TCP, sau đó lưu lượng TCP với cơ chế chuyển tiếp cổng của SSH sang máy khác, sau đó TCP sang UDP / 53 ở đầu bên kia.
Thông thường, bạn có thể làm điều đó với openvpn.
Nhưng ở đây, chúng tôi sẽ làm điều đó với các công cụ đơn giản hơn, chỉ có openssh và netcat.

Ở cuối trang đó, là một nhận xét khác có tham chiếu đến ' socat',
Truy cập UDP / DNS tương tự được thực hiện với,

Phía máy chủ: socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
Phía máy khách:socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353

Tham khảo các ví dụ socat để biết thêm.


3
Điều này có vẻ hữu ích hơn nhiều đối với tôi so với câu trả lời được chấp nhận. Tôi cần chuyển hướng một chiều của luồng video (TS / UDP) ... ssh orig_strm_src socat udp4-listen:4003,reuseaddr,fork STDOUT| socat STDIN udp-sendto:localhost:4003
nhed

FWIW, tôi đã viết một hướng dẫn chi tiết hơn trên trang chủ của mình mô tả cách thiết lập socat qua SSH để chuyển tiếp UDP. Nó sử dụng SNMP làm ví dụ.
Peter V. Mørch

20

SSH (ít nhất là OpenSSH) có hỗ trợ cho các VPN đơn giản. Sử dụng tùy chọn -whoặc Tunneltrong sshmáy khách, bạn có thể tạo một tunthiết bị ở cả hai đầu, có thể được sử dụng để chuyển tiếp bất kỳ loại lưu lượng IP nào. (Xem thêm Tunneltrong trang hướng dẫn của ssh_config(5).) Lưu ý rằng điều này yêu cầu OpenSSH (và có thể là quyền root) ở cả hai đầu.


Điều này đòi hỏi quyền root trên máy từ xa ngay cả đối với đường hầm UDP của các cổng không được mã hóa và PermitRootLogin được đặt thành không 'không'. Quá tệ.
phil pirozhkov

@grawity Cảm ơn bạn đã chỉ ra tùy chọn này, ngay cả khi được chỉ ra bởi philpirozhkov, đăng nhập root cần thiết. Tôi tự hỏi nếu có thể có một cách để lừa nó không cần root?
nhân

4
@humanityANDpeace: Bạn có thể tiền xử lý các thiết bị tun / tap và khiến chúng thuộc sở hữu của một người dùng cụ thể, sử dụng ip tuntap add.
grawity

Xin chào @grawity. Tôi thích giải pháp của bạn nhưng không thể làm cho nó hoạt động. Tôi đã xử lý trước tunthiết bị như sau: sudo ip tuntap add mode tunnhưng bao giờ sử dụng -wtùy chọn như thế này: ssh $Server -w $portTôi nhận được Tunnel device open failed. Could not request tunnel forwarding.Tôi đang làm gì sai?
Lucas Aimaretto

16

Hoặc bạn có thể chỉ cần sử dụng ssf (được thiết kế để xử lý trường hợp sử dụng này), bằng một lệnh đơn giản:


Phía khách hàng:

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

Lệnh này chuyển hướng cổng cục bộ 53 (dns) sang 192.168.1.1 cổng 53, thông qua một đường hầm an toàn giữa localhost và server.foo.com.


Bạn sẽ cần một máy chủ ssf (thay vì - hoặc bên cạnh - máy chủ ssh của bạn):

#>./ssfs

Nhân tiện, cả phía máy khách và máy chủ của ssf đều hoạt động trên Windows / Linux / Mac. Đây là một ứng dụng dành cho người dùng, vì vậy bạn không cần điều chỉnh / chạm hoặc VPN.

Để chuyển hướng cổng 53, bạn sẽ cần các đặc quyền quản trị - bất kể công cụ bạn đang sử dụng là gì.

Để biết thêm thông tin, chi tiết, trường hợp sử dụng hoặc tải xuống: https://securesocketfunneling.github.io/ssf/


Xin hãy thận trọng trả lời, "đây là sản phẩm của tôi", đó là thư rác biên giới. Tôi đề nghị đọc và làm theo hướng dẫn từ trung tâm trợ giúp .
heavyyd

7
Nhiều nhất, đó là một phích cắm không biết xấu hổ. Dù sao giải pháp có thể phù hợp với yêu cầu của bạn. Nhân tiện, SSF là OpenSource và phi lợi nhuận.
nhà phát triển ssf

11
@ematvyd: Nếu anh ấy đăng một loạt các kịch bản hacky, điều đó có thể chấp nhận được, nhưng vì anh ấy đã tạo ra một công cụ nguồn mở trưởng thành, phải không? Nó trả lời câu hỏi ban đầu một cách hoàn hảo.
Tổng hợp

Tôi phải thừa nhận một cách miễn cưỡng rằng đây chính xác là công cụ mà tôi đang tìm kiếm, ngay cả khi đó là một phích cắm không biết xấu hổ.
therealrootuser

9

Tôi không thể nclàm việc cho SNMP, vì các máy khách SNMP tiếp tục chọn cổng UDP nguồn mới và một số có thể hoạt động cùng một lúc.

Thay vào đó, tôi đã viết một bài đăng mô tả cách thực hiện socattrong bài đăng trên blog này , sử dụng SNMP làm ví dụ. Về cơ bản, sử dụng hai thiết bị đầu cuối, bắt đầu với một cái nhìn tổng quan:

tổng quan

Nhà ga số một:

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

Điều này tạo ra chuyển tiếp SSH của cổng TCP 10000 và chạy socat trên máy chủ. Lưu ý cách địa chỉ IP của công tắc được đề cập trong dòng lệnh socat với tên gọi là Switch switch.

Nhà ga hai:

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

Điều đó thiết lập socat trên máy khách. Nên làm vậy.


cái này hiệu quả với tôi :)
Paul Fenney

4

VPN là một giải pháp tốt hơn nếu bạn có quyền truy cập vào cổng UDP.

Nếu bạn chỉ có quyền truy cập vào cổng TCP SSH, thì đường hầm SSH cũng tốt như VPN, ít nhất là cho ping và quay lại gói.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.