Kiến thức Hữu ích 😍

Lỗi SSH bị từ chối trên Linux: Nguyên nhân và cách sửa nhanh


Bạn đã bao giờ cố gắng truy cập vào máy chủ Linux của mình qua SSH và nhận được thông báo lỗi “Connection Refused”? Đây là một trong những sự cố phổ biến và gây khó chịu nhất đối với các nhà quản trị hệ thống và nhà phát triển. Lỗi này không chỉ chặn đứng quyền truy cập từ xa mà còn cản trở mọi công việc quản lý, cập nhật hay sửa lỗi trên server. Về cơ bản, thông báo này có nghĩa là máy chủ của bạn đã nhận được yêu cầu kết nối nhưng đã chủ động từ chối nó. Nguyên nhân có thể đến từ dịch vụ SSH chưa chạy, tường lửa chặn cổng, hoặc cấu hình sai. Trong bài viết này, AZWEB sẽ cùng bạn đi sâu vào từng nguyên nhân và hướng dẫn chi tiết cách khắc phục, giúp bạn nhanh chóng lấy lại quyền kiểm soát máy chủ của mình.

Giới thiệu về lỗi kết nối SSH bị từ chối trên Linux

Khi bạn quản lý một máy chủ Linux, SSH là gì (Secure Shell) là công cụ không thể thiếu để truy cập và điều khiển từ xa một cách an toàn. Tuy nhiên, không có gì khó chịu hơn khi bạn nhập lệnh kết nối và màn hình hiện lên dòng chữ “ssh: connect to host [your_server_ip] port 22: Connection refused”. Lỗi này cho thấy yêu cầu của bạn đã đến được máy chủ, nhưng không có dịch vụ nào ở cổng đích (mặc định là cổng 22) sẵn sàng chấp nhận nó. Điều này tác động trực tiếp đến khả năng quản trị hệ thống, khiến bạn không thể triển khai ứng dụng, bảo trì hay xử lý các sự cố khẩn cấp.

Các nguyên nhân chính thường xoay quanh ba vấn đề: dịch vụ SSH (sshd) không hoạt động, tường lửa đang chặn kết nối, hoặc các thiết lập trong file cấu hình SSH bị sai lệch. Hiểu rõ từng nguyên nhân sẽ giúp bạn chẩn đoán vấn đề nhanh hơn. Bài viết này sẽ được cấu trúc một cách rõ ràng, bắt đầu từ việc xác định nguyên nhân, hướng dẫn các lệnh kiểm tra cụ thể, cách cấu hình tường lửa, cho đến các bước khắc phục chi tiết và mẹo phòng tránh trong tương lai. Hãy cùng AZWEB tìm hiểu ngay sau đây.

Hình minh họa

Nguyên nhân phổ biến gây lỗi kết nối SSH bị từ chối trên Linux

Để khắc phục hiệu quả, trước tiên chúng ta cần hiểu rõ những “thủ phạm” chính đứng sau lỗi “Connection Refused”. Việc xác định đúng nguyên nhân sẽ giúp bạn tiết kiệm thời gian và áp dụng giải pháp chính xác nhất. Dưới đây là hai trong số những lý do phổ biến nhất mà các quản trị viên hệ thống thường gặp phải.

Dịch vụ SSH chưa được khởi động hoặc bị dừng

Đây là nguyên nhân đơn giản và dễ kiểm tra nhất. Giao thức SSH hoạt động dựa trên một dịch vụ nền (daemon) có tên là sshd trên máy chủ. Dịch vụ này có nhiệm vụ lắng nghe các yêu cầu kết nối đến trên một cổng cụ thể (thường là cổng 22). Nếu dịch vụ sshd vì một lý do nào đó không được khởi động cùng hệ thống, bị dừng đột ngột hoặc gặp lỗi khi đang chạy, máy chủ sẽ không có gì để “lắng nghe”. Do đó, mọi yêu cầu kết nối SSH gửi đến đều sẽ bị từ chối ngay lập tức. Tình trạng này có thể xảy ra sau khi khởi động lại máy chủ, cập nhật hệ điều hành hoặc do các tiến trình khác gây xung đột. Việc nhận biết trạng thái của dịch vụ này là bước đầu tiên và quan trọng nhất trong quá trình xử lý sự cố.

Cấu hình sai trong file sshd_config

