Fast Byte - Thuê VPS Giá Rẻ
Hướng dẫn chung

Cách Kiểm Tra Port Linux Đang Lắng Nghe Dùng ss, netstat & lsof Dễ Dàng

Kiểm tra port đang lắng nghe trong Linux là kỹ năng quản trị bắt buộc khi bạn gặp sự cố xung đột cổng mạng, ứng dụng web không khởi động được hoặc nghi ngờ dịch vụ lạ đang chạy ngầm trên máy chủ. Thay vì loay hoay đoán lỗi trong vô vọng, việc nắm vững […]

Ảnh đại diện Thanh Lam NguyễnThanh Lam Nguyễn16 phút đọc

Kiểm tra port đang lắng nghe trong Linux là kỹ năng quản trị bắt buộc khi bạn gặp sự cố xung đột cổng mạng, ứng dụng web không khởi động được hoặc nghi ngờ dịch vụ lạ đang chạy ngầm trên máy chủ. Thay vì loay hoay đoán lỗi trong vô vọng, việc nắm vững các lệnh chẩn đoán socket sẽ giúp bạn khoanh vùng tiến trình chính xác chỉ sau vài giây. 

Bài viết này sẽ hướng dẫn bạn cách sử dụng ba công cụ phổ biến trong hệ điều hành Linux gồm ss, netstat và lsof để truy vấn danh sách dịch vụ cùng cổng mạng đang mở. Để thuận tiện cho việc thao tác dòng lệnh, bạn cũng có thể tham khảo thêm các câu lệnh Linux cơ bản hay dùng trên máy chủ.

1. Bản Chất Cổng Lắng Nghe (Listening Port) Và Cơ Chế Hoạt Động

Một cổng lắng nghe (listening port) là điểm cuối giao tiếp được hệ điều hành cấp phát cho ứng dụng nhằm chờ đợi các yêu cầu kết nối từ mạng nội bộ hoặc Internet. Điểm cuối này luôn gắn chặt với số hiệu cổng, giao thức truyền tải và địa chỉ IP cụ thể mà tiến trình liên kết.

  • Định danh kết nối: Mỗi listening port được xác định bởi 3 yếu tố: số cổng (port number), địa chỉ IP liên kết và loại giao thức truyền thông như TCP hoặc UDP (tìm hiểu thêm về mô hình giao thức TCP/IP để nắm rõ cách dữ liệu đóng gói ở tầng mạng).
  • Ý nghĩa địa chỉ IP lắng nghe: Dịch vụ chỉ liên kết tới địa chỉ localhost (127.0.0.1) sẽ chỉ cho phép các tiến trình nội bộ trên cùng máy chủ giao tiếp. Ngược lại, khi liên kết vào 0.0.0.0 (IPv4) hoặc [::] (IPv6), ứng dụng sẽ tiếp nhận kết nối qua mọi giao diện mạng của máy chủ.
  • Trạng thái socket và khả năng tiếp cận thực tế: Việc cổng hiển thị listening cục bộ không đồng nghĩa máy khách từ xa truy cập được. Tường lửa và bộ định tuyến vẫn có quyền chặn gói tin; muốn máy khách bên ngoài kết nối được, bạn cần chủ động mở port trên máy chủ thông qua các quy tắc firewall tương ứng.
  • Quy tắc độc quyền liên kết cổng: Thông thường, hai tiến trình riêng biệt không thể cùng lúc bind độc lập vào cùng một IP, giao thức và cổng. Ví dụ, nếu Apache đang chiếm cổng 80/443, việc khởi động thêm phần mềm máy chủ web Nginx sẽ lập tức phát sinh lỗi vì cổng dịch vụ đã bị chiếm hữu.

Thuê VPS giá rẻ

CPU Intel Gold, SSD NVMe U.2, giá từ 50K/tháng

Hạ Tầng Riêng Biệt, Quản Trị Cổng Mạng Toàn Quyền

