Không SSH được vào VPS Linux: 10 nguyên nhân và cách sửa lỗi (Update 2025)

Nếu bạn đang quản trị VPS Linux, có lẽ không có gì gây hoang mang hơn việc đột ngột không SSH được vào VPS Linux của mình. Màn hình terminal chỉ trả về lỗi “Connection timed out”, “Connection refused”, hoặc các cảnh báo khó hiểu, trong khi máy chủ của bạn có thể đang vận hành các ứng dụng và website quan trọng.

Sự cố này có thể làm đình trệ mọi công việc. Tình trạng không SSH được vào VPS Linux không chỉ xảy ra với người mới, mà ngay cả các quản trị viên hệ thống (SysAdmin) kinh nghiệm đôi khi cũng phải bối rối. Nguyên nhân có thể đến từ một thiết lập sai rất nhỏ trên server, một quy tắc tường lửa vô tình được kích hoạt, hoặc thậm chí là một vấn đề ngay trên máy tính của bạn.

Thay vì mò mẫm trong vô vọng, bài viết này sẽ cung cấp một quy trình “troubleshooting” (gỡ rối) toàn diện, đi từ các lỗi phía client (máy tính của bạn) đến các chẩn đoán kỹ thuật sâu bên trong server.

Gỡ rối nhanh trong 60 giây

Không SSH được? Hầu hết các lỗi nằm ở 1 trong 4 nguyên nhân chính sau. Hãy kiểm tra theo thứ tự:

  1. Kiểm tra Client: Thử kết nối SSH bằng mạng 4G/5G. Nếu vào được, IP Wi-Fi của bạn đã bị chặn. (Xem Nguyên nhân 7: Fail2Ban).
  2. Kiểm tra dịch vụ SSH (Qua VNC/Console): Đăng nhập VNC và chạy systemctl status sshd. Nếu thấy inactive (dead), chạy systemctl start sshd.
  3. Kiểm tra tường lửa Server (Qua VNC): Chạy ufw status (nếu là Ubuntu) hoặc firewall-cmd --list-all (nếu là CentOS). Đảm bảo cổng 22 (hoặc cổng SSH của bạn) được ALLOW.
  4. Kiểm tra tường lửa Cloud: Đăng nhập vào Panel của nhà cung cấp. Kiểm tra mục “Firewall” hoặc “Security Group” và đảm bảo đã mở cổng SSH.

Checklist kiểm tra phía Client (5 bước gỡ rối nhanh)

Cross Platform Bug Founding Concept Vector Illustration

Trước khi “đổ lỗi” cho VPS, hãy chắc chắn vấn đề không xuất phát từ chính máy tính của bạn. Các lỗi này rất phổ biến và may mắn là dễ khắc phục nhất.

Lỗi “WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”

Đây là cảnh báo bảo mật cực kỳ phổ biến khiến người dùng hoang mang.

  • Triệu chứng: Bạn nhận được một cảnh báo lớn màu vàng hoặc đỏ, có chứa dòng chữ REMOTE HOST IDENTIFICATION HAS CHANGED và kết nối bị từ chối.
  • Nguyên nhân: Đây không phải lỗi server. Đây là một tính năng bảo mật của máy tính bạn. Nó xảy ra khi “dấu vân tay” (host key) của VPS bị thay đổi so với lần cuối bạn kết nối. Lý do phổ biến là:
    • Bạn vừa cài đặt lại (re-install) hệ điều hành VPS.
    • Nhà cung cấp đã di chuyển VPS của bạn sang một hạ tầng phần cứng mới.
    • (Trường hợp hiếm): Bạn đang bị tấn công Man-in-the-Middle (MITM).
  • Cách sửa (trên máy tính của bạn): Bạn chỉ cần xóa “dấu vân tay” cũ mà máy bạn đang lưu. Mở Terminal (macOS/Linux) hoặc PowerShell (Windows) và chạy lệnh:
    ssh-keygen -R [IP_VPS_CUA_BAN]

    Sau khi chạy, hãy kết nối SSH lại. Bạn sẽ nhận được một thông báo hỏi “Are you sure you want to continue connecting (yes/no)?” -> Gõ yes và Enter.

Lỗi “Permission Denied” do sai quyền (Permissions) File Key

Cryptography and Encryption Concept Vector Illustration

