Thiết lập tệp cấu hình ssh với id_rsa qua đường hầm


17

Tôi đã vật lộn để thiết lập cấu hình hợp lệ để mở kết nối với máy thứ hai, chuyển qua máy khác và sử dụng id_rsa (yêu cầu mật khẩu cho tôi) để kết nối với máy thứ ba.

Tôi đã hỏi câu hỏi này trong một diễn đàn khác, nhưng tôi không nhận được câu trả lời nào có thể được coi là rất hữu ích.

Vấn đề, được mô tả tốt hơn, diễn ra như sau:

Local machine: user1@localhost
Intermediary machine: user1@inter
Remote target: user2@final

Tôi có thể thực hiện toàn bộ kết nối bằng pseudo-tty:

ssh -t inter ssh user2@final

(điều này sẽ hỏi tôi mật khẩu cho tệp id_rsa tôi có trong máy "inter")

Tuy nhiên, để tăng tốc mọi thứ, tôi muốn đặt tệp .ssh / config của mình để tôi có thể chỉ cần kết nối với máy "cuối cùng" bằng cách sử dụng:

ssh final

Những gì tôi đã có cho đến nay - không hoạt động - là, trong tệp .ssh / config của tôi:

Host inter
    User user1
    HostName inter.com
    IdentityFile ~/.ssh/id_rsa

Host final
    User user2
    HostName final.com
    IdentityFile ~/.ssh/id_rsa_2
    ProxyCommand ssh inter nc %h %p

Tệp id_rsa được sử dụng để kết nối với máy giữa (điều này yêu cầu tôi không cần nhập mật khẩu) và tệp id_rsa_2 được sử dụng để kết nối với máy "cuối cùng" (cái này yêu cầu mật khẩu).

Tôi đã thử trộn một số LocalForwardvà / hoặc RemoteForwardcác trường và đặt các tệp id_rsa vào cả máy thứ nhất và thứ hai, nhưng tôi dường như không thể thành công khi không có cấu hình nào.

PS: chủ đề tôi đã cố gắng để nhận được sự giúp đỡ từ:

http://www.linuxquestions.org/questions/linux-general-1/proxycommand-on-ssh-config-file-4175433750/

Câu trả lời:


21

PHƯƠNG PHÁP 1 (sử dụng phím ssh trên liên)

Nếu bạn muốn giữ lại luồng xác thực

local -- authenticate --> inter -- authenticate (ask password) --> final

Điều này không thể được thực hiện với .ssh / config proxyhost.

Những gì bạn cần là bí danh bash shell (Tôi hy vọng bạn đang sử dụng bash).

Trong ~/.bashrc, thêm dòng sau

alias ssh-final='ssh -t inter ssh user2@final.com'

Trong dấu nhắc lệnh, chỉ cần gõ sau

ssh-final

finalphần trong ~/.ssh/configkhông được sử dụng.

Chi tiết kết nối (1)

ssh -t inter ssh user2@final.com có thể được xem như sau

local# ssh inter
inter# ssh user2@final.com

localchỉ "nói" với inter. Không có kết nối ssh trực tiếp hoặc gián tiếp giữa localfinal. localchỉ hiển thị đầu ra của ssh user2@final.com.

PHƯƠNG PHÁP 2 (sử dụng phím ssh trên cục bộ)

Xác thực với cùng ssh-key

Host inter
    User user1
    HostName inter.example.com

Host final
    User user2
    Hostname <final.com / final IP Address>
    Port 22
    ForwardAgent yes
    ProxyCommand ssh inter nc %h %p

Sao chép cục bộ ~/.ssh/id_ras.pub vào

/home/user1/.ssh/authorized_keys in `inter`
/home/user2/.ssh/authorized_keys in `final`

Chi tiết kết nối (2)

đường hầm ssh

Trước khi chúng ta đi vào chi tiết ProxyCommand, hãy xem ví dụ sau

Bước 1, trên cửa sổ terminal 1

local# ssh inter -L 2000:final.com:22

Bước 2, trên cửa sổ terminal 2