Khi chạy nhiều ứng dụng như Web Server, Database hay bot tự động, việc kiểm soát xung đột port và bảo mật kết nối là điều cốt lõi. Dịch vụ VPS giá rẻ tại Fast Byte cấp quyền root tuyệt đối, tài nguyên độc lập giúp bạn tự do tùy biến mở, chặn hoặc đổi port theo chuẩn an toàn kỹ thuật.

Tham khảo VPS giá rẻ

2. Kiểm Tra Cổng Đang Lắng Nghe Nhanh Chóng Bằng Lệnh ss

ss (Socket Statistics) là giải pháp hiện đại được thiết kế để thay thế hoàn toàn công cụ tiền nhiệm netstat. Lệnh này giao tiếp trực tiếp với không gian nhân Linux, mang lại tốc độ hiển thị cực nhanh và có sẵn trên hầu hết các bản phân phối Linux hiện đại.

Kiểm Tra Cổng Đang Lắng Nghe Bằng Lệnh ss

Để quét nhanh danh sách toàn bộ các cổng TCP và UDP đang mở ở chế độ lắng nghe, bạn hãy nhập câu lệnh sau trên terminal:

sudo ss -tunlp

Ý nghĩa chi tiết của các cờ lệnh:

  • -t: Chỉ hiển thị các socket thuộc giao thức TCP.
  • -u: Chỉ hiển thị các socket thuộc giao thức UDP.
  • -n: Hiển thị địa chỉ IP và số hiệu cổng ở dạng số nguyên, không phân giải tên miền hoặc tên dịch vụ.
  • -l: Lọc và chỉ xuất các socket đang ở trạng thái lắng nghe (listening).
  • -p: Xuất tên chương trình cùng mã tiến trình (PID) đang dùng socket. Bạn cần chạy lệnh dưới quyền quản trị root hoặc thông qua sudo để đọc được thông tin tiến trình của người dùng khác.

Dưới đây là đầu ra thực tế thu được trên máy chủ Ubuntu chạy SSH, Apache và MySQL:

Kiểm Tra Cổng Đang Lắng Nghe Nhanh Chóng Bằng Lệnh ss
Kiểm Tra Cổng Đang Lắng Nghe Nhanh Chóng Bằng Lệnh ss

Phân tích các trường dữ liệu quan trọng trong kết quả

  • Netid: Hiển thị loại giao thức mạng của socket (TCP hoặc UDP).
  • State: Trạng thái kết nối. Cột này hiển thị LISTEN đối với các cổng TCP đang chờ kết nối. Với giao thức UDP vốn dĩ không duy trì trạng thái phiên (connectionless), trạng thái socket sẵn sàng nhận gói tin sẽ hiển thị là UNCONN.
  • Local Address:Port: Cột này phản ánh địa chỉ và cổng mà dịch vụ tiếp nhận. Ví dụ: MySQL chỉ bind vào 127.0.0.1:3306 nên chỉ máy cục bộ mới truy vấn được; cổng 22 của SSH bind vào 0.0.0.0:22 và [::]:22 trên toàn bộ card mạng; Apache lắng nghe tại *:80 bằng cơ chế dual-stack (nhận cả IPv4 và IPv6); còn hậu tố như %lo ám chỉ socket chỉ giới hạn trong card mạng loopback.
  • Process: Cho biết tên chương trình, PID và bộ mô tả tệp (fd). Ở cổng 22, ta thấy có cả sshd lẫn systemd với PID 1. Đây là cơ chế socket activation của systemd trên các bản Ubuntu mới, khi systemd mở socket trước rồi bàn giao cho daemon SSH, không phải lỗi tranh chấp. Để giảm nguy cơ bị quét cổng tự động, nhiều kỹ trị viên thường thực hiện thay đổi cổng SSH mặc định sang một dải số ngẫu nhiên.

Bộ lọc chính xác trên lệnh ss

Nếu muốn tìm cổng cụ thể như cổng 22, cách đơn giản là chuyển tiếp qua grep:

sudo ss -tnlp | grep :22

Tuy nhiên, lệnh ss có bộ lọc cú pháp riêng biệt cho hiệu suất cao hơn và không bị bắt nhầm các chuỗi chứa số 22 (chẳng hạn như port 2222):