Nếu bạn đang sử dụng SSH Key (khuyến nghị) thay vì mật khẩu, đây là lỗi thường gặp.

  • Triệu chứng: Lỗi Permission denied (publickey) hoặc cảnh báo WARNING: UNPROTECTED PRIVATE KEY FILE!.
  • Nguyên nhân: Vì lý do bảo mật, SSH client trên máy tính của bạn (Linux/macOS) yêu cầu file Private Key (ví dụ id_rsa) phải được bảo vệ nghiêm ngặt. Nếu quyền (permission) của file này quá “mở” (ví dụ 777 hoặc 644), SSH sẽ từ chối sử dụng nó.
  • Cách sửa (trên máy tính của bạn): Bạn cần siết chặt quyền của file private key về 600 (chỉ chủ sở hữu được đọc/ghi).
    chmod 600 ~/.ssh/id_rsa

    (Thay ~/.ssh/id_rsa bằng đường dẫn chính xác đến file private key của bạn nếu bạn lưu ở nơi khác).

Lỗi phân giải tên miền (Hostname Resolution)

Lỗi này xảy ra khi bạn dùng tên miền (hostname) thay vì IP để kết nối.

  • Triệu chứng: Lỗi ssh: Could not resolve hostname ten-mien-cua-toi.com: Name or service not known.
  • Nguyên nhân: Máy tính của bạn không thể “dịch” cái tên ten-mien-cua-toi.com thành một địa chỉ IP. Lý do có thể là:
    • Bạn gõ sai tên miền.
    • Tên miền chưa được trỏ (point) DNS về IP của VPS.
    • DNS trên máy tính của bạn bị lỗi.
  • Cách sửa:
    1. Hãy thử ping ten-mien-cua-toi.com. Nếu không được, hãy thử ping 8.8.8.8 để xem máy bạn có mạng không.
    2. Tạm thời, hãy thử SSH bằng địa chỉ IP của VPS (ví dụ ssh [email protected]) thay vì tên miền. Nếu IP vào được, vấn đề 100% là do DNS.

Kiểm tra kết nối mạng cơ bản (Ping, Telnet, 4G)

  • Thử mạng 4G/5G: Đây là cách nhanh nhất để kiểm tra xem IP mạng nhà bạn có bị VPS chặn (ban) hay không. Hãy tắt Wi-Fi, dùng 4G/5G và thử SSH lại.
    • Nếu 4G vào được: Chúc mừng! VPS của bạn vẫn ổn. IP mạng Wi-Fi của bạn đã bị Fail2Ban (trên VPS) chặn. Hãy xem Nguyên nhân 7 ở phần sau để biết cách gỡ ban.
    • Nếu 4G vẫn không vào được: Vấn đề nằm ở server. Hãy tiếp tục.
  • Kiểm tra ping: Chạy lệnh ping [IP_VPS].
    • Lưu ý: ping là một công cụ kiểm tra mạng cơ bản. Tuy nhiên, nhiều quản trị viên hệ thống chặn ping (ICMP) vì lý do bảo mật. Do đó, nếu ping báo Request timed out, không có nghĩa là VPS của bạn đã chết. Nó chỉ có nghĩa là ping bị chặn.
  • Kiểm tra telnet (Quan trọng hơn Ping): Lệnh này kiểm tra chính xác xem cổng (port) SSH (mặc định là 22) có “mở” hay không.
    # Trên macOS/Linux
    nc -zv [IP_VPS] 22
    
    # Trên Windows (cần bật Telnet Client, hoặc dùng PowerShell)
    Test-NetConnection -ComputerName [IP_VPS] -Port 22
    • Kết quả tốt (Cổng mở): Connection to [IP_VPS] 22 port [tcp/ssh] succeeded! (với nc) hoặc TcpTestSucceeded : True (với PowerShell). -> Cổng đã mở, vấn đề nằm ở bước sau (dịch vụ, config…).
    • Kết quả xấu (Cổng đóng): Connection timed out hoặc TcpTestSucceeded : False. -> Đây là dấu hiệu của lỗi “Connection Timed Out”. Cổng 22 đang bị Firewall (Tường lửa) chặn.

Dùng chế độ “verbose” (ssh -v)

Đây là công cụ gỡ rối “thần thánh”. Tùy chọn -v (verbose) sẽ bắt SSH client in ra mọi bước nó đang làm, giúp bạn thấy chính xác nó bị “kẹt” ở đâu.

