การตั้งค่าไฟล์ ssh ด้วย id_rsa ผ่านช่องสัญญาณ


17

ฉันพยายามติดตั้งการกำหนดค่าที่ถูกต้องเพื่อเปิดการเชื่อมต่อกับเครื่องที่สองผ่านอีกเครื่องหนึ่งและใช้ id_rsa (ซึ่งขอรหัสผ่านให้ฉัน) เพื่อเชื่อมต่อกับเครื่องที่สาม

ฉันถามคำถามนี้ในฟอรัมอื่น แต่ฉันไม่ได้รับคำตอบที่อาจถือว่ามีประโยชน์มาก

ปัญหาที่อธิบายได้ดีขึ้นมีดังนี้:

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

ฉันสามารถทำการเชื่อมต่อทั้งหมดโดยใช้ pseudo-tty:

ssh -t inter ssh user2@final

(นี่จะถามรหัสผ่านสำหรับไฟล์ id_rsa ที่ฉันมีในเครื่อง "อินเตอร์")

อย่างไรก็ตามสำหรับการเร่งความเร็วฉันต้องการตั้งค่าไฟล์. ssh / config ของฉันเพื่อให้ฉันสามารถเชื่อมต่อกับเครื่อง "ขั้นสุดท้าย" โดยใช้:

ssh final

สิ่งที่ฉันได้มาจนถึงตอนนี้ - ซึ่งใช้งานไม่ได้ - คือในไฟล์. ssh / config:

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

ไฟล์ id_rsa ใช้เพื่อเชื่อมต่อกับเครื่องกลาง (ต้องใช้ฉันโดยไม่ต้องพิมพ์รหัสผ่าน) และไฟล์ id_rsa_2 ใช้เพื่อเชื่อมต่อกับเครื่อง "final" (อันนี้ขอรหัสผ่าน)

ฉันได้ลองผสมLocalForwardและ / หรือบางRemoteForwardพื้นที่และวางไฟล์ id_rsa ไว้ในเครื่องแรกและเครื่องที่สอง แต่ดูเหมือนว่าฉันจะไม่ประสบความสำเร็จโดยไม่มีการกำหนดค่าใด ๆ

PS: ด้ายฉันพยายามขอความช่วยเหลือจาก:

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

คำตอบ:


21

วิธีที่ 1 (ใช้ ssh-key บน inter)

หากคุณต้องการที่จะรักษากระแสการตรวจสอบ

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

สิ่งนี้ไม่สามารถทำได้ด้วย. ssh / config proxyhost

สิ่งที่คุณต้องการคือนามแฝงเปลือกทุบตี (ฉันหวังว่าคุณกำลังใช้ทุบตี)

ใน~/.bashrcเพิ่มบรรทัดต่อไปนี้

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

ใน command prompt เพียงแค่พิมพ์ต่อไปนี้

ssh-final

final~/.ssh/configไม่ใช้ส่วนใน

รายละเอียดการเชื่อมต่อ (1)

ssh -t inter ssh user2@final.com สามารถดูได้ดังนี้

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

localเป็นเพียงการ "พูดคุย" interเพื่อ ไม่มีการเชื่อมต่อ SSH ตรงหรือทางอ้อมระหว่างเป็นและlocal เป็นเพียงการแสดงการส่งออกของfinallocalssh user2@final.com

วิธีที่ 2 (ใช้ ssh-key บนโลคอล)

การพิสูจน์ตัวตนด้วยคีย์ ssh เดียวกัน

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

คัดลอกท้องถิ่น ~/.ssh/id_ras.pubไปยัง

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

รายละเอียดการเชื่อมต่อ (2)

ssh tunneling

ก่อนที่เราจะพูดถึงรายละเอียดของProxyCommandลองดูตัวอย่างต่อไปนี้

ขั้นตอนที่ 1 บนหน้าต่างเทอร์มินัล 1

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

ขั้นตอนที่ 2 บนหน้าต่างเทอร์มินัล 2

local# ssh localhost -p 2000

ในเทอร์มินัล 1 อุโมงค์ถูกตั้งค่าระหว่างโลคัลพอร์ต 2000 และ final.com พอร์ต 22 สิ่งใดที่ส่งไปยังโลคัลพอร์ต 2000 จะถูกส่งต่อไปยังพอร์ต final.com พอร์ต 22 และในทางกลับกัน

