Cách định cấu hình lối tắt cho kết nối SSH thông qua đường hầm SSH


22

Các máy chủ sản xuất của công ty tôi (FOO, BAR ...) được đặt phía sau hai máy chủ cổng (A, B). Để kết nối với máy chủ FOO, tôi phải mở kết nối ssh với máy chủ A hoặc B bằng tên người dùng JOHNDOE, sau đó từ A (hoặc B) tôi có thể truy cập bất kỳ máy chủ sản xuất nào mở kết nối SSH bằng tên người dùng chuẩn (hãy gọi nó là WEBBY).

Vì vậy, mỗi lần tôi phải làm một cái gì đó như:

ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server

Như bạn có thể tưởng tượng, đây là một rắc rối khi tôi cần sử dụng scphoặc nếu tôi cần nhanh chóng mở nhiều kết nối.

Tôi đã cấu hình một khóa ssh và tôi cũng đang sử dụng .ssh / config cho một số phím tắt.

Tôi đã tự hỏi nếu tôi có thể tạo một số loại cấu hình ssh để gõ

ssh foo

và để SSH mở / chuyển tiếp tất cả các kết nối cho tôi. Có thể không?

Chỉnh sửa

Câu trả lời của womble chính xác là những gì tôi đang tìm kiếm nhưng có vẻ như bây giờ tôi không thể sử dụng netcat vì nó không được cài đặt trên máy chủ cổng.

weppos:~ weppos$ ssh foo -vv
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data /Users/xyz/.ssh/config
debug1: Applying options for foo
debug1: Reading configuration data /etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh a nc -w 3 foo 22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/xyz/.ssh/identity type -1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_rsa type 1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_dsa type 2
bash: nc: command not found
ssh_exchange_identification: Connection closed by remote host

Câu trả lời:


36

Là một phiên bản cụ thể hơn của câu trả lời của Kyle, những gì bạn muốn đưa vào ~/.ssh/configtệp của mình là:

host foo
  User webby
  ProxyCommand ssh a nc -w 3 %h %p

host a
  User johndoe

Sau đó, khi bạn chạy "ssh foo", SSH sẽ cố gắng SSH tới johndoe@a, chạy netcat( nc), sau đó thực hiện SSH để đi webby@fooqua đường hầm này. Ma thuật!

Tất nhiên, để làm điều này, netcat cần phải được cài đặt trên máy chủ cổng; gói này có sẵn cho mọi hệ điều hành và phân phối chính.


Xuất sắc! Tôi đã cố gắng để tìm ra điều đó, tôi chưa bao giờ gặp phải tình huống chính xác đó trước đây. Tôi sẽ giữ câu trả lời của mình ở đó, trong trường hợp nó có thể giúp đỡ người khác với một tình huống ít cụ thể hơn trong tương lai.
Kyle Brandt

Tôi đã cập nhật câu hỏi ban đầu của mình bao gồm đầu ra dài dòng của kết nối. Có vẻ như tôi không thể sử dụng netcat. Nó có nên được mặc định?
Simone Carletti

Không phải lúc nào, bạn có đủ sức để cài đặt nó không? Bạn cũng có thể làm điều này với telnet, tôi chưa bao giờ thử điều đó ...
Kyle Brandt

Bạn cũng có thể tải netcat về thư mục chính của bạn và biên dịch nó ở đó. Sau đó, bạn có thể chỉ cần sử dụng đường dẫn đầy đủ trong lệnh proxy, tức là / home / userName / bin / nc
Kyle Brandt

Tôi chỉ kiểm tra cài đặt hệ thống. Trên Ubuntu netcat dường như có sẵn theo mặc định, thật không may, các máy chủ cổng được cung cấp bởi OpenSUSE. Tôi cũng sẽ xem xét việc cài đặt netcat trên các máy chủ cổng.
Simone Carletti

7

Bạn có thể sử dụng chỉ thị ProxyCommand trong tệp ~ / .ssh / config của mình, ví dụ để sử dụng netcat làm rơle:

host server2
    ProxyCommand ssh server1 nc server2 22

Bạn sẽ chỉ sử dụng 'ssh server2'. Thông tin trang man cho lệnh này được tìm thấy trong 'man ssh_config'


5

Tôi thích một cách tiếp cận khác để duy trì một đường hầm được xác thực trước cho máy chủ cổng. Trong ~/.ssh/config:

Host a
    ControlMaster auto
    ControlPath ~/.ssh/control-master/%r@%h:%p

Sau đó trong .bashrc:

s () {
        if ( ssh -O check a 2>&1 > /dev/null 2>&1 )
        then
                ssh -t a ssh $1
        else
                if [[ -S ~/.ssh/control-master/insyte@a:22 ]]
                then
                        echo "Deleting stale socket..."
                        rm ~/.ssh/control-master/insyte@a:22
                fi
                echo "Opening master session..."
                if ssh -Nf a
                then
                         ssh -t a ssh $1
                fi
        fi
 }