ssh -v ten_user@IP_VPS_CUA_BAN

(Bạn có thể dùng -vv hoặc -vvv để xem chi tiết hơn nữa). Hãy quan sát các dòng cuối cùng trước khi bị treo hoặc báo lỗi, chúng sẽ cho bạn manh mối rõ ràng nhất.

“Cửa hậu” bắt buộc: Đăng nhập VNC (Console)

Nếu bạn đã làm mọi bước kiểm tra phía Client mà vẫn thất bại, vấn đề chắc chắn nằm ở Server. Nhưng làm sao để vào Server khi SSH đã hỏng?

Đây là lúc bạn cần dùng “chìa khóa cứu cánh” (lifesaver): VNC hoặc Web Console.

Mọi nhà cung cấp VPS uy tín đều cung cấp một tính năng trong trang quản trị (panel) của họ, cho phép bạn mở một màn hình giả lập, truy cập trực tiếp vào VPS như đang cắm bàn phím và màn hình vào nó.

Mọi bước gỡ rối “Server-side” dưới đây BẮT BUỘC phải được thực hiện thông qua VNC/Console.

10 nguyên nhân cốt lõi khiến bạn không SSH được vào VPS Linux (Sửa qua VNC)

Sau khi đã đăng nhập vào VPS qua VNC, bạn sẽ thấy một màn hình terminal. Hãy đăng nhập bằng user root và mật khẩu của bạn để bắt đầu chẩn đoán.

Dịch vụ SSH (sshd) bị dừng hoặc crash

Đây là nguyên nhân hàng đầu gây ra lỗi “Connection refused”. Dịch vụ có thể bị dừng do cập nhật lỗi, thiếu RAM (bị OOM Killer “giết”), hoặc ai đó vô tình tắt.

  • Cách kiểm tra:
    systemctl status sshd
    # (Một số hệ thống cũ có thể dùng: service ssh status)
    • Nếu thấy Active: active (running) (màu xanh lá): Dịch vụ đang chạy. Hãy chuyển sang nguyên nhân 2.
    • Nếu thấy Active: inactive (dead) (màu xám) hoặc Active: failed (màu đỏ): Bạn đã tìm ra thủ phạm! Dịch vụ SSH đang không chạy.
  • Cách sửa:
    # Khởi động lại dịch vụ
    systemctl start sshd
    
    # Cài đặt để nó tự khởi động cùng VPS
    systemctl enable sshd
    
    # Nếu "start" thất bại, hãy xem log để biết lý do
    journalctl -u sshd -n 50 --no-pager

OpenSSH Server chưa được cài đặt

Lỗi này hiếm nhưng có thể xảy ra nếu bạn tự cài một bản “minimal” (tối thiểu) của Linux.

  • Cách kiểm tra: (Sau khi đã thử systemctl start sshd mà thất bại). Hãy thử kết nối SSH vào chính nó (localhost):
    ssh localhost

    Nếu nhận được command not found hoặc Connection refused ngay lập tức, có thể gói openssh-server chưa được cài.

  • Cách sửa:
    # Trên Ubuntu/Debian
    apt update && apt install openssh-server
    
    # Trên CentOS/RHEL/AlmaLinux
    yum install openssh-server

    Sau đó, hãy thử systemctl start sshd lại.

Tường lửa Server (UFW/Firewalld) chặn cổng

Đây là nguyên nhân chính gây ra lỗi “Connection timed out” (khi telnet thất bại). Dịch vụ SSH vẫn chạy, nhưng tường lửa (Firewall) ngay trên VPS đang chặn mọi kết nối đến cổng 22.

  • Cách kiểm tra và sửa:
Firewall Lệnh kiểm tra trạng thái Lệnh mở cổng 22 (SSH)
UFW (Ubuntu, Debian) ufw status ufw allow 22 (hoặc ufw allow ssh)
Firewalld (CentOS, RHEL) firewall-cmd --list-all firewall-cmd --permanent --add-service=ssh (Và firewall-cmd --reload)
iptables (Cũ/Tùy chỉnh) iptables -L -n -v (Tìm dòng DROP port 22) iptables -A INPUT -p tcp --dport 22 -j ACCEPT (Cần lưu cấu hình)

[Nâng cao] SELinux chặn kết nối (Lỗi phổ biến trên CentOS/RHEL)