local# ssh localhost -p 2000

Trong thiết bị đầu cuối 1, một đường hầm được thiết lập giữa cổng cục bộ 2000 và cổng Final.com 22. Mọi thứ được gửi đến cổng cục bộ 2000 sẽ được chuyển tiếp đến cổng cuối cùng.com 22 và ngược lại.

Trong thiết bị đầu cuối 2, ssh kết nối với cổng cục bộ 2000, nhưng thực sự đang giao tiếp với cổng 22 cuối cùng, đó là sshd.

Với đường hầm, ứng dụng khách ssh cục bộ trong Bước 2 được kết nối trực tiếp với sshd Final.com.

"Đầu ra" của cổng cục bộ 2000, là "lưu lượng" ssh daemon.

Sử dụng phổ biến của đường hầm như vậy là để truy cập máy chủ web nội bộ hoặc máy chủ email. Dưới đây là ví dụ cho máy chủ web

local# ssh inter -L 2000:final.com:80

Trong trình duyệt sử dụng URL sau

http://localhost:2000

Hai điểm cuối của đường hầm là cổng cục bộ 2000 và cổng cuối cùng.com 80.

Giao thông đến và đi từ điểm cuối đường hầm "NHƯ VẬY". Hãy gọi đó là lưu lượng truy cập "thô".

ProxyCommand

Host final
    User user2
    Hostname <final.com / final IP Address>
    Port 22
    ForwardAgent yes
    ProxyCommand ssh inter nc %h %p

Việc ProxyCommandtiến thêm một bước. Nó bỏ qua bước tạo một cổng cục bộ và kết nối với nó.

Một máy khách ssh sẽ thực thi lệnh từng được đưa ra phía sau ProxyCommandvà coi đầu ra của lệnh đó là lưu lượng "thô". Nó đang giữ điểm cuối cục bộ, và sau đó bắt đầu kết nối ssh với nó.

Tại sao người này không làm việc kia?

Lệnh sau

ssh inter nc final.com 22

về cơ bản có nghĩa là (1) kết nối với inter, sau đó (2) bật inter, chạy lệnh nc final.com 22.

nc - arbitrary TCP and UDP connections and listens

Vì vậy, nc final.com 22sẽ kết nối với cổng 22 cuối cùng, in ra tất cả lưu lượng truy cập đến thiết bị xuất chuẩn và gửi tất cả stdin sang phía bên kia. Đó là một "đường hầm" giữa nc stdin / out và Final.com port 22.

ncđược chạy trong phiên ssh, tất cả các thiết bị xuất chuẩn của nó được chuyển trở lại máy khách ssh, dưới dạng lưu lượng "thô". Và ứng dụng khách ssh có thể chuyển lưu lượng truy cập vào nc stdin, kết thúc tại cổng 22.com.

Thông qua "đường hầm" ở trên, máy khách ssh cục bộ sẽ bắt đầu một phiên ssh final.comtrực tiếp.

Lệnh sau

ssh -t inter ssh user2@final.com

không hoạt động với ProxyCommandvì nó không phải là lưu lượng truy cập "thô" từ trình nền ssh. Đây là thiết bị xuất chuẩn của máy khách ssh . Nói chuyện với khách hàng có nghĩa là không có kinh doanh.

Xác thực với khóa ssh khác nhau (OP gốc cấu hình)

Host inter
    User user1
    HostName inter.com
    IdentityFile ~/.ssh/id_rsa

Host final
    User user2
    HostName final.com
    IdentityFile ~/.ssh/id_rsa_2
    ProxyCommand ssh inter nc %h %p

Sao chép cục bộ ~/.ssh/id_ras.pub vào

/home/user1/.ssh/authorized_keys in `inter`

Sao chép cục bộ ~/.ssh/id_ras_2.pub vào

/home/user2/.ssh/authorized_keys in `final`

Cả hai điều trên sẽ cho phép sử dụng sau

local# ssh final

Kiểm tra bổ sung

Sử dụng dài dòng

local# ssh -v final

