SSH thông qua nhiều máy chủ bằng ProxyCommand?


11

Tôi có một mục trong ~ / .ssh / config trên máy tính của tôi ở nhà trông như thế này:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

nơi gateway.example.commột máy chủ tại nơi làm việc được kết nối với cả Internet công cộng và mạng nội bộ. Hộp cổng giải quyết foo và thanh bằng cách sử dụng các mục trong / etc / hosts.

Vấn đề của tôi là tôi cần phải đạt được một hộp ở phía bên kia foo. Hãy gọi nó là "baz". Máy chủ "baz" nằm trên một mạng riêng khác mà foo được kết nối, nhưng không phải là mạng "cổng" được kết nối.

Tôi đã thử sử dụng cái này:

host baz
    ProxyCommand ssh -x -a -q gateway/example.com ssh foo nc %h 22

Nhưng điều đó không hiệu quả, và tôi hơi sâu sắc. Làm thế nào để tôi làm điều này?

Tôi không nghĩ nó quan trọng, nhưng tôi đang làm điều này trong Ubuntu 10.

Câu trả lời:


13

Dễ dàng.

Giả sử thiết lập mạng sau:

thiết lập mạng ví dụ

Bạn sẽ có thể sử dụng tệp ~ / .ssh / config trông giống như thế này:

host foo bar
    ProxyCommand ssh -x -a -q gateway.example.com nc %h 22

host baz
    ProxyCommand ssh -x -a -q foo nc %h 22

Ý tưởng ở đây là SSH của bạn không biết làm thế nào để có được "foo", do đó một SSH sẽ thành công. Và từ đó, bạn có thể "nc" để baz. Và nếu có các máy chủ khác trên mạng riêng bên trong cùng với "baz", bạn có thể chỉ cần thêm chúng vào dòng "host baz".

Điều này về cơ bản coi "foo" của máy chủ là cổng vào "baz", giống như "gateway" là cổng vào "foo".

Thông thoáng?


13

Về câu trả lời của ghoti: thay vì sử dụng netcat ( "ssh ... nc %h 22"), bắt đầu với OpenSSH 5.4, bạn có thể thực hiện việc này trực tiếp với : "ssh -W %h:22 ...". Bằng cách này, bạn không phải lo lắng về việc liệu netcat có được cài đặt đúng nơi hay không.


1
Điểm tuyệt vời, cảm ơn. Đây là một câu hỏi cũ, nhưng tôi cũng có thể làm rõ rằng khi tôi đang chạy Ubuntu trên máy trạm của mình, "gateway" của máy chủ là một Busybox Linux cũ với OpenSSH 5.3 và các máy chủ "foo" và "baz" là FreeBSD (OpenSSH 5,4). Vì vậy, dù sao tôi cũng cần ít nhất một netcat.
Graham

@Graham Không. Chỉ có khách hàng cần từ 5,4 trở -Wlên mới có thể làm việc. Nó phụ thuộc vào mã chuyển tiếp cổng ở phía máy chủ, cũ hơn nhiều.
kasperd

1

Sử dụng các khóa riêng được lưu trữ trên máy tính cục bộ của bạn, nhập lệnh này với các phím riêng, tên người dùng shell và tên máy chủ / địa chỉ IP được thay đổi thành địa phương-> gateway-> nhu cầu ssh đích.

Lưu ý rằng ProxyCommand được ưu tiên hơn Chuyển tiếp đại lý để giảm thiểu rủi ro ảnh hưởng đến xác thực khóa riêng (sử dụng cổng và kết nối đại lý ssh cục bộ để thỏa hiệp các máy chủ khác như thể không tặc có khóa riêng) khi cổng / jumperbox bị chiếm quyền root.

Lệnh duy nhất để ủy quyền SSH tới máy chủ (giữ cả khóa riêng trên máy tính cục bộ):

sudo ssh -i dest_private_key.pem -o "ProxyCommand ssh -W %h:%p -i gate_private_key.pem gate_user@gate_IP" dest_user@dest_IP 

0

Đây là những gì tôi làm để nhảy ra khỏi mạng được bảo vệ với Internet.

Tôi đang sử dụng máy tính xách tay của mình để làm việc với mã khi xây dựng . Vì quá trình xây dựng bị hạn chế truy cập Internet, để sao chép một repo từ github.com, trước tiên tôi cần phải nhảy vào hộp công cụ , không có quyền truy cập Internet. Nhưng nó có thể truy cập gw , có Internet.

Như thế này:

Sơ đồ nhảy SSH

Tôi .ssh/configvề xây dựng :

Host gw
  ProxyCommand ssh -A -W %h:%p toolbox

Host github.com
  ProxyCommand ssh -A -W %h:%p gw

Giải trình.

  1. Quan điểm là từ xây dựng . Không có cấu hình trên các máy chủ khác.
  2. Đầu tiên, tôi tuyên bố rằng để có được gw bạn cần phải làm điều đó thông qua hộp công cụ .
  3. Thứ hai, tôi tuyên bố rằng để truy cập github.com , bạn cần thực hiện điều đó qua gw . SSH nội bộ sử dụng quy tắc trước đó.
  4. Cuối cùng, git clone git@github.com:aRepo/Therechỉ cần làm việc!

Thông thoáng?

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.