Đây là một “thủ phạm giấu mặt” cực kỳ khó chịu. Dịch vụ sshd đang “running”, firewalld đã “allow” port 22, nhưng bạn vẫn Timed Out. Rất có thể đó là SELinux.

SELinux (Security-Enhanced Linux) là một lớp bảo mật sâu của Red Hat.

  • Cách kiểm tra:

    # Kiểm tra xem SELinux đang ở chế độ nào
    getenforce

    Nếu kết quả là Enforcing, đây chính là “nghi phạm” số một.

  • Cách sửa (Phổ biến nhất – Khi đổi Port): Nếu bạn đổi cổng SSH (ví dụ sang 2222) mà quên không báo cho SELinux, nó sẽ bị chặn. Bạn cần “báo” cho SELinux rằng cổng 2222 là cổng SSH:
    # Cài công cụ semanage nếu chưa có
    yum install policycoreutils-python-utils
    
    # Thêm context cho cổng mới
    semanage port -a -t ssh_port_t -p tcp 2222
    
    # Khởi động lại sshd
    systemctl restart sshd
  • Cách sửa (Tạm thời – Để gỡ rối): Chuyển SELinux sang chế độ “Permissive” (chỉ ghi log, không chặn).
    setenforce 0

    Nếu sau lệnh này bạn SSH vào được, thì 100% là lỗi SELinux. (Lưu ý: setenforce 0 chỉ là tạm thời, sau khi reboot sẽ mất tác dụng).

Lỗi cấu hình SSH (sshd_config)

  • Triệu chứng: Dịch vụ chạy, tường lửa mở, nhưng bạn vẫn bị “Connection Refused” (nếu đổi port sai) hoặc “Permission Denied” (nếu tắt Password).
  • Nguyên nhân: Do bạn đã chỉnh sửa file /etc/ssh/sshd_config và gây lỗi.
    • Đổi cổng (ví dụ: Port 2222) nhưng quên, vẫn cố kết nối vào cổng 22.
    • Tắt đăng nhập bằng mật khẩu (PasswordAuthentication no) nhưng chưa thêm SSH Key.
    • Chặn user root (PermitRootLogin no) nhưng lại cố đăng nhập bằng root.
  • Mẹo chuyên gia: Kiểm tra cú pháp trước khi sửa: Không bao giờ sửa file sshd_config và khởi động lại ngay. Hãy luôn chạy lệnh “thần thánh” này để kiểm tra cú pháp trước:
    sshd -t

    Nếu không có gì hiện ra, file config của bạn hợp lệ. Nếu báo lỗi, nó sẽ chỉ rõ bạn sai ở dòng nào.

  • Cách sửa:
    nano /etc/ssh/sshd_config

    Tìm và sửa lại các dòng Port, PermitRootLogin, PasswordAuthentication cho đúng. Sau khi dùng sshd -t thấy ổn, mới chạy:

    systemctl restart sshd

Lỗi Cloud Firewall / Security Group (Lỗi “ngầm” khó phát hiện)

Cloud Computing Security Concept Vector Illustration

Đây là nguyên nhân “đau đớn” nhất. Bạn đã tắt ufw, tắt firewalld, tắt cả SELinux… nhưng vẫn Timed Out.

  • Nguyên nhân: Bạn quên mất nhà cung cấp có một lớp tường lửa “bên ngoài” VPS. Lớp này gọi là Cloud Firewall hoặc Security Group.
  • Đặc điểm: Tường lửa này nằm trên hạ tầng của nhà cung cấp, bạn không thể dùng ufw status để thấy nó.
  • Cách sửa: Bắt buộc đăng nhập vào Panel của nhà cung cấp. Tìm mục “Network”, “Firewall”, hoặc “Security Groups”. Đảm bảo có một quy tắc (Inbound Rule) cho phép lưu lượng TCP, Giao thức 22, từ Nguồn (Source) là 0.0.0.0/0 (mọi nơi) hoặc IP của bạn.

IP của bạn bị ban (Fail2Ban / CSF)

  • Triệu chứng: Đây chính là trường hợp “4G vào được, Wi-Fi không vào được” ở phần đầu.
  • Nguyên nhân: Các công cụ bảo mật tự động như Fail2Ban hoặc CSF (ConfigServer Firewall) sẽ tự động chặn (ban) IP của bạn nếu phát hiện đăng nhập sai mật khẩu quá nhiều lần liên tiếp.
  • Cách sửa (qua VNC hoặc 4G):
    # Với Fail2Ban
    fail2ban-client status sshd
    # Nếu thấy IP của bạn, gỡ ban:
    fail2ban-client set sshd unbanip <IP_WIFI_CUA_BAN>
    
    # Với CSF
    csf -g <IP_WIFI_CUA_BAN>  # Kiểm tra IP
    csf -dr <IP_WIFI_CUA_BAN> # Gỡ ban IP

