Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การแก้ไขปัญหา >> Linux

แก้ไข: ssh_exchange_identification 'connection closed by remote host'

แม้ในหลายกรณีข้อผิดพลาด ssh_exchange_identification: Connection closed by remote host จะเกิดจากปัญหาไฟล์ตั้งค่า hosts.deny และ hosts.allow แต่มีสาเหตุอื่นๆ อีกมาก หากคุณกำลังอ่านบทความนี้ แสดงว่าคุณน่าจะตรวจสอบแล้วว่าทั้งสองไฟล์ไม่ได้บล็อก IP ของคุณไม่ให้ใช้ SSH เข้าเซิร์ฟเวอร์ระยะไกล

สมมติว่านั่นคือสาเหตุ คุณอาจเผชิญกับปัญหา การพึ่งพา (dependency), การแยกส่วนหน่วยความจำ (memory fragmentation) หรือ เซสชันมากเกินไปจากไคลเอนต์รายเดียว ข่าวดีคือหลังแก้ปัญหาแล้ว คุณไม่ควรเจอข้อผิดพลาดนี้อีก

วิธีที่ 1: แก้ไขการพึ่งพาที่ขาดหาย (Missing Dependencies)

หากเจอข้อผิดพลาด ssh_exchange_identification: connection closed by remote host เฉพาะหลังอัปเดต OpenSSL หรือ glibc อาจเป็นปัญหา dependency ที่หายไป ให้รัน
sudo lsof -n | grep ssh | grep DEL
จากบรรทัดคำสั่งในสถานการณ์นี้ จะแสดงรายการไฟล์ที่เปิดอยู่ แล้วกรองเฉพาะที่ถูกลบไปเมื่อเร็วๆ นี้เกี่ยวกับ SSH daemon

แก้ไข: ssh_exchange_identification  connection closed by remote host

หากไม่ได้ผลลัพธ์อะไรกลับมา ยังลองรีสตาร์ท daemon หรือระบบทั้งหมดได้ ควรลองรีสตาร์ทหากมีข้อผิดพลาดหลายอย่างโยนกลับมา แต่อาจละเลยข้อผิดพลาดเกี่ยวกับ /run/user/1000/gvfs ได้ เพราะมาจากปัญหา virtual file system ที่ไม่เกี่ยวข้อง

อาจลองใช้ apt-get, pacman หรือ yum อัปเดตแพ็กเกจหากสงสัยปัญหา dependency หากอยู่บนระบบ Debian/Ubuntu ลอง sudo apt-get -f upgrade ดูว่าซ่อมแพ็กเกจที่เสียหายได้ไหม

วิธีที่ 2: แก้ไขการแยกส่วนหน่วยความจำ (Memory Fragmentation)

หากวิธีแรกไม่ช่วย อาจมีปัญหาที่ฝั่งโฮสต์ (host side) โฮสต์ที่รันใน VM ไม่ได้มี swap partition เสมอไป ซึ่งนำไปสู่ memory fragmentation ให้เข้าถึงโฮสต์ด้วยวิธีอื่น (อาจเป็นแบบกายภาพหากทำได้) แล้วรีสตาร์ทบริการที่มีปัญหา เช่น MySQL, Apache, nginx เป็นต้น

แม้การรีบูทโฮสต์อาจไม่เป็นไปได้ตลอดเวลา แต่สามารถแก้ปัญหาได้ และควรทำหากเคยสลับระหว่างข้อผิดพลาดนี้กับข้อผิดพลาดที่คืนค่า IP Address จำไว้ว่าหากมีการเข้าถึงเซิร์ฟเวอร์ได้ สามารถรันคำสั่ง vmstat -s เพื่อดูสถิติการใช้หน่วยความจำสำคัญได้ แม้จะเป็นผู้ใช้ทั่วไปก็ตาม

แก้ไข: ssh_exchange_identification  connection closed by remote host

วิธีที่ 3: ตรวจสอบอินสแตนซ์ SSH เกิน (Extra SSH Instances)

นอกจากนี้ ให้ตรวจสอบว่าโฮสต์มีการพยายามเชื่อมต่อเข้ามาหรือไม่ อาจเกินจำนวนเซสชัน SSH สูงสุดโดยไม่รู้ตัว ให้ล้างเซสชันเก่าแล้วลองเชื่อมต่อใหม่ วิธีง่ายคือรันคำสั่ง who เพื่อดูว่ามีกระบวนการผู้ใช้ไหนล็อกอินอยู่ ควรเห็นเพียง 1-2 คน หากมีหลายเซสชันขนานกัน ให้ kill กระบวนการผู้ใช้แล้วล็อกอินใหม่

สิ่งนี้อาจเกิดขึ้นหาก sshd ติดตามไม่ทันสคริปต์ที่เริ่มหลายเซสชัน SSH ในลูป หากเคยเกิดขึ้น ให้เพิ่มคำสั่ง sleep 0.3 ในลูป เพื่อให้ sshd daemon มีเวลาติดตาม

วิธีที่ 4: หาขีดจำกัดการเชื่อมต่อ sshd (sshd Connection Limit)

ปัญหาการเชื่อมต่อแบบนี้พบได้มากเมื่อพยายามใช้ SSH เข้าถึงเราเตอร์หรืออุปกรณ์สวิตช์กล่อง (boxed switch) เนื่องจากค่า default ของจำนวนการเชื่อมต่อสูงสุดน้อยมาก แม้ไม่ควรอนุญาตให้โหลดเซิร์ฟเวอร์เกิน แต่สามารถดูค่า default ได้

ลองรัน
แก้ไข: ssh_exchange_identification  connection closed by remote host บนเซิร์ฟเวอร์เพื่อดูว่า sshd รองรับการเชื่อมต่อได้กี่ครั้ง ในส่วนใหญ่ระบบจะ default ไว้ที่ 10 การเชื่อมต่อพร้อมกัน ซึ่งควรเพียงพอสำหรับโครงสร้างเซิร์ฟเวอร์ส่วนใหญ่ที่ผู้ใช้ส่วนใหญ่ต้องใช้ SSH อย่างสม่ำเสมอ