SSH ไปยังเซิร์ฟเวอร์ NAT ที่อยู่ IP สาธารณะเดียวกัน


16

ฉันกำลังพยายามที่จะ SSH จากในสำนักงาน X ถึงกล่อง Linux ไม่กี่กล่องในสำนักงาน Y กล่อง Linux ในสำนักงาน Y อยู่หลัง NAT และทำงานในแต่ละพอร์ตของตัวเอง ฉันสามารถเข้าถึงทั้งหมดได้สำเร็จผ่าน SSH แต่ฉันไม่สามารถตรวจสอบได้

ฉันสามารถ SSH ลงในช่องแรก แต่เมื่อฉันไปที่สองมันพูดว่า:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
[edited out fingerprint]
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:1

ความเข้าใจของฉันคือคาดว่าจะเห็นรหัสเดียวกันจากที่อยู่ IP สาธารณะนั้น แต่ก็เห็นรหัสที่แตกต่างกันเพราะเป็นเซิร์ฟเวอร์ SSH ที่แตกต่างกัน

ฉันจะแก้ไขได้อย่างไรเพื่อให้สร้าง / ยอมรับคีย์ที่แตกต่างจากแต่ละเซิร์ฟเวอร์ที่อยู่ IP เดียวกันนั้น

ป้อนคำอธิบายภาพที่นี่


1
+1 สำหรับคลาวด์ที่วาดด้วยมือ
JoeG

คำตอบ:


15

ชื่อโฮสต์หรือที่อยู่ IP จะถูกจัดเก็บเป็นแฮช (หรือเป็นข้อความธรรมดาทั้งนี้ขึ้นอยู่กับตัวเลือกและรุ่นเริ่มต้น) ในknown_hostsไฟล์ของคุณ วิธีแก้ปัญหาที่ง่ายที่สุดคือการเพิ่มรายการสำหรับแต่ละโฮสต์ไปยังไฟล์ DNS หรือ/etc/hosts(ugh!) ที่มีที่อยู่ IP (WAN) เดียวกันเช่นใน/etc/hosts:

your.wan.ip.address      servera serverb

จากนั้นsshตามชื่อโฮสต์และพอร์ต


22

มีสองสามวิธีในการแก้ไขปัญหานี้:

  1. คุณสามารถปิดใช้งานการตรวจสอบคีย์โฮสต์สำหรับโฮสต์นี้โดยเฉพาะ ในssh_configไฟล์ของคุณ( ~/.ssh/config) ใส่ดังนี้:

    Host remote.host.name
    UserKnownHostsFile /dev/null
    StrictHostkeyChecking no
    

    การกำหนดค่านี้sshจะไม่เก็บคีย์โฮสต์ไว้remote.host.nameแต่ข้อเสียคือตอนนี้คุณเปิดรับการโจมตีจากคนกลาง (เพราะคุณยอมรับรหัสโฮสต์ที่สุ่มสี่สุ่มห้าคุณไม่สามารถบอกได้ว่ารีโมตโฮสต์โฮสต์นั้นเปลี่ยนไป)

  2. คุณสามารถใช้เทคนิคที่คล้ายกันเพื่อให้โฮสต์แต่ละknown_hostsไฟล์มีเอกลักษณ์:

    Host hosta
    Port 10098
    Hostname remote.host.name
    UserKnownHostsFile ~/.ssh/known_hosts_hosta
    
    Host hostb
    Port 10099
    Hostname remote.host.name
    UserKnownHostsFile ~/.ssh/known_hosts_hostb
    

    จากนั้นคุณจะเชื่อมต่อกับโฮสต์เหล่านี้ด้วยssh hostaหรือssh hostbและsshจะใช้ชื่อโฮสต์และพอร์ตจริงจากไฟล์การกำหนดค่า


4
ไม่การแก้ไข/etc/hostsไฟล์จะใช้งานได้ ฉันชอบสิ่งนี้ดีกว่าเพราะ (ก) ไม่จำเป็นต้องมีสิทธิ์การเลื่อนระดับและ (ข) หมายความว่าคุณไม่จำเป็นต้องระบุหมายเลขพอร์ตในบรรทัดคำสั่ง
larsks

1
การแก้ปัญหาชื่อ (โฮสต์หรือ DNS) จะต้องใช้ทั้งในโซลูชันเหล่านี้เพื่อเชื่อมโยง hosta และ hostb กับที่อยู่ IP ของ WAN แต่ทั้งคู่เป็นคำแนะนำที่ยอดเยี่ยมฉันขี้เกียจเกินกว่าจะพิมพ์ใน LOL แก้ไข: เพิ่งสังเกตเห็นชื่อโฮสต์ที่นั่น - ลบข้อมูลเกี่ยวกับการแก้ไขชื่อ
Brandon Xavier