VPS bị quá tải hoặc hết dung lượng (CPU/RAM/Disk/Inode)

Khi VPS bị treo cứng, 100% CPU, hết sạch RAM (OOM), hoặc ổ cứng bị đầy 100%, dịch vụ SSH có thể không đủ tài nguyên để phản hồi, gây ra lỗi “Timed Out”.

  • Cách kiểm tra:
    # Kiểm tra CPU/RAM
    htop
    
    # Kiểm tra dung lượng đĩa (Usage)
    df -h
    
    # Kiểm tra dung lượng file (Inode) - Rất quan trọng!
    df -i

    (Nếu df -h báo còn dung lượng nhưng df -i báo IUse% 100%, bạn cũng sẽ gặp lỗi tương tự).

  • Cách sửa: Dùng htop để kill (F9) process lạ. Dùng find để tìm và xóa các file log cũ, lớn trong /var/log hoặc file rác trong /tmp.

Quyền (Permission) file phía Server

  • Triệu chứng: Lỗi Permission Denied dù bạn chắc chắn key/password đúng.
  • Nguyên nhân: Các thư mục ~/.ssh và file ~/.ssh/authorized_keys trên server cũng yêu cầu quyền rất nghiêm ngặt.
  • Cách sửa (trên Server qua VNC): Chạy các lệnh sau để “chuẩn hóa” lại quyền:
    # Chạy với user bạn muốn SSH vào, KHÔNG phải root
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    chown $(whoami):$(whoami) ~/.ssh/authorized_keys

Lỗi từ nhà cung cấp hoặc thanh toán

Đây là nguyên nhân phi kỹ thuật mà nhiều người bỏ sót.

  • VPS hết hạn/Chưa thanh toán: Dịch vụ của bạn đã bị “Suspended” (Tạm ngưng). Hãy kiểm tra mục “Billing” (Thanh toán).
  • VPS bị khóa do vi phạm (Abuse): Bạn có thể đã bị khóa VPS do vi phạm chính sách (spam email, scan port, dính mã độc…). Kiểm tra email hoặc ticket hỗtrợ.
  • Nhà cung cấp bảo trì: Kiểm tra trang “Status” của nhà cung cấp để xem khu vực (region) của bạn có đang được bảo trì phần cứng hay không.

Kết luận

Khi không SSH được vào VPS Linux, đừng vội hoảng sợ. Hãy bình tĩnh thực hiện theo quy trình:

  1. Kiểm tra Client: Thử 4G, ssh-keygen -R (nếu lỗi Host Key), chmod 600 (nếu lỗi Key Permission), telnet (kiểm tra cổng).
  2. Kiểm tra Panel: Đăng nhập Panel, kiểm tra Cloud Firewall / Security Group.
  3. Kiểm tra Server (Qua VNC): Đăng nhập VNC, kiểm tra systemctl status sshd (dịch vụ), sau đó kiểm tra ufw status / firewall-cmd (tường lửa server), và cuối cùng là getenforce (SELinux).

Để phòng tránh sự cố này trong tương lai, hãy:

  • Luôn dùng SSH Key: Tắt hoàn toàn đăng nhập bằng mật khẩu (PasswordAuthentication no).
  • Tắt đăng nhập root: PermitRootLogin no. Luôn SSH bằng user thường rồi sudo.
  • Cài đặt Fail2Ban: Để tự động chặn các IP cố gắng brute-force (đoán) mật khẩu.
  • Đổi cổng SSH: Đổi từ 22 sang một cổng khác (ví dụ 2289). (Nhưng hãy nhớ sshd -tsemanage port (nếu dùng SELinux) trước khi làm).
  • Cân nhắc dùng Bastion Host: Một máy chủ trung gian để nhảy vào các máy chủ quan trọng khác.

Tài liệu tham khảo

Chia sẻ bài viết:

Đánh giá

0/5 - (0 Bình chọn)

Chưa có đánh giá.