File /etc/ssh/sshd_config là trái tim của dịch vụ SSH, chứa tất cả các thiết lập quan trọng về cách máy chủ chấp nhận và xử lý kết nối. Bất kỳ một sai sót nhỏ nào trong file này cũng có thể dẫn đến lỗi “Connection Refused”. Các lỗi thường gặp bao gồm: thay đổi cổng lắng nghe (Port) nhưng lại quên mở cổng đó trên tường lửa, chỉ định máy chủ lắng nghe trên một địa chỉ IP cụ thể (ListenAddress) không chính xác, hoặc sử dụng các chỉ thị như AllowUsers, DenyUsers để giới hạn quyền truy cập nhưng lại vô tình chặn chính tài khoản của bạn. Hơn nữa, một lỗi cú pháp đơn giản như thiếu dấu cách, sai ký tự cũng có thể khiến toàn bộ dịch vụ sshd không thể khởi động được. Vì vậy, việc kiểm tra kỹ lưỡng file cấu hình này là cực kỳ cần thiết.

Hình minh họa

Kiểm tra trạng thái dịch vụ SSH trên máy chủ Linux

Sau khi đã nắm được các nguyên nhân lý thuyết, bước tiếp theo là bắt tay vào kiểm tra thực tế trên máy chủ của bạn. Việc xác định xem dịch vụ SSH có đang hoạt động hay không là ưu tiên hàng đầu. May mắn là Linux cung cấp các công cụ dòng lệnh rất mạnh mẽ và đơn giản để thực hiện việc này.

Lệnh kiểm tra trạng thái dịch vụ SSH thường dùng

Hầu hết các bản phân phối Linux hiện đại như Ubuntu, CentOS, và Debian đều sử dụng systemd làm trình quản lý hệ thống và dịch vụ. Để kiểm tra trạng thái của dịch vụ SSH, bạn chỉ cần mở terminal của máy chủ (có thể thông qua console của nhà cung cấp VPS/Cloud) và chạy lệnh sau:

systemctl status sshd

Nếu bạn đang sử dụng các phiên bản cũ hơn, bạn có thể dùng lệnh:

service ssh status

Kết quả trả về sẽ cho bạn biết chính xác dịch vụ đang ở trạng thái nào. Nếu bạn thấy dòng chữ active (running) màu xanh lá, điều đó có nghĩa là dịch vụ SSH đang hoạt động bình thường và nguyên nhân gây lỗi nằm ở nơi khác. Ngược lại, nếu kết quả là inactive (dead) hoặc failed, bạn đã tìm ra vấn đề: dịch vụ SSH không chạy.

Hình minh họa

Cách khởi động hoặc khởi động lại dịch vụ SSH

Nếu bạn xác định được dịch vụ SSH đang không hoạt động, việc khắc phục rất đơn giản. Bạn có thể sử dụng các lệnh sau để khởi động nó:

Để khởi động dịch vụ, hãy dùng lệnh:

sudo systemctl start sshd

Nếu dịch vụ đang chạy nhưng bạn nghi ngờ nó bị “treo” hoặc muốn áp dụng cấu hình mới, bạn có thể khởi động lại bằng lệnh:

sudo systemctl restart sshd

Sau khi chạy lệnh, bạn nên kiểm tra lại trạng thái bằng systemctl status sshd để chắc chắn rằng dịch vụ đã chuyển sang trạng thái active (running). Để đảm bảo dịch vụ SSH luôn tự động khởi động cùng hệ thống mỗi khi máy chủ reboot, bạn hãy chạy thêm lệnh sau:

sudo systemctl enable sshd

Lệnh này sẽ tạo một liên kết simbol để sshd được systemd quản lý và kích hoạt lúc khởi động. Đây là một bước đơn giản nhưng cực kỳ hiệu quả để phòng tránh lỗi trong tương lai.

Hình minh họa

Cấu hình tường lửa và các quyền truy cập kết nối SSH

Nếu bạn đã kiểm tra và chắc chắn rằng dịch vụ SSH đang chạy bình thường, “nghi phạm” tiếp theo chính là tường lửa. Tường lửa là một lớp bảo vệ quan trọng, nhưng nếu cấu hình không đúng, nó có thể vô tình chặn chính những kết nối hợp lệ của bạn. Việc kiểm tra các quy tắc tường lửa và quyền truy cập là bước không thể bỏ qua.

Kiểm tra và mở cổng SSH trên tường lửa (firewalld, ufw)

Trên Linux, hai công cụ quản lý tường lửa phổ biến nhất là UFW (Uncomplicated Firewall) trên các hệ thống dựa trên Debian/Ubuntu và Firewalld trên các hệ thống dựa trên RHEL/CentOS.

Đối với UFW (Ubuntu/Debian):

Trước tiên, hãy kiểm tra trạng thái của UFW:

sudo ufw status