Điều đó sẽ giúp xác định vấn đề ssh.

Kiểm tra nc

ProxcyCommandđang thực hiện nctrên inter. Kiểm tra nếu ncthực sự có sẵn trên inter.

local# ssh inter
inter# nc final.com 22

Kiểm tra khóa rsa được thiết lập đúng

Nếu các khóa khác nhau được sử dụng cho interfinal, các tệp sau sẽ tồn tại trong máy cục bộ

local# ls ~/.ssh
id_rsa id_rsa_2 id_rsa.pub id_rsa_2.pub

Vì bạn có thể ssh đến interrồi, hãy kiểm tra thiết lập khóa trên final. Từ máy cục bộ của bạn

local# ssh -t inter ssh user2@final
final# cat .ssh/authorized_keys

Bạn nên xem nội dung id_rsa_2.pubở đó.


Xin lỗi, tôi nên chỉ ra điều này; Tôi thực sự có thể kết nối bằng cách sử dụng ssh -t, nhưng những gì tôi muốn làm là mô phỏng chính xác hành vi tôi có khi ssh -tchỉ sử dụng cấu hình trên .ssh/config.
Rubens

Các tập tin cấu hình, ngay cả những gì bạn đăng nên làm việc. Hãy thử đi qua checkingbước. Phải có một cái gì đó thiếu / sai.
John Siu

1
Với ssh -t, ssh của bạn finalđược bắt đầu từ interđó, "gần như" giống như local# ssh intersau đó inter# ssh final. Việc xác thực là giữa interfinal. Với proxy / nc, ssh của bạn đến cuối cùng được bắt đầu từ máy cục bộ của bạn, thông qua một đường hầm, đến final. Việc xác thực là giữa localfinal.
John Siu

@Rubens dựa trên nhận xét của bạn, tôi nghĩ rằng bạn nhầm rằng bạn vẫn đang sử dụng interssh-key để xác thực final. Hãy thử sao chép id_rsa_2vào local~ / .ssh / id_rsa_2 (KHÔNG QUÁ BÀI VIẾT id_rsa cục bộ) và vấn đề của bạn có thể không còn nữa.
John Siu

2
Lưu ý rằng ssh2 đã ncđược tích hợp sẵn. Vì vậy, thay vì ProxyCommand ssh gateway nc %h %p, bạn sẽ viết ProxyCommand ssh inter -W %h:%p.
user123444555621

2

Tôi không thấy bất kỳ lỗi thực sự nào được liệt kê hoặc các câu lệnh ssh -v sẽ giúp xem nó bị treo ở đâu.

Này anh bạn, bạn đã có nó gần như đúng --- cách tốt nhất và an toàn nhất là có cả hai phím trên máy cục bộ. Sau đó, bạn sẽ sử dụng chuyển tiếp ssh-agent để kết nối thay vì để các phím ở các bước trung gian. Bạn cũng có lợi thế là chỉ cần nhập cụm mật khẩu chính một lần mỗi lần đăng nhập.

Nếu bạn có một hệ điều hành hiện đại / thân thiện như ubfox (trên máy cục bộ của bạn) thì điều này sẽ không hoạt động nếu không có * mát xa *. Tôi cố tình bỏ tập tin nhận dạng, bạn sẽ không cần nó.

Tập tin cấu hình của bạn sẽ trông như thế này:

Host inter
    User user1
    ForwardAgent yes
    HostName inter.com

Host final
    ForwardAgent yes
    User user2
    HostName final.com
    ProxyCommand ssh inter nc %h %p

Nếu không, sau đó chạy qua các bước này để đảm bảo rằng ssh-agent đang chạy:

'ssh-add -l' (lower case L) will list your private keys if any are loaded, or will be blank, or will say can’t connect to ssh-agent, if so, start ssh-agent.
'eval `ssh-agent`' (those are backticks) starts ssh agent
'ssh-add' will add your key… you can add a path argument if you have a key in a non-default area. At this point you will enter your passphrase.

Có một hướng dẫn tốt đẹp giải thích cách làm việc này, ở đây.

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.