2
@CopyRunStart: คุณไม่จำเป็นต้องระบุพอร์ตบนบรรทัดคำสั่งเนื่องจากมีการระบุไว้แล้วใน~/.ssh/config(พอร์ตอื่นสำหรับแต่ละพอร์ตhosta hostb) ตามที่อธิบายไว้ในคำตอบของ larsks ในทำนองเดียวกันคุณสามารถระบุชื่อผู้ใช้กุญแจ ฯลฯ ที่แตกต่างกันในไฟล์ config นี้สำหรับโฮสต์ที่แตกต่างกันดังนั้นสิ่งที่คุณต้องทำในบรรทัดคำสั่งคือssh hostaหรือssh hostb
arielf

3
ถ้าฉันสามารถโหวต ~ / .ssh / config สองครั้งฉันจะ การเล่นซอกับ / etc / hosts ถูกผูกไว้เพื่อทำให้เกิดปัญหาอื่น ๆ
แอรอน

1
นี่เป็นทางออกที่ดีกว่า IMO มากกว่าการแก้ไข / etc / hosts ในฐานะที่เป็นการพูดคลุมเครือเล็กน้อยฉันจะใช้HostKeyAliasคำสั่งมากกว่าการแยกโฮสต์ที่รู้จักออกเป็นไฟล์ต่างๆ เช่นHostKeyAlias hosta
crimson-egret

8

คุณไม่ได้บอกว่าโซลาริสรุ่นใด (และที่สำคัญกว่านั้นคือ SSH) ที่คุณใช้ แต่ OpenSSH เวอร์ชันล่าสุดได้แก้ไขปัญหานี้แล้ว

ที่นี่มีสองรายการจากknown_hostsไฟล์ของฉันซึ่งมีที่อยู่ IP เดียวกัน แต่หมายเลขพอร์ตที่แตกต่างกัน (หนึ่งคือโดยนัย 22); ในขณะที่คุณสามารถเห็นคีย์ที่เก็บไว้ไม่เหมือนกัน

[10.69.55.47]:2222 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAo+zenWwhFWAa/exdxbm3A3htDFGwFVjFlHLO83AfOaloBbBrr6whmLeDqVPBSwI/yrePClpahLUMYE6qGBFCbbOYiQkMDwacNFfxvxd6oCMDDqZH6NWGiBCt0b2M6YKYhYCw6z8n0yvlLk1eTdpp2OpjbfwAIe4eBkWyKNZY9+17VtzARqGR9tgHC8Dh7HBApDR8wooc+XzY6FhD2b21meIt8r8bjfBIu5t6eQgDHh/TzUT1rGH6W0HeUJxpDnpud5Af1ygMEQFrGrzHi5HKtg+K6HFBggMF8t6p2Dz8oMds5pi6IuPlVi3UvO1X7mMJ9pP7ByMQqiVrQ9wtAbC2QQ==
10.69.55.47 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1clJ6vp8NDy7D9YVgAKQQzERfx3scR0c0027yOYGGpeLg+nW+x8mJk1ia9GouUTDME+NP2YDVZUEDog9rtTJvuLd22ZxfoC8LGboyBsmlhOVxdSCxmA/+blPCp1pyocr8pXyXjSkb/qQKKQMRoAU7qKKHPfI5Vugj04l6WbW2rJQTqFD/Lguc8AAUOE6K4DNhETOH2gOnwq6xi0vutDmeUKSqEvM/PQFZSlOL4dFDYO5jAUjvgm6yGHP3LlS9fmCzayJgGgLSnNz0nlcd94Pa1Cd441cCAZHFDvDPniawEafH9ok4Mmew0UGopQGUGbfb5+8g8YphLW6aLdrvnZbAw==

ฉันไม่ทราบว่า OpenSSH เวอร์ชันใดแนะนำสิ่งนี้ แต่ฉันกำลังทำงานอยู่

[me@risby fin]$ ssh -V
OpenSSH_6.9p1, OpenSSL 1.0.1k-fips 8 Jan 2015

3

หากต้องการขยายความคิดเห็นของฉันไปที่ @larsks คำตอบฉันคิดว่าการใช้~/.ssh/configรายการดีกว่าการแก้ไข / etc / hosts แม้ว่าฉันจะใช้HostKeyAliasแทนที่จะแยกโฮสต์ที่รู้จักออกเป็นไฟล์ต่าง ๆ เช่น:

Host hosta
Port 10098
Hostname remote.host.name
HostKeyAlias hosta

และในทำนองเดียวกันสำหรับ hostb

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