Nếu tường lửa đang hoạt động, bạn sẽ thấy danh sách các quy tắc. Hãy tìm xem cổng 22 (hoặc cổng SSH tùy chỉnh của bạn) có trong danh sách ALLOW hay không. Nếu không, bạn có thể mở cổng bằng lệnh:

sudo ufw allow ssh

Hoặc nếu bạn dùng cổng tùy chỉnh, ví dụ 2222:

sudo ufw allow 2222/tcp

Sau đó, hãy kích hoạt lại UFW nếu nó chưa chạy: sudo ufw enable.

Đối với Firewalld (CentOS/RHEL):

Kiểm tra trạng thái của Firewalld:

sudo firewall-cmd --state

Xem các dịch vụ và cổng đang được cho phép:

sudo firewall-cmd --list-all

Nếu bạn không thấy ssh trong danh sách services, hãy thêm nó vào:

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

Lệnh --permanent đảm bảo quy tắc được giữ lại sau khi khởi động lại, và reload để áp dụng thay đổi ngay lập tức.

Hình minh họa

Kiểm tra file hosts.allow và hosts.deny

Ngoài các công cụ tường lửa hiện đại, Linux còn có một cơ chế kiểm soát truy cập cũ hơn nhưng vẫn rất mạnh mẽ thông qua hai file: /etc/hosts.allow/etc/hosts.deny. Các file này hoạt động dựa trên TCP Wrappers, cho phép hoặc từ chối kết nối dựa trên địa chỉ IP nguồn.

  • /etc/hosts.allow: Chứa danh sách các IP hoặc dải IP được phép kết nối đến các dịch vụ.
  • /etc/hosts.deny: Chứa danh sách các IP bị từ chối.

Quy trình kiểm tra rất đơn giản:

  1. Kiểm tra hosts.deny trước: Mở file sudo nano /etc/hosts.deny và tìm xem có dòng nào như sshd: ALL không. Dòng này có nghĩa là mọi kết nối SSH đều bị chặn.
  2. Kiểm tra hosts.allow: Mở file sudo nano /etc/hosts.allow. Nếu file hosts.denysshd: ALL, thì file này phải có một quy tắc cho phép IP của bạn, ví dụ: sshd: 1.2.3.4 (thay bằng IP của bạn).

Nếu bạn không chắc chắn, cách an toàn nhất là làm trống (hoặc tạm thời đổi tên) cả hai file này và thử kết nối lại. Nếu thành công, bạn đã biết nguyên nhân nằm ở đây và có thể cấu hình lại cho chính xác.

Cách xử lý và khắc phục lỗi chi tiết từng bước

Sau khi đã đi qua các bước kiểm tra cơ bản, phần này sẽ tập trung vào các quy trình xử lý và sửa lỗi chi tiết hơn, đặc biệt khi các giải pháp đơn giản ban đầu không mang lại kết quả. Chúng ta sẽ đi sâu vào việc phân tích log và điều chỉnh cấu hình một cách bài bản.

Hình minh họa

Khắc phục lỗi dịch vụ không khởi động được

Trong trường hợp bạn đã cố gắng khởi động dịch vụ SSH bằng systemctl start sshd nhưng nó vẫn báo lỗi (failed), bạn cần phải điều tra sâu hơn để tìm ra nguyên nhân gốc rễ.

  1. Kiểm tra Log hệ thống: Đây là bước quan trọng nhất. Log sẽ cho bạn biết chính xác tại sao dịch vụ không thể khởi động. Sử dụng lệnh sau để xem các log gần nhất liên quan đến sshd:
    journalctl -u sshd -n 50 --no-pager
    Lệnh này sẽ hiển thị 50 dòng log cuối cùng. Hãy tìm các dòng có chữ “error” hoặc “fatal”. Thông thường, lỗi sẽ liên quan đến cú pháp sai trong file cấu hình (Bad configuration option, Missing privilege separation directory) hoặc vấn đề về quyền truy cập file.
  2. Kiểm tra cú pháp file cấu hình: Trước khi khởi động lại dịch vụ, hãy luôn kiểm tra cú pháp của file sshd_config bằng lệnh:
    sudo sshd -t
    Nếu file cấu hình hợp lệ, lệnh sẽ không trả về gì. Nếu có lỗi, nó sẽ chỉ ra chính xác dòng và vấn đề bạn cần sửa.
  3. Cài đặt lại package SSH: Nếu mọi thứ dường như đều đúng nhưng dịch vụ vẫn không chạy, có thể các file của gói OpenSSH-server đã bị hỏng. Bạn có thể cài đặt lại nó một cách an toàn.
    • Trên Ubuntu/Debian: sudo apt-get install --reinstall openssh-server
    • Trên CentOS/RHEL: sudo dnf reinstall openssh-server

