Chuyển tiếp lưu lượng SSH thông qua một máy giữa


110

SSH đường hầm rất khó hiểu với tôi. Tôi tự hỏi nếu tôi có thể làm điều này trong Linux.

Tôi có 3 máy ..

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

Vì vậy, tôi có thể SSH từ A -> B và từ B -> C, nhưng không phải từ A -> C.

Có cách nào để thiết lập đường hầm SSH từ A đến B không, vì vậy khi tôi chạy các lệnh SSH khác, chúng chỉ hoạt động từ máy A cục bộ của tôi? Về cơ bản, tôi đang cố gắng sao chép một git repo từ nơi làm việc đến nhà (và tôi không thể cài đặt git trên máy B).

Ngoài ra, một khi thiết lập .. Làm thế nào tôi cũng sẽ bỏ đặt nó?


Tôi tin rằng có một câu hỏi trùng lặp ở đâu đó nhưng tìm kiếm của tôi rất yếu ngày hôm nay.
quack quixote



Nếu bạn đang chạy Linux trên máy A, hãy sử dụng một công cụ có tên là sshript, cho phép bạn chuyển tiếp có chọn lọc tất cả lưu lượng truy cập cho C qua đường hầm A-> B (giả sử C có thể nhìn thấy từ B).
tham gia

Câu trả lời:


128

Đặt .ssh/configtệp này vào tệp của bạn trên hostA (xem man 5 ssh_config để biết chi tiết):

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

Bây giờ lệnh sau sẽ tự động đường hầm thông qua hostB

hostA:~$ ssh hostC

Bạn có thể muốn thêm các tùy chọn như -oCiphers=arcfour-oClearAllForwardings=yesđể tăng tốc mọi thứ, vì gói sshbên trong sshđắt hơn về mặt tính toán và nỗ lực thêm và trình bao bọc không cần phải an toàn khi lưu lượng truy cập đã được mã hóa.


Nếu bạn đang sử dụng OpenSSH sớm hơn 5.3, -Wtùy chọn không khả dụng. Trong trường hợp này, bạn có thể thực hiện như trên bằng netcat ( nc):

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB

1
Thật là tuyệt vời! Cảm ơn bạn. Điều này giải quyết một vấn đề đã ăn thịt tôi trong 2 ngày qua: hostC ngồi sau tường lửa và có dữ liệu tôi muốn truy cập từ hostA, một máy tính xách tay có thể ở bất cứ đâu trên thế giới. hostB cũng đứng sau cùng một tường lửa với hostC, nhưng nó có một cổng SSH mở ra thế giới. Do đó tôi có thể ssh từ hostC -> hostB. Tôi thiết lập một đường hầm SSH ngược giữa hostC & hostB, vì vậy tôi cũng có thể ssh từ hostB -> hostC (được chuyển tiếp qua localhost). Với thủ thuật của bạn, tôi có thể đi từ hostA -> hostC! Nó hoạt động hoàn hảo với SCP & Fugu trên OSX! Cảm ơn bạn!
AndyL

Các -Wtùy chọn nên được sử dụng thay cho nctùy chọn.
vy32

SSH nào nên hỗ trợ -W, chỉ có một trên hostA (nguồn gốc) hoặc cũng là một trên hostB (máy giữa)?
gioele

Để biết thông tin, nếu bạn có nhiều máy chủ bạn cần truy cập qua cùng một máy chủ hostB, có thể khai báo nhiều Host hostCdòng ở trên ProxyCommandgiúp việc truy cập nhiều máy chủ qua máy chủ trung bình trở nên cực kỳ dễ dàng.
fduff

7

Chỉnh sửa: Đây là cách tiếp cận sai. Xem câu trả lời ephemient của thay thế. Câu trả lời này sẽ hoạt động, nhưng có khả năng kém an toàn hơn và chắc chắn là ít tuyệt vời hơn.

Có vẻ như bạn muốn một giải pháp như sau:

ssh -L localhost:22:machinec:22 machineb

Điều này sẽ giúp bạn có một vỏ trên machineb. Để lại điều này một mình; thu nhỏ cửa sổ đầu cuối.

Bây giờ, bất cứ khi nào bạn thực hiện kết nối ssh localhost, bạn thực sự sẽ được kết nối machinecthông qua machineb. Khi bạn hoàn thành với đường hầm, chỉ cần đóng thiết bị đầu cuối mà bạn đã chạy lệnh trên.

