แก้ปัญหา SSH โดยตรวจสอบสาเหตุทีละจุด
เมื่อ SSH เข้า Ubuntu VPS ไม่ได้ ให้ใช้ข้อความผิดพลาดเลือกจุดตรวจ แยกเครือข่าย service คีย์ผู้ใช้ และตัวตนเครื่อง เก็บการเชื่อมต่อที่ยังใช้ได้ไว้ระหว่างวิเคราะห์ เพื่อไม่เสียช่องทางกู้คืน
VPSuntu · อัปเดต · อ่านประมาณ 5 นาที
เนื้อหาในคู่มือนี้
บันทึกความล้มเหลวหนึ่งครั้ง
เปิด session ที่ยังใช้ได้ค้างไว้และหา recovery console คำสั่ง client รันบนคอมพิวเตอร์ Linux, macOS หรือ WSL ส่วนคำสั่ง server รันผ่าน session เดิมหรือ console ที่ยืนยันแล้ว อย่าสลับเครื่อง
แทน IP ตัวอย่าง 203.0.113.10, บัญชี ubuntu, พอร์ต 22 และ path คีย์ด้วยค่าจริง บนคอมพิวเตอร์ตรวจค่าที่ client จะใช้ แล้วลองเชื่อมต่อใหม่
ssh -G -p 22 -i ~/.ssh/ubuntu_vps ubuntu@203.0.113.10
ssh -v -S none -o ConnectTimeout=10 -o StrictHostKeyChecking=ask -p 22 -i ~/.ssh/ubuntu_vps ubuntu@203.0.113.10ดู hostname, user, port, identityfile และ proxy คำสั่งที่สองปิด connection sharing สำหรับครั้งนี้ จดเวลาและ error สุดท้าย ยืนยัน host key ใหม่ตามหัวข้อด้านล่าง ปิดบังข้อมูลใน debug ก่อนแชร์และห้ามส่ง private key
แยกประเภทจากข้อความผิดพลาด
บนหน้าจอขนาดเล็ก เลื่อนตารางด้านข้างเพื่อดูทุกคอลัมน์
| ข้อความหรือจุดที่ล้มเหลว | ความหมาย | ตรวจต่อ |
|---|---|---|
| Connection timed out ก่อนเชื่อมต่อ | TCP ยังไม่สำเร็จ | IP, เส้นทาง, ไฟร์วอลล์ และสถานะเครื่อง |
| Connection refused | ปลายทางปฏิเสธบนพอร์ตนั้น | พอร์ต listener และกฎ reject |
| Permission denied (publickey) | ถึงขั้น authentication แต่คีย์ใช้ไม่ได้ | ชื่อบัญชี คีย์ และนโยบาย server |
| REMOTE HOST IDENTIFICATION HAS CHANGED | ตัวตนไม่ตรงกับที่บันทึกไว้ | ยืนยัน host key ผ่านช่องทางที่เชื่อถือได้ |
ข้อความช่วยจำกัดวงแต่ไม่ยืนยันสาเหตุเดียว ถ้า debug บอก Connection established แล้วจึง timeout ให้ตรวจ handshake และ server log ด้วย ไม่ใช่สรุปว่าแพ็กเก็ตทั้งหมดถูกบล็อก
Timeout: ไล่เส้นทางเครือข่าย
เทียบ IP จาก ssh -v กับ panel ผู้ให้บริการ DNS เก่าหรือ IPv6 คนละปลายทางอาจส่งคุณไปผิดเครื่อง ตรวจว่า VPS ต้องใช้ public address, VPN หรือ jump host และเครื่องกำลังทำงาน
ตรวจ routing, destination port และ public IP ต้นทางปัจจุบัน กฎ /32 อาจยังใช้ IP เก่าของบ้าน ตรวจ guest firewall ผ่าน console ด้วย สำหรับ Oracle ต้องดู security lists, NSG และ route รักษากฎอิมเมจเดิม ไม่ติดตั้ง UFW หรือล้าง iptables เพื่อวิเคราะห์ การ ping ไม่ผ่านอย่างเดียวไม่ได้ยืนยันว่า SSH ใช้ไม่ได้ ดูตัวอย่างเครือข่าย Oracle
Refused: ตรวจ service ที่ฟังพอร์ต
การถูกปฏิเสธไม่ได้ยืนยันว่าเป็น VPS ที่ต้องการ ยืนยันปลายทางก่อน แล้วอ่านสถานะบนเซิร์ฟเวอร์ผ่านสิทธิ์เดิมหรือ console
systemctl status ssh.service ssh.socket --no-pager
sudo ss -lntp
sudo /usr/sbin/sshd -t
sudo journalctl -u ssh.service -u ssh.socket --since '15 minutes ago' --no-pagerตรวจ listener บนพอร์ตและ address ที่ตั้งใจ แล้วเทียบเวลา log กับการลองเข้า Ubuntu อาจใช้ socket activation ดังนั้น ssh.service ไม่ active ไม่ได้แปลว่า SSH หยุด ถ้า ssh.socket ยังฟังอยู่
sshd -t ตรวจ config และ host key โดยไม่เริ่ม daemon การผ่านเงียบ ๆ ไม่ยืนยัน network reachability ถ้าพบ error ให้แก้ไฟล์หรือค่าที่ระบุก่อนพิจารณา reload ไม่ restart แบบเดาสุ่ม
Public key: ตรวจบัญชีและคีย์ที่ส่ง
ใช้บัญชีเริ่มต้นของผู้ให้บริการหรือผู้ดูแลที่สร้างจริง ตรวจ fingerprint ของคีย์ที่ client เสนอ หากต้องลดคีย์อื่นจาก agent ให้ลองบนคอมพิวเตอร์
ssh -v -S none -o IdentitiesOnly=yes -o StrictHostKeyChecking=ask -p 22 -i ~/.ssh/ubuntu_vps ubuntu@203.0.113.10IdentityFile ใน config ยังอาจมีผล ตรวจ ssh -G ถ้า private key อ่านไม่ได้หรือสิทธิ์เปิดกว้างเกินไป ให้แก้ไฟล์ local นั้นก่อนเปลี่ยน server
บนเซิร์ฟเวอร์ตรวจบัญชีและ public key ที่อนุญาต ตัวอย่างใช้ /home/ubuntu ต้องแทนด้วย home ที่ getent แสดงจริง
getent passwd ubuntu
sudo ls -ld /home/ubuntu /home/ubuntu/.ssh /home/ubuntu/.ssh/authorized_keys
sudo ssh-keygen -lf /home/ubuntu/.ssh/authorized_keysเทียบ fingerprint กับคีย์ที่ส่ง ดู owner, permissions และนโยบายบัญชีใน journal ตรวจ AuthorizedKeysFile, included config, Match rules หรือบริการจัดการคีย์ของผู้ให้บริการเมื่อใช้กลไกต่างจากค่าเริ่มต้น เก็บ authorized keys เดิมไว้ ไม่ปิด StrictModes หรือเปิดรหัสผ่านเพื่อกลบสาเหตุ
Host key เปลี่ยน: ยืนยันก่อนเชื่อมต่อ
การ rebuild หรือ IP ที่ย้ายเจ้าของอาจทำให้ host key เปลี่ยน แต่ก็อาจหมายถึงผิดเครื่องหรือถูกแทรกกลาง ยืนยัน instance ID และประวัติการ rebuild ใน panel ที่ล็อกอินแล้ว
ผ่าน console ที่เชื่อถือได้บน guest ตรวจ public host key ชนิดที่ client แจ้ง ตัวอย่าง Ed25519
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub -E sha256เปรียบเทียบ SHA256 กับคำเตือน นี่คือคีย์ของเซิร์ฟเวอร์ ไม่ใช่คีย์ล็อกอินหรือ console gateway ถ้ายืนยันว่ามีการแทนเครื่องจริง ค่อยสำรอง known_hosts แล้วแก้เฉพาะรายการนั้น เก็บรายการอื่นไว้ ไม่ล้างไฟล์ทั้งหมดหรือข้ามการตรวจ ถ้ายังอธิบายไม่ได้ให้หยุดเชื่อมต่อ
ตรวจผลด้วย session ใหม่
แก้เฉพาะ IP, user, key, กฎเครือข่าย หรือ config ที่พบปัญหา รักษาช่องทางอิสระไว้และทดสอบ config ก่อนใช้งานจริง การเปลี่ยนพอร์ตอาจต้องดู socket activation ด้วย
ลองใหม่โดยปิด connection sharing ยืนยันว่าเข้าบัญชีถูกต้องและใช้ sudo ได้ตามจำเป็น session เก่าที่ยังอยู่ไม่ใช่ผลทดสอบนี้ จดสาเหตุและสิ่งที่แก้ แล้วกลับไปขั้นตอนตั้งค่าเว็บ
คำถามที่พบบ่อย
ควร reinstall Ubuntu เพื่อแก้ SSH ไหม?
ตรวจสาเหตุก่อน IP ชื่อบัญชี หรือคีย์ผิดไม่ต้อง reinstall และการติดตั้งใหม่อาจทำลายข้อมูล หากไม่เหลือสิทธิ์เข้าให้ใช้ recovery ของผู้ให้บริการ
Console ใช้ได้แปลว่า SSH ควรใช้ได้ด้วยหรือไม่?
ไม่เสมอไป ทั้งสองใช้เส้นทางต่างกัน SSH ยังต้องมี listener, authentication และกฎเครือข่ายที่อนุญาต