Thực hiện các bước trên một cách tuần tự sẽ giúp bạn cô lập và giải quyết hầu hết các vấn đề khiến dịch vụ SSH không thể khởi động.

Điều chỉnh cấu hình và kiểm tra lại kết nối

Sau khi đã xác định và sửa lỗi trong file sshd_config, bạn cần áp dụng các thay đổi và kiểm tra lại kết nối một cách cẩn thận. Quy trình chuẩn để tránh tự khóa mình khỏi máy chủ là:

  1. Sao lưu file cấu hình: Trước khi chỉnh sửa bất cứ điều gì, hãy tạo một bản sao lưu. Đây là quy tắc vàng! sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
  2. Chỉnh sửa file: Sử dụng một trình soạn thảo văn bản như nano hoặc vim để mở và chỉnh sửa file: sudo nano /etc/ssh/sshd_config. Hãy chắc chắn rằng các thiết lập quan trọng như Port, ListenAddress, PermitRootLogin được đặt đúng theo ý muốn của bạn.
  3. Kiểm tra cú pháp: Như đã đề cập ở trên, luôn dùng sudo sshd -t để xác nhận không có lỗi cú pháp.
  4. Tải lại dịch vụ: Thay vì restart, hãy dùng reload để áp dụng cấu hình mới mà không làm gián đoạn các kết nối hiện có (nếu có).
    sudo systemctl reload sshd
    Nếu reload không được hỗ trợ hoặc bạn đã thay đổi cổng, bạn sẽ cần dùng restart.
  5. Kiểm tra kết nối: Mở một cửa sổ terminal mới trên máy của bạn và thử kết nối lại SSH. Đừng đóng cửa sổ terminal hiện tại (nếu bạn đang truy cập qua console) cho đến khi bạn chắc chắn kết nối mới đã thành công. Điều này đảm bảo bạn vẫn có quyền truy cập để sửa lỗi nếu cấu hình mới gây ra vấn đề.

Hình minh họa

Mẹo và lưu ý giúp tránh lỗi kết nối SSH trong tương lai

Khắc phục sự cố là cần thiết, nhưng phòng bệnh hơn chữa bệnh. Việc áp dụng các thói quen tốt và biện pháp phòng ngừa sẽ giúp bạn giảm thiểu đáng kể khả năng gặp lại lỗi “Connection Refused” và giữ cho hệ thống luôn ổn định, an toàn.

  • Luôn kiểm tra trạng thái dịch vụ sau khi cấu hình: Sau mỗi lần chỉnh sửa file sshd_config hoặc thay đổi quy tắc tường lửa, hãy tập thói quen chạy lệnh systemctl status sshdufw status (hoặc tương đương) để đảm bảo mọi thứ vẫn hoạt động như mong đợi.
  • Sao lưu file sshd_config trước khi chỉnh sửa: Đây là một lưu ý cực kỳ quan trọng. Một bản sao lưu đơn giản với lệnh cp có thể cứu bạn khỏi nhiều giờ đau đầu nếu bạn vô tình gây ra lỗi cú pháp nghiêm trọng.
  • Cài đặt và giám sát tường lửa chặt chẽ, hạn chế IP truy cập: Thay vì mở cổng SSH cho toàn bộ thế giới (ALLOW FROM any), hãy chỉ cho phép kết nối từ những địa chỉ IP tĩnh mà bạn tin tưởng. Điều này không chỉ giúp tránh lỗi mà còn là một biện pháp bảo mật thiết yếu.
  • Sử dụng key SSH thay vì mật khẩu để tăng bảo mật: Xác thực bằng cặp khóa công khai/riêng tư (SSH keys) an toàn và tiện lợi hơn nhiều so với mật khẩu. Nó giúp chống lại các cuộc tấn công dò mật khẩu (brute-force) và loại bỏ nguy cơ lỗi do nhập sai mật khẩu.
  • Thường xuyên cập nhật hệ điều hành và phần mềm SSH: Các bản cập nhật không chỉ mang đến tính năng mới mà còn vá các lỗ hổng bảo mật và sửa lỗi đã biết. Việc chạy sudo apt update && sudo apt upgrade định kỳ sẽ giữ cho máy chủ của bạn luôn ở trạng thái tốt nhất.

Hình minh họa

Các vấn đề thường gặp và cách khắc phục