Lưu ý rằng bạn sẽ cần các đặc quyền siêu người dùng để chạy lệnh.


+1 Cảm ơn Wesley. Đây là câu trả lời ssh đường hầm thực sự. Đây là một bài viết về nó: securityf
Larry K

3
Nhìn chung, điều này khá là xấu xa ... nhưng tôi đã phải làm điều này với các phiên bản cổ của OpenSSH hoặc các máy khách ssh khác. Bạn có thể chọn một số cổng cao như 8022: theo cách này, nó không can thiệp vào bất kỳ dịch vụ ssh nào trên localhost và không yêu cầu chạy bằng root. Chỉ cần thêm -p 8022vào các lệnh ssh của bạn. Và nó dễ dàng với git: sử dụng URI ssh://localhost:8022/path/to/repo.git.
ephemient

3

Âm thanh như bạn muốn có một bí danh shell trên A khiến ssh xảy ra trên C

  1. Tôi giả sử rằng trên A, bạn có thể nhập ssh me @ b "ssh me @ c hostname" và lấy lại "C"
  2. Tạo một bí danh sshc mở rộng sshc foo thành ssh me @ b "ssh me @ c foo"
  3. Để biết cú pháp chính xác của việc tạo bí danh, hãy tham khảo superuser.com

1
Bạn có thể phải thêm -tvào các tùy chọn của ssh bên ngoài nếu bạn muốn một vỏ tương tác, vì sshsẽ giả sử -Tnếu nó được đưa ra một lệnh.
ephemient

1

Đối với shell tương tác, bạn có thể sử dụng lệnh đơn giản này:

ssh -J <user>@<hostB> <user>@<hostC>

Các tùy chọn -J là để nhảy .


0

Nếu chủ lao động của bạn cung cấp VPN, tôi khuyên bạn nên sử dụng thay thế.

Bằng cách đó, bạn sẽ không phải định cấu hình bất kỳ ứng dụng nào đặc biệt (thậm chí là ssh) và bạn có thể thấy bất kỳ máy nào phía sau tường lửa. Ngoài ra, tất cả lưu lượng truy cập của bạn sẽ được mã hóa bằng phần mềm VPN, điều này sẽ thêm bảo mật cho bất kỳ lưu lượng truy cập vô tình hoặc cố ý không được mã hóa.


6
Đôi khi, VPN là lý do chúng ta cần những thủ thuật này ...
Louis

0

YASS Tuy nhiên, một giải pháp đơn giản khác

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • Lệnh đầu tiên mở kết nối ssh đến HostB và báo cho HostB chuyển tiếp kết nối từ localhost: 2222 đến HostC: 22 .
  • các -ftham số cho SSH để đi đến nền sau khi kết nối thành lập
  • Lệnh thứ hai mở đơn giản là kết nối máy khách với localhost: 2222
  • Tùy chọn HostKeyAlias không bắt buộc, nhưng có thể giúp ngăn kết nối đến máy chủ sai
  • Nota: lệnh sleep 10là cần thiết để duy trì kết nối cho đến khi lệnh ssh thứ hai sử dụng cổng chuyển tiếp. Sau đó ssh đầu tiên sẽ đóng khi ssh thứ hai rời cổng chuyển tiếp.

bây giờ bạn có thể chạy các phiên ssh tiếp theo:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Biến thể:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

các phiên ssh tiếp theo có thể được mở bằng cách chạy:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

Ưu điểm chính của việc sử dụng -M và -S param là chỉ có một kết nối được mở từ HostA đến HostC, phiên tiếp theo sẽ không xác thực lại và chạy nhanh hơn rất nhiều.


0

Trường hợp đặc biệt, nền tảng hỗn hợp nix:

  hostA (linux) -> HostB (solaris) -> HostC (linux)

Nếu cần một ứng dụng X trên hostC và hop trung gian nằm trên hộp Solaris ... trong trường hợp này tôi đã tìm thấy netcat (nc) cần thiết trên ProxyCommand như vậy:

máy chủA: ~ $ vi .ssh / config:

Máy chủ lưu trữ
    ProxyCommand ssh hostB nc% h% p # trong đó nc là netcat

Sau đó, đường hầm tự động hoạt động:

máy chủA: ~ $ ssh máy chủ

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.