sudo ss -tlnp sport = :22

Ngoài ra, khi cần giám sát các kết nối đang duy trì hoạt động trao đổi dữ liệu, bạn lọc theo trạng thái ESTABLISHED:

ss -tn state established

Kết quả trả về sẽ chỉ hiển thị các phiên đang hoạt động (ví dụ kết nối SSH từ IP 10.0.2.2), đồng thời cột State sẽ tự động ẩn đi vì mọi kết quả đều chung một trạng thái.

3. Rà Soát Cổng Kết Nối Bằng Tiện Ích Truyền Thống netstat

netstat là công cụ mạng dòng lệnh cổ điển đã đồng hành cùng Linux trong nhiều thập kỷ. Mặc dù hiện tại đã ngừng phát triển và bị coi là lỗi thời, netstat vẫn hiện diện phổ biến trên các hệ thống cũ hoặc trong thói quen xử lý của nhiều quản trị viên kỳ cựu.

Vì không còn đi kèm mặc định trên các bản phân phối Linux mới, bạn cần cài đặt gói net-tools trước khi dùng:

# Với Ubuntu, Debian và các bản phân phối liên quan:
sudo apt install net-tools

# Với RHEL, CentOS Stream, Fedora:
sudo dnf install net-tools
cài đặt gói net-tools trước khi dùng
Cài đặt gói net-tools trước khi dùng

Cú pháp kiểm tra tất cả cổng TCP/UDP đang lắng nghe với netstat hoàn toàn tương tự như ss:

sudo netstat -tunlp

Bảng kết quả trả về từ lệnh netstat:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      3671/mysqld
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      499/systemd-resolve
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      3671/mysqld
tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN      499/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1/systemd
tcp6       0      0 :::22                   :::*                    LISTEN      1/systemd
tcp6       0      0 :::80                   :::*                    LISTEN      4370/apache2
udp        0      0 127.0.0.54:53           0.0.0.0:*                           499/systemd-resolve
udp        0      0 127.0.0.53:53           0.0.0.0:*                           499/systemd-resolve
udp        0      0 10.0.2.15:68            0.0.0.0:*                           988/systemd-network
udp        0      0 127.0.0.1:323           0.0.0.0:*                           1208/chronyd
udp6       0      0 ::1:323                 :::*                                1208/chronyd

So sánh sự khác nhau giữa đầu ra của netstat và ss

  • Giới hạn hiển thị tiến trình: netstat chỉ hiển thị duy nhất một tên tiến trình trên mỗi socket. Cổng 22 chỉ xuất hiện 1/systemd mà hoàn toàn không thể hiện sshd; dịch vụ Apache cũng chỉ hiển thị một tiến trình con đại diện thay vì toàn bộ các worker đang hoạt động.
  • Cột State ở giao thức UDP: netstat để trống cột trạng thái đối với các dòng socket UDP, trong khi ss định nghĩa rõ ràng trạng thái UNCONN.
  • Nhận diện socket dual-stack: Cổng 80 của Apache chỉ xuất hiện dưới dạng tcp6 với địa chỉ :::80, gây hiểu nhầm rằng cổng này không tiếp nhận IPv4 (mặc dù thực tế socket này vẫn xử lý lưu lượng IPv4 bình thường).

Khi cần lọc một cổng cụ thể với netstat:

sudo netstat -tnlp | grep :22

Nếu lệnh không xuất bất kỳ kết quả nào, nghĩa là hệ thống không có ứng dụng nào lắng nghe trên cổng 22. Để kiểm tra xem cổng có thông từ bên ngoài mạng hay không, bạn nên dùng netcat (nc) từ một máy chủ từ xa.

4. Truy Vết Tiến Trình Chiếm Giữ Socket Bằng Lệnh lsof

