คำตอบสั้น ๆ: แก้ SSH Connection refused ทีละขั้น แยกอาการจาก timed out และ Permission denied ตรวจ sshd พอร์ต ssh.socket ไฟร์วอลล์ Fail2ban และ Security Group ผ่าน Console
คู่มือนี้อธิบาย SSH Connection refused ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
SSH Connection refused คือข้อความ ssh: connect to host 203.0.113.10 port 22: Connection refused ที่ขึ้นเมื่อแพ็กเก็ตไปถึงเซิร์ฟเวอร์แล้ว แต่เซิร์ฟเวอร์ตอบกลับว่าไม่รับการเชื่อมต่อที่พอร์ตนั้น ต่างจาก Connection timed out ที่แพ็กเก็ตหายระหว่างทางโดยไม่มีคำตอบ และต่างจาก Permission denied ที่เชื่อมต่อได้แล้วแต่ยืนยันตัวตนไม่ผ่าน การแยกสามอาการนี้ให้ออกตั้งแต่แรกช่วยลดเวลาแก้ได้มาก เพราะแต่ละอาการชี้ไปคนละชั้น
คู่มือนี้เหมาะกับผู้ดูแล Linux Server ที่จู่ ๆ เข้าเครื่องผ่าน SSH ไม่ได้ เมื่อไล่ตามขั้นตอนครบ คุณจะรู้ว่า SSH Connection refused มาจาก sshd หยุดทำงาน คอนฟิกผิด พอร์ตเปลี่ยน ไฟร์วอลล์ในเครื่อง หรือ Fail2ban แบน IP ของคุณ และแก้กลับได้ผ่าน Console ของผู้ให้บริการโดยไม่ต้องติดตั้งระบบใหม่
สิ่งที่ต้องเตรียม
- IP สาธารณะของเซิร์ฟเวอร์ พอร์ต SSH ที่ตั้งไว้ และชื่อผู้ใช้ที่ใช้ล็อกอิน
- IP สาธารณะของเครื่องคุณเอง เพื่อตรวจว่าถูกแบนหรือไม่ และเพื่อใช้ในกฎไฟร์วอลล์
- ทางเข้าสำรองที่ไม่ผ่าน SSH เพราะระหว่างที่เจอ SSH Connection refused คุณต้องสั่งงานเครื่องทางอื่น เช่น Console ผ่านเว็บ ดูวิธีเปิดได้ที่ คู่มือ Remote เข้า Console Server ผ่าน Web UI ถ้าจำรหัสผ่าน root ไม่ได้ ตั้งใหม่ได้ตาม คู่มือ Reset OS Password
- สิทธิ์เข้าหน้าจัดการไฟร์วอลล์ของคลาวด์ เช่น Security Group บน TDC Enterprise
ขั้นตอนที่ 1: อ่านข้อความผิดพลาดให้ตรงอาการ
เมื่อเจอข้อความที่ดูคล้าย SSH Connection refused ให้รัน ssh พร้อม -v เพื่อดูว่าหยุดที่ขั้นไหน ข้อความบรรทัดสุดท้ายคือสิ่งที่ต้องใช้
ssh -v -p 22 [email protected]
- SSH Connection refused: เครื่องปลายทางตอบปฏิเสธทันที แปลว่าเครือข่ายถึงเครื่องแล้ว ปัญหาอยู่ที่ไม่มีโปรแกรมรอที่พอร์ตนั้น หรือไฟร์วอลล์ในเครื่องตั้งให้ตอบปฏิเสธ เช่น Fail2ban
- Connection timed out: ไม่มีคำตอบเลย มักเป็นไฟร์วอลล์ที่ทิ้งแพ็กเก็ตเงียบ ๆ เช่น Security Group, ค่าเริ่มต้นของ UFW, IP ผิด หรือเครื่องปิดอยู่
- No route to host: บน AlmaLinux และ Rocky Linux มักมาจาก firewalld ที่ปฏิเสธด้วย ICMP
- Permission denied (publickey): เข้าถึง sshd แล้ว แต่คีย์หรือรหัสผ่านไม่ผ่าน ไม่ใช่ปัญหาเครือข่าย ให้ดู คู่มือตั้งค่า SSH Key บน Linux
- Connection reset by peer หรือ Connection closed ทันทีหลังเชื่อมต่อ: sshd รับแล้วตัดทิ้ง มักมาจากการจำกัดจำนวนการเชื่อมต่อหรือกฎที่ปฏิเสธ IP
คู่มือนี้เน้นอาการ SSH Connection refused เป็นหลัก และครอบคลุม timed out ในขั้นตอนที่ 5 เพราะสองอาการนี้มักสลับกันไปมาระหว่างแก้
ขั้นตอนที่ 2: ทดสอบพอร์ตจากเครื่องของคุณ
ทดสอบเฉพาะการเชื่อมต่อ TCP โดยไม่ยืนยันตัวตน เพื่อแยกปัญหาเครือข่ายออกจากปัญหาของ ssh client
# macOS / Linux
nc -vz -w 5 203.0.113.10 22
# Windows PowerShell
Test-NetConnection 203.0.113.10 -Port 22
ถ้า nc ตอบ Connection refused ทันที ยืนยันได้ว่าเป็น SSH Connection refused ที่เครื่องปลายทาง ให้ตรวจสองเรื่องที่ทำพลาดบ่อยที่สุดก่อน คือพอร์ต SSH ถูกเปลี่ยนไปแล้วแต่ยังเชื่อมต่อพอร์ต 22 (ทบทวนได้จาก คู่มือเปลี่ยน SSH Port บน Linux) และ IP ที่ใช้ถูกเครื่องหรือไม่ ลองพอร์ตอื่นที่เครื่องเปิดอยู่ เช่น nc -vz 203.0.113.10 443 ถ้าพอร์ตเว็บตอบได้ แปลว่าเครื่องทำงานและเครือข่ายปกติ SSH Connection refused จึงจำกัดอยู่ที่บริการ SSH เท่านั้น
ถ้าคุณเพิ่งรีสตาร์ตเครื่องหรือบริการ ให้รอ 1–2 นาทีแล้วลองใหม่ เพราะช่วงที่ระบบกำลังบูต sshd ยังไม่เริ่มฟังพอร์ต และจะตอบ SSH Connection refused ชั่วคราว
ขั้นตอนที่ 3: เข้า Console แล้วตรวจบริการ sshd
สาเหตุที่พบบ่อยที่สุดของ SSH Connection refused คือ sshd ไม่ได้ทำงาน เข้าเครื่องผ่าน Console ของผู้ให้บริการ แล้วตรวจว่าบริการทำงานและฟังพอร์ตใดอยู่ บน Ubuntu และ Debian ชื่อบริการคือ ssh บน AlmaLinux และ Rocky Linux คือ sshd
systemctl status ssh --no-pager
sudo ss -tlnp | grep -E 'sshd|:22 '
sudo sshd -t
sudo journalctl -u ssh -n 30 --no-pager
sshd -t ตรวจไวยากรณ์ของ /etc/ssh/sshd_config และไฟล์ใน sshd_config.d/ ถ้าไม่มีผลลัพธ์แปลว่าผ่าน ถ้ามีข้อผิดพลาดจะบอกเลขบรรทัด เช่น Bad configuration option ซึ่งทำให้ sshd เริ่มไม่ได้และเกิด SSH Connection refused ทันทีหลังรีสตาร์ต (บน Ubuntu ที่ใช้ ssh.socket อาการอาจเป็น Connection reset หรือ closed แทน) แก้บรรทัดนั้นแล้วสั่ง sudo systemctl restart ssh
ข้อความที่พบบ่อยในล็อกเมื่อ sshd เริ่มไม่ได้มีอีกสองแบบ sshd: no hostkeys available -- exiting หมายถึงไฟล์ host key หาย แก้ด้วย sudo ssh-keygen -A ซึ่งสร้างเฉพาะคีย์ที่ขาด ส่วน Missing privilege separation directory: /run/sshd แก้ด้วย sudo mkdir -p /run/sshd && sudo chmod 0755 /run/sshd แล้วเริ่มบริการใหม่
บน Ubuntu 22.10 ขึ้นไปรวมถึง 24.04 SSH ใช้ socket activation ผ่าน ssh.socket ตรวจด้วย systemctl is-active ssh.socket ถ้าได้ active คำสั่ง ss จะแสดงว่า systemd เป็นผู้ถือพอร์ต และการแก้ Port ใน sshd_config ต้องตามด้วยสองคำสั่งนี้ ไม่เช่นนั้น socket จะยังฟังพอร์ตเดิม และการเชื่อมต่อไปพอร์ตใหม่จะได้ SSH Connection refused
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
ตรวจบรรทัด ListenAddress ด้วย ถ้าตั้งไว้เป็น IP ภายในอย่างเดียว เช่น 10.0.0.11 การเชื่อมต่อจาก IP สาธารณะจะเจอ SSH Connection refused ทั้งที่บริการทำงานปกติ