ในเทอร์มินัล 2, ssh เชื่อมต่อกับโลคัลพอร์ต 2000 แต่จริงๆแล้วการสื่อสารกับ final.com พอร์ต 22 ซึ่งเป็น sshd

ด้วย tunneling ไคลเอ็นต์ ssh โลคัลในขั้นตอนที่ 2 เชื่อมต่อกับ final.com sshd โดยตรง

"output" ของโลคัลพอร์ต 2000 คือทราฟฟิก "raw" ssh daemon

การใช้งานทั่วไปของอุโมงค์ดังกล่าวคือการเข้าถึงเว็บเซิร์ฟเวอร์ภายในหรือเซิร์ฟเวอร์อีเมล ต่อไปนี้เป็นตัวอย่างสำหรับเว็บเซิร์ฟเวอร์

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

ในเบราว์เซอร์ให้ใช้ URL ต่อไปนี้

http://localhost:2000

จุดสิ้นสุดสองจุดของอุโมงค์คือพอร์ตในเครื่อง 2000 และพอร์ต final.com 80

การจราจรเข้าและออกจากจุดสิ้นสุดของอุโมงค์ "ตามสภาพ" ให้เรียกว่าการจราจร "ดิบ"

ProxyCommand

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

ProxyCommandใช้มันอีกขั้นหนึ่ง มันข้ามขั้นตอนในการสร้างพอร์ตท้องถิ่นและเชื่อมต่อกับมัน

ลูกค้า ssh จะดำเนินการสิ่งที่เคยได้รับคำสั่งด้านหลังProxyCommandและปฏิบัติต่อผลลัพธ์ของคำสั่งนั้นเป็นการรับส่งข้อมูล "ดิบ" กำลังถือไว้ที่จุดปลายโลคัลจากนั้นเริ่มการเชื่อมต่อ ssh กับมัน

ทำไมอีกอันหนึ่งถึงไม่ทำงาน

คำสั่งดังต่อไปนี้

ssh inter nc final.com 22

โดยทั่วไปหมายถึง (1) เชื่อมต่อไปinterแล้ว (2) ในคำสั่งเรียกinternc final.com 22

nc - arbitrary TCP and UDP connections and listens

ดังนั้นnc final.com 22จะเชื่อมต่อกับ final.com พอร์ต 22 พิมพ์ทราฟฟิกขาเข้าทั้งหมดไปยัง stdout และส่ง stdin ทั้งหมดไปยังอีกด้านหนึ่ง มันเป็น "อุโมงค์" ระหว่าง nc stdin / out และ final.com พอร์ต 22

เนื่องจากncถูกรันภายในเซสชัน ssh stdout ทั้งหมดจะถูกส่งกลับไปยังไคลเอ็นต์ ssh เนื่องจากการรับส่งข้อมูล "ดิบ" และไคลเอ็นต์ ssh สามารถส่งทราฟฟิกไปที่ nc stdin ซึ่งจะจบลงที่ final.com พอร์ต 22

ผ่าน "tunnel" ด้านบนไคลเอ็นต์ในระบบ ssh จะเริ่มเซสชัน ssh ด้วยfinal.comโดยตรง

คำสั่งดังต่อไปนี้

ssh -t inter ssh user2@final.com

ไม่ทำงานProxyCommandเนื่องจากการรับส่งข้อมูลไม่ใช่ "ดิบ" จาก ssh daemon มันเป็น stdout ของที่ลูกค้า SSH ลูกค้าคุยกับลูกค้าหมายถึงไม่มีธุรกิจ

การรับรองความถูกต้องด้วย ssh-key ที่แตกต่างกัน (การกำหนดค่าดั้งเดิม OP)

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

คัดลอกท้องถิ่น ~/.ssh/id_ras.pubไปยัง

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

คัดลอกท้องถิ่น ~/.ssh/id_ras_2.pubไปยัง

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

ทั้งสองข้อข้างต้นจะเปิดใช้งานการใช้งานต่อไปนี้

local# ssh final

การตรวจสอบเพิ่มเติม

ใช้ verbose

local# ssh -v final

ที่ควรช่วยระบุปัญหา ssh