Trong hệ điều hành Linux, mọi tài nguyên kết nối đều được xem như tệp tin (Everything is a file), và socket mạng cũng không phải là ngoại lệ. Lệnh lsof (Liệt kê các tệp đang mở) là công cụ cực kỳ lợi hại giúp bạn xác định chuẩn xác ứng dụng và tài khoản nào đang giữ quyền kiểm soát cổng mạng.

Truy Vết Tiến Trình Chiếm Giữ Socket Bằng Lệnh lsof

Cài đặt lsof nếu máy chủ chưa có sẵn:

# Cho hệ điều hành Debian / Ubuntu:
sudo apt install lsof

# Cho hệ điều hành RHEL / CentOS:
sudo dnf install lsof

Để truy xuất danh sách toàn bộ các cổng TCP đang lắng nghe:

sudo lsof -nP -iTCP -sTCP:LISTEN

Các tham số cần lưu ý:

  • -n: Ngăn việc phân giải ngược tên miền (IP sang hostname) để tăng tốc độ truy vấn.
  • -P: Ngăn việc chuyển đổi số hiệu cổng thành tên dịch vụ quen thuộc (giữ nguyên số 80 thay vì chữ http).
  • -iTCP -sTCP:LISTEN: Bộ lọc chuyên biệt chỉ hiển thị các tệp mạng TCP đang duy trì trạng thái LISTEN.

Đầu ra chi tiết của lệnh lsof:

COMMAND    PID            USER  FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd      1            root 358u  IPv4  18858      0t0  TCP *:22 (LISTEN)
systemd      1            root 359u  IPv6  18860      0t0  TCP *:22 (LISTEN)
systemd-r  499 systemd-resolve  17u  IPv4  10129      0t0  TCP 127.0.0.53:53 (LISTEN)
systemd-r  499 systemd-resolve  19u  IPv4  10131      0t0  TCP 127.0.0.54:53 (LISTEN)
sshd      1309            root   3u  IPv4  18858      0t0  TCP *:22 (LISTEN)
sshd      1309            root   4u  IPv6  18860      0t0  TCP *:22 (LISTEN)
mysqld    3671           mysql  19u  IPv4  27468      0t0  TCP 127.0.0.1:33060 (LISTEN)
mysqld    3671           mysql  22u  IPv4  31568      0t0  TCP 127.0.0.1:3306 (LISTEN)
apache2   4370            root   4u  IPv6  32272      0t0  TCP *:80 (LISTEN)
apache2   4386        www-data   4u  IPv6  32272      0t0  TCP *:80 (LISTEN)
apache2   4387        www-data   4u  IPv6  32272      0t0  TCP *:80 (LISTEN)

Các cột thông tin chính bao gồm:

  • COMMAND, PID, USER: Tên tiến trình (lưu ý lsof tự động rút ngắn các tên dài như systemd-resolve thành systemd-r), mã định danh PID và quyền người dùng thực thi. Cột USER cho thấy tiến trình cha của Apache chạy quyền root, trong khi các tiến trình worker xử lý web chạy dưới quyền www-data.
  • NAME: Địa chỉ IP, số cổng và trạng thái socket. Ký hiệu dấu sao (*) thể hiện ứng dụng lắng nghe trên toàn bộ giao diện mạng.

Các mẹo lọc hữu ích với lsof

Để xem mọi tiến trình đang can thiệp vào một cổng cụ thể (ví dụ port 80):

sudo lsof -i :80

Lưu ý: Khi thiếu cờ -P, tên cổng 80 sẽ tự động dịch sang http. Cú pháp -i :80 sẽ khớp cả kết nối TCP/UDP ở mọi trạng thái kết nối chứ không chỉ riêng trạng thái lắng nghe.

Để chỉ lọc đúng tiến trình đang lắng nghe trên cổng 3306 (MySQL):

sudo lsof -nP -iTCP:3306 -sTCP:LISTEN

Nếu bạn muốn tìm dịch vụ chạy giao thức UDP qua lsof, hãy bỏ qua bộ lọc -s vì UDP không có trạng thái LISTEN:

sudo lsof -nP -iUDP

5. Những Sai Lầm Phổ Biến Khi Rà Soát Cổng Mạng Trên Linux

