Hướng Dẫn Lệnh ss Trong Linux – Kiểm Tra Cổng & Kết Nối
Lệnh ss (socket statistics) là tiện ích dòng lệnh tiêu chuẩn trên Linux giúp quản trị viên kiểm tra cổng dịch vụ đang mở, theo dõi kết nối mạng và xác định chính xác tiến trình nào đang chiếm dụng tài nguyên socket. Trong quá trình vận hành máy chủ, việc gặp lỗi xung đột […]
Lệnh ss (socket statistics) là tiện ích dòng lệnh tiêu chuẩn trên Linux giúp quản trị viên kiểm tra cổng dịch vụ đang mở, theo dõi kết nối mạng và xác định chính xác tiến trình nào đang chiếm dụng tài nguyên socket. Trong quá trình vận hành máy chủ, việc gặp lỗi xung đột cổng khiến Nginx, Apache không thể khởi động hoặc cần rà soát các cổng dịch vụ mở ra bên ngoài để bảo vệ hệ thống là tình huống xảy ra thường xuyên. Tại ThueVPSGiaRe.vn, môi trường máy chủ ảo luôn cung cấp toàn quyền root để bạn làm chủ hoàn toàn các công cụ phân tích mạng này.
Lệnh ss trong Linux là gì? Nguyên lý và lý do thay thế netstat
Lệnh ss là viết tắt của socket statistics, một công cụ phân tích mạng thuộc bộ tiện ích iproute2 được tích hợp mặc định trên các bản phân phối Linux hiện đại như Ubuntu, Debian, CentOS Stream và AlmaLinux. Chức năng chính của ss là trích xuất thông tin chi tiết về các socket mạng bao gồm kết nối TCP, UDP, DCCP, RAW và UNIX domain socket.
Trước đây, công cụ netstat thuộc gói net-tools là lựa chọn quen thuộc. Tuy nhiên, netstat thu thập dữ liệu bằng cách quét tuần tự qua các tệp tin trong thư mục ảo /proc/net/. Trên các máy chủ phục vụ lượng truy cập lớn với hàng chục nghìn kết nối đồng thời, việc đọc file văn bản này gây nghẽn I/O và phản hồi rất chậm.
Ngược lại, lệnh ss giao tiếp trực tiếp với nhân Linux thông qua giao thức netlink và module sock_diag (hoặc tcp_diag), giúp thu thập trạng thái socket ở cấp độ kernel gần như tức thời.
| Tiêu chí kỹ thuật | Công cụ netstat (Cũ) | Lệnh ss (Hiện đại) |
|---|---|---|
| Cơ chế lấy dữ liệu | Đọc và phân tích chuỗi từ /proc/net/* |
Giao tiếp nhị phân trực tiếp qua Netlink/sock_diag |
| Hiệu năng xử lý | Chậm khi có hàng chục nghìn kết nối mở | Cực nhanh, tiêu tốn rất ít CPU và tài nguyên |
| Khả năng lọc (Filtering) | Hạn chế, phải kết hợp grep, awk, sed | Tích hợp bộ lọc biểu thức nội tại theo state, IP, port |
| Tình trạng hỗ trợ | Bị xem là lỗi thời (deprecated) ở nhiều distro | Tiêu chuẩn mặc định trong gói iproute2 |
Khi bạn mới khởi tạo môi trường trên một gói thuê VPS giá rẻ để cấu hình web server, việc sử dụng thành thạo lệnh ss sẽ giúp bạn chẩn đoán nhanh sự cố dịch vụ mạng mà không cần cài thêm các gói tiện ích cồng kềnh.

Các tùy chọn quan trọng của lệnh ss và cách đọc output chi tiết
Lệnh ss sử dụng cú pháp chung là ss [tùy_chọn] [bộ_lọc]. Mỗi cờ (flag) đảm nhận việc hiển thị nhóm dữ liệu cụ thể. Nắm rõ từng ký tự viết tắt giúp bạn dễ dàng kết hợp chúng khi xử lý sự cố.
-t(TCP): Chỉ hiển thị các socket thuộc giao thức TCP.-u(UDP): Chỉ hiển thị các socket thuộc giao thức UDP.-l(Listening): Lọc ra các cổng đang ở trạng thái lắng nghe (LISTEN). Theo mặc định nếu không truyền cờ này, ss sẽ bỏ qua các cổng listening và chỉ in ra các kết nối đã thiết lập.-n(Numeric): Hiển thị cổng và địa chỉ dưới dạng số thay vì cố gắng phân giải thành tên dịch vụ (ví dụ hiện số 22 thay vì phân giải thành chữ ssh, hiện số 80 thay vì http). Tùy chọn này giúp câu lệnh chạy tức thì mà không bị trễ do DNS lookup.-p(Process): Hiển thị tên tiến trình và mã định danh tiến trình (PID) đang gắn với socket đó.-a(All): Hiển thị tất cả socket gồm cả listening và non-listening (established, time_wait, close_wait).-s(Summary): Trích xuất báo cáo thống kê tổng quan các loại socket đang hoạt động trên hệ thống.
Kiểm tra cổng đang mở với tổ hợp ss -tuln
Đây là câu lệnh được sử dụng với tần suất cao nhất khi kiểm tra các dịch vụ nền đang chạy trên VPS. Lệnh này liệt kê toàn bộ các cổng TCP và UDP đang mở lắng nghe mà không tra cứu tên phân giải:
ss -tuln

Một kết quả mẫu thông thường sẽ xuất hiện như sau trên màn hình terminal:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
Ý nghĩa chi tiết của từng cột thông số:
- Netid: Định danh loại kết nối (thường là tcp, udp, u_str với unix socket).
- State: Trạng thái kết nối. Đối với socket UDP không duy trì phiên, trạng thái thường hiển thị là
UNCONN(Unconnected). Với TCP, cổng đang chờ đón client sẽ có trạng tháiLISTEN. - Recv-Q (Receive Queue): Đối với socket ở trạng thái LISTEN, đây là số lượng kết nối đang chờ trong backlog queue mà ứng dụng chưa kịp gọi hàm
accept(). Nếu số này tăng cao liên tục, dịch vụ đang bị quá tải xử lý. - Send-Q (Send Queue): Đối với socket LISTEN, giá trị này đại diện cho kích thước tối đa của backlog queue do tiến trình thiết lập.
- Local Address:Port: Địa chỉ IP nội bộ và số cổng dịch vụ lắng nghe.
0.0.0.0:80biểu thị dịch vụ đang lắng nghe trên tất cả card mạng IPv4. Trong khi đó,127.0.0.1:3306chỉ chấp nhận kết nối nội bộ từ chính máy chủ này (loopback), người bên ngoài không thể kết nối trực tiếp. - Peer Address:Port: Địa chỉ IP và cổng phía đối tác. Đối với các socket đang lắng nghe, cột này luôn hiển thị
*:*hoặc0.0.0.0:*vì chưa gắn kết với client cụ thể nào.
Xác định Process sở hữu cổng với sudo ss -tulnp
Để biết chính xác ứng dụng nào đang mở cổng, bạn thêm tùy chọn -p. Bạn bắt buộc phải chạy lệnh này với quyền sudo hoặc user root. Nếu không có quyền root, Linux sẽ ẩn toàn bộ thông tin tiến trình thuộc về các user khác vì lý do bảo mật phân quyền.
sudo ss -tulnp

Khi có quyền quản trị, cột bổ sung users sẽ xuất hiện ở cuối:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=842,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6),("nginx",pid=1235,fd=6))
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=912,fd=21))
Dữ liệu users:(("nginx",pid=1234,fd=6)) cho biết tiến trình có tên nhị phân là nginx, mã PID là 1234 và đang nắm giữ file descriptor số 6. Từ mã PID này, bạn có thể dễ dàng quản lý tiến trình hoặc tra cứu sâu hơn qua systemctl hoặc lệnh ps.
Đánh giá tải socket nhanh với ss -s
Khi nghi ngờ hệ thống bị tràn bảng theo dõi socket do bị tấn công SYN Flood hoặc có quá nhiều kết nối rác chưa giải phóng, lệnh ss -s sẽ in ra báo cáo tổng hợp tình trạng:
ss -s

Kết quả hiển thị tương tự:
Total: 198
TCP: 18 (estab 3, closed 9, orphaned 0, timewait 4)
Transport Total IP IPv6
RAW 0 0 0
UDP 2 2 0
TCP 9 7 2
INET 11 9 2
FRAG 0 0 0
Dựa vào dòng TCP: 18 (estab 3, closed 9, orphaned 0, timewait 4), bạn sẽ nắm được ngay có bao nhiêu socket đang trong trạng thái ESTABLISHED (kết nối thực sự đang truyền tải dữ liệu) và bao nhiêu socket đang kẹt ở TIME_WAIT.
Kỹ thuật lọc kết nối chuyên sâu với lệnh ss trên Linux
Điểm vượt trội nhất của lệnh ss so với các công cụ cũ là khả năng lọc kết nối bằng biểu thức logic trực tiếp ngay trong tham số mà không cần thông qua đường ống (pipe) sang grep hay awk.
Lọc theo trạng thái kết nối TCP (State Filter)
Bạn có thể chỉ định chính xác trạng thái của socket theo chuẩn TCP lifecycle như: established, syn-sent, syn-recv, fin-wait-1, time-wait, close-wait, hoặc nhóm trạng thái connected, bucket.
# Liệt kê tất cả kết nối TCP đang mở giao tiếp
ss -tn state established
# Liệt kê các kết nối đang ở trạng thái TIME_WAIT
ss -tn state time-wait

Sau khi tìm hiểu cách đăng nhập VPS trên máy tính qua SSH, chạy lệnh trên sẽ hiển thị ngay kết nối SSH từ địa chỉ IP mạng nhà bạn tới cổng 22 của máy chủ ảo.
Lọc theo địa chỉ IP và số hiệu cổng (Port & IP Filtering)
Cú pháp bộ lọc của lệnh ss hỗ trợ các trường sport (source port – cổng nguồn) và dport (destination port – cổng đích), kết hợp với các toán tử so sánh như ==, !=, <, >, <=, >=.
# Lọc các kết nối có đích đến là cổng HTTP (80) hoặc HTTPS (443)
ss -at '( dport = :80 or dport = :443 )'
# Lọc tất cả kết nối đang bắt nguồn từ cổng 22
ss -at '( sport = :22 )'
# Lọc kết nối TCP từ một dải mạng cụ thể
ss -at dst 192.168.1.0/24

Nếu bạn đang chạy ứng dụng nặng cần xử lý nhiều tác vụ đồng thời hoặc muốn nắm rõ VPS treo tool cần cấu hình gì để không cạn kiệt tài nguyên mạng, tính năng lọc theo dport và sport này sẽ hỗ trợ bạn kiểm đếm lưu lượng các socket đang mở của từng luồng tự động.
⚠ Lưu ý về cú pháp khi dùng toán tử trong Bash:
Khi dùng dấu ngoặc đơn hoặc dấu hai chấm trong bộ lọc của lệnh ss, hãy luôn bọc toàn bộ biểu thức trong dấu nháy đơn ' ' hoặc nháy kép " ". Nếu không có dấu nháy, trình thông dịch Bash sẽ hiểu nhầm dấu ngoặc là subshell và báo lỗi cú pháp.
Hướng dẫn xử lý sự cố mạng và xung đột port bằng lệnh ss
Một trong những tình huống hay gặp nhất khi cài đặt ứng dụng web là lỗi Bind for 0.0.0.0:80 failed: port is already allocated hoặc nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use). Dưới đây là quy trình xử lý sự cố chuẩn gồm 4 bước chẩn đoán và khắc phục.
Bước 1: Xác định cổng bị chiếm dụng:
Chạy lệnh ss kết hợp grep để kiểm tra cổng mục tiêu (ví dụ cổng 80):
sudo ss -tulnp | grep :80
Bước 2: Tìm PID và tên tiến trình gây xung đột:
Kết quả trả về cho thấy tiến trình Apache (apache2 hoặc httpd) đang chạy ngầm với PID 3456:
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("apache2",pid=3456,fd=4))
Bước 3: Dừng dịch vụ hoặc chấm dứt tiến trình:
Nếu đó là dịch vụ hệ thống được quản lý bởi systemd, ưu tiên dừng bằng lệnh:
sudo systemctl stop apache2
# Hoặc nếu là tiến trình chạy độc lập bị treo:
sudo kill -15 3456
Bước 4: Xác minh lại trạng thái cổng:
Chạy lại sudo ss -tulnp | grep :80. Nếu terminal không trả về dòng nào, cổng 80 đã hoàn toàn được giải phóng và sẵn sàng cho web server mới của bạn.
Đối với những nhà phát triển đang triển khai cấu hình VPS cho Laravel sử dụng kết hợp Nginx làm reverse proxy và PHP-FPM, việc sử dụng lệnh ss để kiểm tra cổng socket UNIX nội bộ (như /run/php/php8.2-fpm.sock) hoặc port 9000 là kỹ năng bắt buộc để bảo đảm ứng dụng không bị lỗi 502 Bad Gateway. Bạn có thể kiểm tra Unix socket bằng lệnh ss -xl | grep php.
Nếu bạn chạy các tiến trình nền lâu dài hoặc cần treo bot, hãy tham khảo thêm bài viết hướng dẫn sử dụng lệnh Screen trong Linux để giữ phiên làm việc liên tục mà không bị ngắt kết nối mạng khi đóng terminal.
Checklist kiểm tra an ninh cổng dịch vụ trên máy chủ Linux
Bề mặt tấn công mạng của máy chủ phụ thuộc trực tiếp vào số lượng cổng mở ra Internet công cộng. Hãy thực hiện kiểm tra định kỳ theo quy trình sau:
- Rà soát cổng lắng nghe công khai: Chạy lệnh
sudo ss -tulnpđể quét toàn diện. Chú ý các dòng có Local Address là0.0.0.0hoặc[::]vì đây là các cổng cho phép mọi dải IP bên ngoài kết nối tới. - Cô lập các dịch vụ nội bộ về Localhost: Các dịch vụ chỉ phục vụ nội bộ máy chủ như MySQL, PostgreSQL, Redis, Memcached tuyệt đối không để lắng nghe trên
0.0.0.0. Hãy cấu hình tham sốbind-address = 127.0.0.1trong file cấu hình tương ứng của chúng. - Kiểm tra trạng thái sau khi cài đặt SSL: Sau khi tiến hành theo cách đăng ký SSL cho domain và thiết lập chứng chỉ bảo mật, dùng lệnh
sudo ss -tlnp | grep :443để chắc chắn Nginx hoặc Apache đã lắng nghe chuẩn xác trên cổng HTTPS. - Đóng bớt cổng lạ: Nếu phát hiện cổng lạ do dịch vụ không cần thiết tạo ra (như RPC, CUPS in ấn, hoặc daemon cũ), hãy tắt service bằng
sudo systemctl disable --now <service_name>.
⚠ Cảnh báo an toàn trước khi bật tường lửa UFW/iptables:
Trước khi kích hoạt tường lửa (Firewall), hãy luôn kiểm tra cổng SSH hiện tại bằng sudo ss -tlnp | grep ssh để biết chính xác SSH đang dùng port nào (mặc định 22 hoặc port custom). Mở port đó trên firewall trước khi kích hoạt, đồng thời giữ nguyên cửa sổ terminal hiện tại và mở thêm một cửa sổ mới để thử đăng nhập. Điều này giúp bạn tránh gặp tình huống bị khóa ngoài dẫn tới việc phải tìm cách sửa lỗi không vào được VPS qua bảng điều khiển cứu hộ.
Các lỗi thường gặp khi sử dụng lệnh ss và cách xử lý
1. Chạy ss -p nhưng cột Process bị trống trơn
Hiện tượng: Bạn gõ ss -tlp nhưng hệ thống chỉ hiển thị danh sách cổng và IP, cột Process hoàn toàn không có thông tin ứng dụng hay PID nào.
Nguyên nhân: Bạn đang chạy câu lệnh với quyền user thông thường. Theo cơ chế bảo mật Linux, tài khoản không có quyền root không được phép xem thông tin socket của các tiến trình do người dùng khác (như root, www-data, mysql) khởi chạy.
Cách xử lý: Thêm sudo vào trước câu lệnh: sudo ss -tlpn.
2. Báo lỗi “ss: command not found”
Hiện tượng: Khi gõ lệnh ss, hệ thống báo lỗi không tìm thấy câu lệnh.
Nguyên nhân: VPS sử dụng bản phân phối Linux tối giản (minimal image) hoặc container Docker stripped-down chưa được cài đặt gói công cụ mạng.
Cách xử lý: Cài đặt gói iproute2 chứa lệnh ss:
# Đối với Ubuntu / Debian:
sudo apt update && sudo apt install -y iproute2
# Đối với CentOS / AlmaLinux / Rocky Linux:
sudo dnf install -y iproute
3. Lỗi thiếu module tcp_diag hoặc sock_diag
Hiện tượng: Khi lọc socket trạng thái sâu, ss đưa ra cảnh báo không tải được thông tin chuẩn đoán.
Nguyên nhân: Nhân Linux tùy biến bị loại bỏ module chẩn đoán mạng trong quá trình build kernel.
Cách xử lý: Kiểm tra module với lsmod | grep diag. Nếu sử dụng VPS nền tảng chuẩn KVM của Fast Byte, nhân Linux tiêu chuẩn của các bản phân phối LTS đều kích hoạt sẵn module này.
Câu hỏi thường gặp về lệnh ss
Lệnh ss là gì và dùng để làm gì?
Lệnh ss (socket statistics) là công cụ CLI trên Linux dùng để hiển thị thông tin chi tiết về các kết nối mạng và socket. Công cụ này thường được dùng để rà soát các cổng dịch vụ đang mở, xem xét kết nối TCP/UDP đang hoạt động và xác định ứng dụng nào đang lắng nghe trên cổng mạng.
Lệnh ss khác gì so với netstat?
Lệnh ss truy xuất dữ liệu trực tiếp từ kernel thông qua giao tiếp netlink nhị phân, cho tốc độ xử lý nhanh vượt trội so với netstat (vốn quét qua thư mục /proc). Ngoài ra, ss hỗ trợ cú pháp lọc theo cổng và trạng thái tích hợp sẵn mà không cần ghép qua lệnh grep hay awk.
Tại sao chạy ss -p không thấy process?
Cột thông tin tiến trình bị ẩn nếu người thực thi câu lệnh không có đặc quyền root. Nhân Linux ngăn chặn user bình thường truy cập dữ liệu quản lý socket của tiến trình hệ thống khác. Để xem đầy đủ PID và tên phần mềm, bạn cần chạy lệnh kèm sudo ss -tulnp.
Làm sao kiểm tra cổng 80 có đang mở không?
Bạn có thể chạy lệnh sudo ss -tlnp '( sport = :80 )' hoặc sudo ss -tlnp | grep :80. Nếu có một dòng xuất hiện với trạng thái LISTEN, nghĩa là cổng 80 đang mở. Nếu không có dòng output nào trả về, hiện không có web server nào lắng nghe cổng này.
ss -tuln và ss -tulnp khác nhau ở điểm nào?
Cả hai lệnh đều liệt kê các cổng TCP và UDP đang lắng nghe dưới dạng số. Tuy nhiên, ss -tulnp có thêm cờ -p, hiển thị thêm cột thông tin chứa tên ứng dụng và mã PID đang giữ cổng đó (yêu cầu quyền root để đọc dữ liệu).
Kết luận: Làm chủ lệnh ss để quản trị VPS Linux hiệu quả
Nắm vững cách sử dụng lệnh ss là bước cơ bản giúp bạn làm chủ môi trường máy chủ Linux, xử lý triệt để các sự cố xung đột cổng và chủ động rà soát an toàn mạng. Hãy ghi nhớ 3 thói quen quan trọng: ưu tiên câu lệnh sudo ss -tulnp khi phân tích tiến trình, luôn kiểm tra cổng SSH trước khi can thiệp cấu hình tường lửa, và cô lập các cổng cơ sở dữ liệu về dải loopback 127.0.0.1. Nếu bạn đang tìm kiếm một môi trường VPS chi phí hợp lý để thực hành và triển khai dự án thực tế, các gói dịch vụ tại Fast Byte luôn sẵn sàng đồng hành cùng bạn.
Khởi tạo máy chủ ảo của bạn ngay hôm nay
Hạ tầng mạnh mẽ, kích hoạt tức thì, hỗ trợ cài đặt các bản phân phối Linux phổ biến.
Nội dung bài viết mang tính chất hướng dẫn kỹ thuật tham khảo. Các câu lệnh và tham số cấu hình trong tài liệu này được kiểm thử thực tế trên hệ điều hành Ubuntu 22.04 LTS, Ubuntu 24.04 LTS và Debian 12 với quyền root/sudo. Tùy thuộc vào bản phân phối Linux cụ thể, phiên bản nhân kernel và chính sách bảo mật máy chủ, kết quả thực thi có thể có sự khác biệt nhỏ. Quản trị viên nên kiểm tra thử nghiệm trên môi trường thử nghiệm (staging) trước khi áp dụng trên máy chủ sản xuất (production).