ตรวจสอบ

ProxcyCommandจะรันบนnc interตรวจสอบว่าเป็นจริงที่มีอยู่บนncinter

local# ssh inter
inter# nc final.com 22

ตรวจสอบว่ามีการตั้งค่าคีย์ rsa อย่างถูกต้อง

หากต้องใช้คีย์ที่แตกต่างกันinterและfinalควรมีไฟล์ต่อไปนี้ในเครื่องท้องถิ่น

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

เนื่องจากคุณสามารถ ssh ไปแล้วให้ตรวจสอบการตั้งค่าที่สำคัญเกี่ยวกับinter finalจากเครื่องท้องถิ่นของคุณ

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

คุณควรเห็นเนื้อหาของที่id_rsa_2.pubนั่น


ขออภัยฉันควรจะชี้เรื่องนี้; ฉันจริงสามารถที่จะเชื่อมต่อโดยใช้ssh -tแต่สิ่งที่ผมอยากจะทำคือว่าจำลองพฤติกรรมที่ฉันได้จากการใช้ใช้เพียงการกำหนดค่าในการssh -t .ssh/config
รูเบนส์

ไฟล์กำหนดค่าแม้แต่ไฟล์ที่คุณโพสต์ควรใช้งานได้ ลองทำตามcheckingขั้นตอน จะต้องมีบางสิ่งที่ขาดหายไป / ผิดปกติ
John Siu

1
ด้วยssh -tจุ๊ของคุณเพื่อfinalเริ่มต้นจากinterซึ่งเป็น "เกือบ" เช่นเดียวแล้วlocal# ssh inter inter# ssh finalการตรวจสอบอยู่ระหว่างและinter finalกับพร็อกซี่ / NC, SSH finalของคุณเข้าสู่รอบสุดท้ายจะเริ่มจากเครื่องท้องถิ่นของคุณผ่านอุโมงค์ไป การตรวจสอบอยู่ระหว่างและlocal final
John Siu

@Rubens ฐานในความคิดเห็นของคุณผมคิดว่าคุณเข้าใจผิดว่าคุณยังคงใช้interSSH finalสำคัญในการตรวจสอบกับ ลองคัดลอกid_rsa_2ไปที่local~ / .ssh / id_rsa_2 (อย่าเขียน id_rsa ในพื้นที่) และปัญหาของคุณอาจหายไป
จอห์นซิว

2
โปรดทราบว่า SSH2 ได้ncสร้างขึ้นใน. ดังนั้นแทนที่จะคุณต้องการเขียนProxyCommand ssh gateway nc %h %p ProxyCommand ssh inter -W %h:%p
user123444555621

2

ฉันไม่เห็นข้อผิดพลาดจริง ๆ ที่ระบุไว้หรือคำสั่ง ssh -v ซึ่งจะช่วยดูว่ามันอยู่ที่ไหน

เฮ้คนที่คุณพูดถูกแล้ว --- วิธีที่ดีที่สุดและปลอดภัยที่สุดคือการใช้ทั้งสองปุ่มในเครื่องของคุณ จากนั้นคุณจะใช้การส่งต่อ ssh-agent เพื่อเชื่อมต่อแทนที่จะปล่อยปุ่มไว้ที่ขั้นตอนกลาง คุณมีข้อได้เปรียบในการพิมพ์ข้อความรหัสผ่านที่สำคัญเพียงครั้งเดียวต่อการเข้าสู่ระบบ

หากคุณมีระบบปฏิบัติการที่ทันสมัย ​​/ เป็นมิตรอย่างอูบุนตู (บนเครื่องของคุณ) สิ่งนี้จะไม่เกิดปัญหาหากไม่มีการนวด * ฉันปิดไฟล์ข้อมูลประจำตัวโดยเจตนาคุณจะไม่ต้องการมัน

ไฟล์กำหนดค่าของคุณจะเป็นดังนี้:

Host inter
    User user1
    ForwardAgent yes
    HostName inter.com

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

หากไม่เป็นเช่นนั้นให้ทำตามขั้นตอนเหล่านี้เพื่อให้แน่ใจว่าคุณใช้ ssh-agent:

'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.

มีคำแนะนำที่ดีที่อธิบายวิธีการทำงานของที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.