Trong quá trình xử lý sự cố mạng thực tế, người quản trị thường gặp phải những thiếu sót phổ biến khiến kết quả đầu ra bị sai lệch hoặc thiếu thông tin quan trọng:

  • Không sử dụng quyền sudo: Thiếu quyền root đồng nghĩa với việc cờ -p không thể truy xuất thông tin tiến trình của người dùng khác. Kết quả là cổng mạng vẫn hiện lên nhưng cột tên chương trình và PID hoàn toàn trống trơn. Với lsof, chạy với tài khoản thường chỉ hiển thị các tiến trình thuộc quyền cá nhân bạn.
  • Bỏ quên cờ -l (lắng nghe): Nếu không có tham số -l, cả ss và netstat sẽ in ra toàn bộ kết nối hiện hữu của hệ thống (bao gồm hàng trăm kết nối ESTABLISHED, TIME_WAIT…), gây rối loạn và che lấp các cổng dịch vụ bạn đang cần kiểm tra.
  • Cố tìm socket UDP bằng từ khóa LISTEN: UDP là giao thức connectionless nên socket UDP hiển thị là UNCONN trên ss và để trống trên netstat. Nếu bạn dùng lệnh dạng grep LISTEN, toàn bộ socket UDP (chẳng hạn như dịch vụ đồng bộ thời gian chronyd cổng 323) sẽ bị loại bỏ hoàn toàn khỏi bảng kết quả.
  • Quên dấu hai chấm khi grep số hiệu cổng: Cú pháp tìm kiếm luôn phải có dấu hai chấm đứng trước số cổng (ví dụ: grep :22). Nếu bạn chỉ gõ grep 22, hệ thống sẽ lọc cả những dòng chứa PID, cổng cục bộ ngẫu nhiên hoặc các số liệu thống kê vô tình chứa số 22.
  • Bỏ sót tường lửa hệ điều hành: Khi dịch vụ đã lắng nghe nhưng bên ngoài không thể kết nối, hãy kiểm tra lại cấu hình tường lửa; bạn có thể tham khảo hướng dẫn thiết lập tường lửa UFW trên Ubuntu để đảm bảo quy tắc cho phép lưu lượng truy cập đã được kích hoạt chính xác.

6. Bảng Tra Cứu Nhanh Cheat Sheet Lệnh Kiểm Tra Port

Bảng tổng hợp dưới đây giúp bạn nhanh chóng tra cứu câu lệnh chính xác cho từng mục đích kiểm tra cụ thể mà không cần phải ghi nhớ toàn bộ tham số phức tạp:

Nhu Cầu Kiểm Tra Cụ Thể Lệnh Linux Tương Ứng Cần Thực Thi
Liệt kê tất cả các listening port (khuyên dùng) sudo ss -tunlp
Chỉ liệt kê các port UDP đang lắng nghe sudo ss -unlp
Liệt kê tất cả listening port bằng netstat sudo netstat -tunlp
Lọc tiến trình theo cổng bằng bộ lọc ss sudo ss -tlnp sport = :80
Lọc tiến trình theo cổng bằng ss + grep sudo ss -tnlp | grep :80
Tìm tất cả tiến trình liên quan cổng 80 qua lsof sudo lsof -i :80
Liệt kê cổng TCP đang lắng nghe bằng lsof sudo lsof -nP -iTCP -sTCP:LISTEN
Tìm tiến trình chiếm cổng 3306 qua lsof sudo lsof -nP -iTCP:3306 -sTCP:LISTEN
Hiển thị các kết nối đang duy trì (established) ss -tn state established
Hiển thị toàn bộ kết nối mạng kèm tiến trình sudo ss -tunp

Các thao tác trên đều là những cú pháp dòng lệnh quen thuộc trong bộ tổng hợp lệnh Linux cơ bản mà mọi sysadmin đều nên ghi nhớ.

7. Câu Hỏi Thường Gặp Về Quản Trị Cổng Mạng Linux (FAQ)

Sự khác nhau cơ bản giữa lệnh ss và netstat là gì?

