ปัญหา SSH: อ่านจากซ็อกเก็ตล้มเหลว: รีเซ็ตการเชื่อมต่อโดยเพียร์


14

ฉันรวบรวม OpenSSH_6.6p1 บนเซิร์ฟเวอร์ของเรา ฉันสามารถเข้าสู่ระบบผ่าน SSH ไปยังเซิร์ฟเวอร์ที่อัปเกรดแล้วได้ แต่ฉันไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์อื่น ๆ ที่ใช้ OpenSSH_6.6p1 หรือ OpenSSH_5.8 ได้ ขณะเชื่อมต่อฉันได้รับข้อผิดพลาดดังนี้

Read from socket failed: Connection reset by peer

บนเซิร์ฟเวอร์ปลายทางในบันทึกฉันเห็นดังด้านล่าง

sshd: fatal: Read from socket failed: Connection reset by peer [preauth]

ฉันพยายามระบุcipher_spec [ssh -c aes128-ctr destination-server] ดังที่กล่าวไว้ในที่นี้และสามารถเชื่อมต่อได้ จะกำหนดค่า ssh ให้ใช้รหัสได้อย่างไร ทำไมต้องใช้รหัสลับที่นี่


จากเซิร์ฟเวอร์จากที่คุณได้รับข้อผิดพลาดนี้เกิดอะไรขึ้นเมื่อคุณทำtelnet ip.or.name.of.offending.server 22?
MadHatter

1
ทั้งสองฝ่ายคิดว่าอีกฝ่ายปิดการเชื่อมต่อ ณ จุดนี้ฉันจะแตกออก tcpdump หรือ wireshark และเรียกใช้มันทั้งสองปลาย
Michael Hampton

@ MadHatter ฉันสามารถ telnet บนพอร์ต 22 และรับการตอบกลับ SSH
nitins

ลองรวบรวม openssh เวอร์ชั่นก่อนหน้าเช่น 6.5p1 เพื่อดูว่าพฤติกรรมนี้เกิดจากการเปลี่ยนแปลงใน codebase หรือไม่?

คำตอบ:


7

ปัญหาดูเหมือนว่าบั๊กฝั่งเซิร์ฟเวอร์ เมื่อไคลเอนต์ส่งรายการของ ciphers เซิร์ฟเวอร์ openssh อาจคาดว่าจะสามารถอ่านรายการในการเรียกระบบครั้งเดียว

หากรายการของ ciphers ที่รองรับนั้นยาวเกินกว่าที่สามารถส่งได้ในหนึ่งแพ็คเก็ตเซิร์ฟเวอร์อาจได้รับไบต์น้อยลงในการโทรครั้งแรกกว่าที่คาดไว้ พฤติกรรมที่ถูกต้องบนเซิร์ฟเวอร์คือการโทรอีกครั้งเพื่อรับส่วนที่เหลือของไบต์ แต่จากคำอธิบายปัญหาที่ปรากฏขึ้นเซิร์ฟเวอร์จะปิดการเชื่อมต่อแทนเมื่อไม่ได้รับรายการทั้งหมดของ ciphers พร้อมกัน เมื่อแพ็กเก็ตถัดไปจากไคลเอนต์มาถึงเซิร์ฟเวอร์จะส่งการเชื่อมต่อรีเซ็ตไปยังไคลเอ็นต์

การกำหนดค่าไคลเอนต์ให้ใช้รายการ ciphers ที่สั้นลงจะช่วยแก้ไขบั๊กได้ ไคลเอ็นต์ openssh จะค้นหารายการ ciphers ในตำแหน่งต่อไปนี้:

  1. บนบรรทัดรับคำสั่งโดยใช้ -c cipher_spec หรือ -o Ciphers = cipher_spec
  2. ใน ~ / .ssh / config โดยการระบุ Ciphers cipher_spec ในส่วนโฮสต์ที่เกี่ยวข้องหรือก่อนที่โฮสต์แรก
  3. ใน / etc / ssh / ssh_config โดยใช้รูปแบบเดียวกับ ~ / .ssh / config
  4. รายการเริ่มต้นที่สร้างขึ้นในไคลเอนต์ในเวลารวบรวม

ไฟล์การกำหนดค่าสองไฟล์ตามลำดับต่อผู้ใช้และการตั้งค่าทั้งระบบ การใช้Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbcอย่างที่ Eric แนะนำควรใช้งานได้ดี


นี่เป็นข้อบกพร่องที่ทราบใน openssh เวอร์ชันนั้นหรือไม่ ไม่มีใครมีลิงก์ไปยัง openssh bug-tracker สำหรับปัญหานี้
user313114

1
@ user313114 ฉันไม่ได้ค้นหาตัวติดตามดังกล่าวเพราะฉันเชื่อว่าข้อผิดพลาดได้รับการแก้ไขแล้วในเวอร์ชันใหม่ล่าสุดเมื่อสามปีก่อนเมื่อเขียนคำตอบนี้
kasperd

4

คุณสามารถระบุตัวเลขในไฟล์ ssh config (/ etc / ssh / ssh_config หรือคล้ายกันขึ้นอยู่กับ $ PREFIX และอื่น ๆ ) ตัวเลือกใด ๆ ที่คุณส่งไปยังไคลเอ็นต์ ssh บนบรรทัดคำสั่งสามารถตั้งค่าได้ในไฟล์กำหนดค่า ssh (ไคลเอ็นต์)

นี่คือบรรทัดที่เกี่ยวข้อง (เพียงแค่ไม่มีข้อคิดเห็น):

#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc

3

วิธีแก้ไขของฉันฉันหวังว่าจะช่วยให้ใครบางคน:

# Recreate host keys
sudo rm /etc/ssh/ssh_host_*
sudo ssh-keygen -A

# Re-install SSh
sudo apt-get --reinstall install openssh-server openssh-client

แก้ไข sshd_config โดยการเพิ่มค่า

add :  MaxAuthTries 3

แก้ไข ssh_config โดยไม่ใส่หมายเหตุค่า

Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc

0

แก้ไขปัญหานี้โดยแก้ไขไฟล์ข้างล่างเป็น 600

/ etc / ssh / ssh_host_dsa_key
/ etc / ssh / ssh_host_rsa_key
/ etc / ssh / ssh_host_ecdsa_key

แก้ไขสิทธิ์สำหรับไฟล์อื่นทั้งหมดภายใน '/ etc / ssh /' เป็น 644 ไฟล์ทั้งหมดต้องเป็นเจ้าของโดย 'root'

ด้านล่างเป็นชุดคำสั่งที่สมบูรณ์เพื่อกำหนดสิทธิ์ที่เหมาะสมสำหรับไฟล์ทั้งหมดภายใต้ไดเรกทอรี '/ etc / ssh':

chown root: รูท / etc / ssh / * chmod 644 / etc / ssh / *
chmod 600 / etc / ssh / ssh_host_dsa_key
chmod 600 / etc / ssh / ssh_host_rsa_key
chmod 600 / etc / ssh / ssh_host_ecdsa_key


-1

ปัญหาของฉันที่มีอาการแบบเดียวกันกับที่คุณเห็นนั้นเกิดจากการตัดทอนคีย์โฮสต์ ลองสร้างใหม่ด้วย:

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