Vì vậy, để kết nối với foo:

s foo

Lần đầu tiên bạn kết nối, nó sẽ xác thực bạn chống lại "a" và mở một đường hầm ssh liên tục, có nền. Các cuộc gọi tiếp theo đến "s" sẽ mở gần như ngay lập tức thông qua đường hầm được xác thực trước.

Công trình tuyệt vời.


2

Loại chức năng này tồn tại trong các phiên bản mới hơn của OpenSSH và có thể được sử dụng bằng cách thực hiện

ssh -W server2 server1

Đâu server2là điểm đến dự định của bạn và server1là máy chủ proxy của bạn. Bạn có thể làm điều này dễ dàng hơn bằng cách sử dụng ProxyCommandtùy chọn trong cấu hình ssh của bạn, đại loại như:

host = *.example.com
user = packs
port = 22
ProxyCommand ssh -W %h:%p server1

Dường như để điều này hoạt động, bạn cần OpenSSH 5.4+ tại cả ba địa điểm: máy tính để bàn, trung gian, đích. (Vâng, đầu tiên và cuối cùng, chắc chắn).
Steve Bennett

@SteveBennett: Tôi đã sử dụng phương pháp này được một thời gian rồi, nó hoạt động khá tuyệt vời. Tôi đã phải quay trở lại phương pháp netcat trên một vài hệ thống RHEL5, điều này thật khó chịu.
Scott Pack

2

Khi netcatkhông có sẵn trên proxy, hãy thử mẹo này:

host foo
  User webby      
  ProxyCommand ssh a 'exec 3<>/dev/tcp/foo/22; cat <&3 & cat >&3;kill $!'

host a
  User johndoe

Sau đó, bạn sẽ có thể ssh foo.

Ngoài ra, nếu bạn có phiên bản ssh gần đây trên một (nghĩa là với -Wlệnh chuyển tiếp đầu vào và đầu ra tiêu chuẩn), bạn có thể sử dụng:

host foo
  User webby
  ProxyCommand ssh -W foo:%p a

host a
  User johndoe

Cuối cùng, chỉ vì tôi thấy nó hay (và không phải vì nó sẽ hoạt động trong trường hợp cụ thể của bạn, do sự khác biệt về tên người dùng), bài đăng trên blog của một người bạn chỉ ra cách làm cho loại điều này động và xâu chuỗi các proxy proxy (cùng với một số điều điều đó không hoạt động tốt):

host */*
  ProxyCommand ssh ${$(dirname %h)/\%%/@} nc ${$(basename %h)#*%%} %p

Và sau đó ssh machine1/machine2sẽ cung cấp cho bạn một vỏ trên machine2, đường hầm xuyên qua machine1.

Tôi tự hỏi nếu sử dụng các sedlệnh tùy chỉnh thay vì dirnamebasenamecó thể không giải quyết vấn đề với các tên người dùng khác nhau?


2

Điều này có thể được thực hiện bằng cách làm ssh -At johndoe@a ssh webby@foo. Các -Alệnh chuyển tiếp đại lý ssh của bạn (để bạn có thể tránh được việc phải tái xác thực trên proxy), trong khi -tđảm bảo một thiết bị đầu cuối tồn tại trên proxy. Hàm bash sau có thể hữu ích:

ssh-bounce () {
    local cmd=""
    for i in "$@"; do
        cmd+="ssh -At $i "
    done
    $cmd
}

Đây là giải pháp đơn giản nhất. Bây giờ nó chỉ cần 35 upvote khác. (Btw the -A không làm gì cho tôi.)
Steve Bennett

0
weppos:~ weppos$ ssh foo -vv
[..]
bash: nc: command not found

Netcat không được cài đặt trên a. Khi bạn chạy ssh host "command arg", commandđược thực thi trên host, không phải trên máy cục bộ của bạn.


Vâng tôi biết. Đây chính xác là những gì tôi đã báo cáo trong một bình luận cho câu trả lời của womble. :)
Simone Carletti

0

Kể từ OpenSSH 7.3 (2016-08-01), ProxyJumptùy chọn và -Jcờ dòng lệnh tương ứng đã có sẵn để cho phép sử dụng đơn giản hơn thông qua một hoặc nhiều pháo đài SSH hoặc "máy chủ nhảy".

Điều đó loại bỏ sự phụ thuộc vào nclệnh bên ngoài như được tìm thấy trong giải pháp của Womble .

ssh -J johndoe@a webby@foo 

sẽ thiết lập kết nối SSH từ máy trạm của bạn đến máy chủ cổng akhi người dùng johndoe và tạo phiên SSH để lưu trữ foo cho người dùng Webby qua đó.

Để đơn giản hóa việc tạo định nghĩa máy chủ cho cả bạn ~/.ssh/configvà bạn có thể thực hiện đơn giảnssh foo

Host a
    User johndoe

Host foo
    User Webby 
    ProxyJump a
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.