Cả hai công cụ đều xuất thông tin socket mạng. Tuy nhiên, ss là công cụ hiện đại, truy xuất trực tiếp qua netlink kernel nên tốc độ nhanh hơn vượt trội, phân tích trạng thái TCP sâu hơn và được cài mặc định. netstat đọc dữ liệu từ tệp /proc, tốc độ chậm khi có nhiều kết nối và hiện đã bị xem là lỗi thời.

Vì sao cột tiến trình (Process/PID) bị trống khi chạy lệnh?

Hệ thống Linux ngăn chặn người dùng thông thường xem thông tin tiến trình của tài khoản khác nhằm đảm bảo an toàn. Bạn bắt buộc phải thêm sudo vào trước lệnh hoặc đăng nhập bằng tài khoản root thì mới quan sát được đầy đủ dữ liệu tiến trình sở hữu cổng.

Làm thế nào để kiểm tra một cổng có đang mở từ bên ngoài Internet?

Các lệnh trong bài viết chỉ phản ánh trạng thái lắng nghe nội bộ máy chủ. Để kiểm tra tính khả dụng từ một máy tính từ xa, bạn nên sử dụng lệnh nc -zv <IP_máy_chủ> <port> hoặc quét bằng phần mềm nmap để xác định xem cổng có bị tường lửa chặn hay không.

Hai dịch vụ có thể cùng lắng nghe trên một cổng duy nhất không?

Về cơ bản là không thể; hai dịch vụ độc lập không thể bind đồng thời vào cùng một cổng, IP và giao thức. Trường hợp ngoại lệ là khi các ứng dụng cùng sử dụng cờ SO_REUSEPORT của nhân Linux để chia tải kết nối, hoặc cơ chế socket activation của systemd tiếp nhận socket trước rồi bàn giao lại cho dịch vụ như sshd.

Tổng Kết Kỹ Năng Kiểm Tra Listening Ports

Nắm vững Cách Kiểm Tra Port Đang Lắng Nghe Trong Linux Chi Tiết: Sử Dụng Lệnh ss, netstat và lsof giúp bạn làm chủ hoàn toàn các kết nối mạng, nhanh chóng khắc phục lỗi xung đột ứng dụng và chủ động bảo vệ an ninh máy chủ. Trong vận hành thực tế, ss luôn là ưu tiên số một cho tốc độ, lsof hỗ trợ đắc lực khi cần bóc tách file descriptor và tiến trình, còn netstat là phương án dự phòng trên hệ thống cũ. Hãy ghi nhớ luôn chạy lệnh với quyền sudo và kiểm tra kỹ quy tắc tường lửa mỗi khi triển khai dịch vụ mới.

Cần một VPS giá rẻ để bắt đầu?

Chọn cấu hình vừa đủ nhu cầu, ưu tiên chi phí dễ tiếp cận và khả năng quản trị riêng.

Xem bảng giá VPS

Lưu ý: Toàn bộ nội dung hướng dẫn trên được cung cấp nhằm mục đích tham khảo kỹ thuật. Các câu lệnh, tham số và đầu ra hiển thị có thể thay đổi tùy thuộc vào phiên bản nhân Linux, bản phân phối cụ thể cũng như môi trường vận hành thực tế. Bạn nên kiểm thử cẩn trọng trên môi trường thử nghiệm và sao lưu dữ liệu an toàn trước khi áp dụng trên các hệ thống production.

Chia sẻ: Facebook LinkedIn
Quay lại trang blog

Bài viết liên quan

Ảnh minh họa bài viết
Hướng dẫn chung

Hướng dẫn cài đặt WordPress bằng Docker Compose dưới đây sẽ giúp bạn triển khai website WordPress hoàn chỉnh với Nginx, WordPress và MySQL chạy trong ba container riêng biệt, thay vì cài rời từng thành phần dễ gây xung đột và khó bảo trì. Đây là cách làm chuẩn theo tài liệu chính thức […]

Thanh Lam Nguyễn
Đọc bài viết