Bên cạnh lỗi “Connection Refused” kinh điển, có một vài sự cố liên quan khác mà bạn cũng có thể gặp phải. Hiểu rõ sự khác biệt giữa chúng sẽ giúp bạn chẩn đoán vấn đề nhanh chóng và chính xác hơn.

Lỗi “Connection timed out” thay vì “Connection refused”

Đây là một lỗi hoàn toàn khác và chỉ ra một vấn đề khác.

  • “Connection refused”: Máy chủ đã nhận được yêu cầu của bạn nhưng đã chủ động từ chối. Điều này có nghĩa là có một tiến trình (như tường lửa) hoặc không có tiến trình nào (dịch vụ SSH không chạy) ở cổng đó để trả lời. Vấn đề nằm ở phía máy chủ.
  • “Connection timed out”: Yêu cầu của bạn đã được gửi đi nhưng không nhận được bất kỳ phản hồi nào trong một khoảng thời gian nhất định. Gói tin của bạn có thể đã bị “thả” hoặc “lạc” ở đâu đó trên đường đi.

Nguyên nhân của “Timed out” thường là:

  • Tường lửa ở cấp độ mạng (của nhà cung cấp hosting, công ty) đang chặn kết nối trước khi nó đến được máy chủ.
  • Bạn nhập sai địa chỉ IP của máy chủ.
  • Có sự cố về định tuyến mạng giữa máy của bạn và máy chủ.
  • Máy chủ đang tắt hoặc không có kết nối mạng.

Cách xử lý là kiểm tra lại địa chỉ IP, dùng lệnh ping hoặc traceroute để kiểm tra kết nối mạng, và liên hệ với nhà cung cấp dịch vụ để kiểm tra các quy tắc tường lửa mạng.

Quyền truy cập bị từ chối do lỗi phân quyền file hoặc thư mục

Lỗi này thường xảy ra khi bạn sử dụng xác thực bằng khóa SSH. Dịch vụ SSH trên Linux rất nghiêm ngặt về quyền sở hữu và quyền truy cập của các file và thư mục liên quan đến khóa để đảm bảo an toàn. Nếu các quyền này bị sai, kết nối của bạn sẽ bị từ chối ngay cả khi khóa của bạn hoàn toàn hợp lệ.

Các quyền truy cập chuẩn cần được thiết lập như sau:

  • Thư mục .ssh trong thư mục chính của người dùng phải có quyền 700 (chỉ chủ sở hữu mới có quyền đọc, ghi, và thực thi).
  • File authorized_keys bên trong thư mục .ssh phải có quyền 600 (chỉ chủ sở hữu mới có quyền đọc và ghi).

Bạn có thể kiểm tra và sửa lỗi phân quyền bằng các lệnh sau trên máy chủ:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Ngoài ra, hãy chắc chắn rằng cả thư mục .ssh và file authorized_keys đều thuộc sở hữu của người dùng mà bạn đang cố gắng đăng nhập. Bạn có thể dùng lệnh chown -R user:user ~/.ssh để đặt lại quyền sở hữu (thay user bằng tên người dùng của bạn).

Hình minh họa

Kết luận

Lỗi kết nối SSH bị từ chối (“Connection Refused”) trên Linux tuy phổ biến nhưng hoàn toàn có thể được khắc phục một cách có hệ thống. Nguyên nhân chủ yếu thường xoay quanh ba điểm chính: dịch vụ sshd không hoạt động, tường lửa chặn cổng kết nối, hoặc file cấu hình sshd_config bị sai sót. Bằng cách tiếp cận vấn đề một cách tuần tự, bắt đầu từ việc kiểm tra trạng thái dịch vụ, sau đó đến quy tắc tường lửa và cuối cùng là các file cấu hình, bạn có thể nhanh chóng xác định và giải quyết tận gốc sự cố.

Để duy trì một hệ thống ổn định và an toàn, AZWEB khuyến khích bạn áp dụng các mẹo phòng ngừa đã được đề cập, như luôn sao lưu file cấu hình, sử dụng khóa SSH thay cho mật khẩu và thường xuyên cập nhật hệ thống. Những thói quen tốt này không chỉ giúp bạn tránh được lỗi “Connection Refused” mà còn nâng cao đáng kể tính bảo mật cho máy chủ của mình. Đừng ngần ngại thử nghiệm ngay các giải pháp trong bài viết và theo dõi hệ thống liên tục để đảm bảo kết nối luôn thông suốt. Nếu bạn muốn tìm hiểu sâu hơn, hãy khám phá các bài viết hướng dẫn nâng cao về bảo mật SSH và quản trị Linux từ AZWEB.

Đánh giá