Kiểm tra cổng đang mở trên Linux: ss, netstat, lsof, nmap
- 15 tháng 9, 2026
- 09:00
- Bởi Adrien Roche
- Cập nhật 7 tháng 10, 2026
- Mạng

Kiểm tra cổng đang mở bằng ss, tiêu chuẩn hiện đại
Mỗi cổng đang mở trên hệ thống Linux tồn tại vì có một tiến trình đã yêu cầu kernel lắng nghe trên cổng đó. Công cụ hiển thị các socket này ngày nay là ss (socket statistics), thuộc bộ iproute2 được cài sẵn trên mọi bản phân phối hiện đại. Một lệnh duy nhất đáp ứng hầu hết tình huống:
sudo ss -tulpnMỗi cờ đảm nhận một việc:
-t: bao gồm các socket TCP-u: bao gồm các socket UDP-l: chỉ hiển thị các socket đang lắng nghe (bỏ cờ này để xem cả các kết nối đã thiết lập)-p: hiển thị tiến trình sở hữu từng socket; đây là lý do bạn cầnsudo, vì thiếu nó bạn chỉ thấy các tiến trình của chính mình-n: xuất dạng số; in:22thay vì:sshvà bỏ qua tra cứu DNS ngược, nhờ đó lệnh cũng chạy nhanh hơn
Một dòng kết quả điển hình trông như sau:
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=712,fd=3))Cột Local Address là cột quan trọng về mặt bảo mật. 0.0.0.0:22 nghĩa là socket chấp nhận kết nối trên mọi giao diện IPv4, [::]:22 là tương đương cho IPv6, còn 127.0.0.1:5432 nghĩa là dịch vụ chỉ trả lời trên loopback và hoàn toàn không thể truy cập từ mạng.
Vài biến thể đáng ghi nhớ:
ss -tlnp # TCP listeners only
ss -ulnp # UDP listeners only
sudo ss -tlnp 'sport = :22' # who is listening on port 22
ss -tn state established # active TCP connections right nownetstat vẫn chạy được, nhưng đã lỗi thời
Hàng triệu bài hướng dẫn vẫn ghi netstat -tulpn, và các cờ tương ứng một đối một với lệnh ss ở trên, nên thói quen gõ lệnh dùng được theo cả hai chiều. Khác biệt nằm ở bên dưới: netstat thuộc gói net-tools chỉ còn được bảo trì và đọc các tệp /proc, trong khi ss truy vấn kernel trực tiếp qua netlink, nhanh hơn rõ rệt trên những máy phải xử lý hàng nghìn socket.
Phần lớn bản phân phối hiện nay không còn cài net-tools mặc định. Nếu bạn vẫn cần:
sudo netstat -tulpn
# if the command is missing:
sudo apt install net-tools # Debian / Ubuntu
sudo dnf install net-tools # RHEL / FedoraKhông có lý do gì để cài nó trên máy chủ mới. Hãy coi netstat là phương án tương thích cho các hệ thống cũ bạn tiếp quản, và dùng ss ở mọi nơi khác.
lsof: nhìn cổng qua lăng kính tiến trình
Trên Linux mọi thứ đều là tệp, kể cả socket mạng, nên lsof (list open files) kiêm luôn vai trò công cụ kiểm tra cổng. Nó đặc biệt hữu ích khi bạn vốn suy nghĩ theo tiến trình hơn là theo cổng:
sudo lsof -i -P -n # every process with a network socket
sudo lsof -iTCP -sTCP:LISTEN -P -n # TCP listeners only
sudo lsof -i :443 # everything touching port 443-P và -n tắt việc phân giải tên cổng và tên máy, cùng ý tưởng với -n trong ss -tulpn. Dạng thứ ba là dạng dùng hằng ngày: trỏ vào một cổng và bạn nhận được tên lệnh, PID, người dùng và file descriptor trong một bảng dễ đọc. Khác với ss, lsof còn liệt kê các kết nối đã thiết lập của từng tiến trình bên cạnh các socket lắng nghe, rất hữu ích khi bạn muốn biết ai đang giao tiếp với một dịch vụ, chứ không chỉ biết dịch vụ đó tồn tại.
nmap: đang lắng nghe không có nghĩa là truy cập được
Mọi thứ cho đến giờ chỉ trả lời một câu hỏi: cái gì đang lắng nghe trên máy này. Một câu hỏi khác quan trọng hơn về bảo mật: cái gì thực sự truy cập được từ bên ngoài. Hai danh sách hiếm khi giống nhau, vì tường lửa trên máy, bộ lọc ở phía nhà cung cấp và các dịch vụ chỉ gắn vào loopback đều tạo ra khoảng chênh lệch. Đó cũng là lý do tự quét chính mình từ chính mình chẳng chứng minh được gì nhiều: nmap localhost đi qua giao diện loopback, bỏ qua hoàn toàn các quy tắc tường lửa bên ngoài, và vô tư báo cáo những dịch vụ mà không kẻ tấn công nào có thể chạm tới.
Hãy chạy lệnh quét từ một máy khác, nhắm vào IP công khai của máy chủ:
nmap 203.0.113.10 # top 1000 TCP ports
nmap -p- 203.0.113.10 # all 65535 TCP ports
sudo nmap -sU --top-ports 100 203.0.113.10 # common UDP ports (slow)nmap báo cáo ba trạng thái cần hiểu rõ: open nghĩa là có dịch vụ trả lời, closed nghĩa là gói tin đã tới nơi nhưng không có gì lắng nghe ở đó, còn filtered nghĩa là gói tin bị loại bỏ âm thầm, hầu như luôn do tường lửa. Một cổng mà ss hiển thị là LISTEN nhưng nmap từ xa báo là filtered chính là dấu hiệu của một tường lửa đang hoạt động đúng. Có một quy tắc áp dụng không ngoại lệ: chỉ quét những máy bạn sở hữu hoặc được cho phép kiểm tra một cách rõ ràng.
Tìm chính xác tiến trình nào đang giữ một cổng
Giả sử có thứ gì đó đang chiếm cổng 8080 và ứng dụng của bạn không thể bind vào. Có ba cách để tìm ra PID:
sudo ss -tlnp 'sport = :8080'
sudo lsof -i :8080
sudo fuser -v 8080/tcpfuser gọn nhất: nó in ra PID, và -v bổ sung tên người dùng và tên lệnh. Nó thậm chí có thể kill thủ phạm trực tiếp bằng fuser -k 8080/tcp, nhưng cách này gửi tín hiệu mà không có bước dọn dẹp nào ở cấp dịch vụ, nên chỉ dùng như biện pháp cuối cùng. Khi đã có PID, ps -fp PID hiển thị toàn bộ dòng lệnh, và systemctl status PID cho bạn biết unit systemd nào đã sinh ra nó.
Khi hoàn toàn không có công cụ nào (ví dụ một image container rút gọn), bảng của chính kernel luôn có sẵn: cat /proc/net/tcp. Cổng hiển thị dưới dạng hệ thập lục phân (0016 là 22) và trạng thái 0A nghĩa là LISTEN. Bảng thô này chính là dữ liệu mà các công cụ khác phân tích và định dạng lại cho bạn.
Mọi thứ bind một socket đều xuất hiện trong các danh sách này theo cùng một cách, dù đó là cơ sở dữ liệu hay một hệ thống proxy. Ví dụ, một inbound V2Ray chỉ là một socket lắng nghe khác trên cổng bạn đã cấu hình, như được giải thích trong hướng dẫn giao thức V2Ray của chúng tôi.
Đóng một cổng đang mở: kill hay tường lửa
Một cổng mở vì có tiến trình lắng nghe trên đó, nên bạn có hai đòn bẩy riêng biệt: gỡ bỏ tiến trình lắng nghe, hoặc chặn khả năng truy cập. Hai cách này không thay thế được cho nhau, và với bất cứ thứ gì quan trọng, bạn thường nên dùng cả hai.
Cách xử lý sạch sẽ là dừng và vô hiệu hóa dịch vụ sở hữu socket. Kill PID trông nhanh hơn nhưng hiếm khi có hiệu quả lâu dài: systemd tự động khởi động lại các dịch vụ được giám sát, và cổng đã mở lại trước khi bạn kịp chạy lại ss. Chỉ dùng kill cho những tiến trình bạn tự khởi chạy bằng tay. Để xem những gì đang chạy và tắt những gì bạn không cần, bài hướng dẫn liệt kê dịch vụ với systemctl của chúng tôi trình bày trọn vẹn quy trình đó.
sudo systemctl stop cups
sudo systemctl disable cupsTường lửa đảm nhận đòn bẩy thứ hai. Trên Ubuntu, hãy cho phép SSH trước khi bật ufw, nếu không bạn sẽ tự khóa mình bên ngoài máy chủ:
sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw enableTrên các hệ thống họ RHEL, zone mặc định của firewalld vốn đã loại bỏ lưu lượng không được yêu cầu; hãy gỡ bất cứ thứ gì bạn đã mở trước đó bằng firewall-cmd --permanent --remove-port=8080/tcp rồi chạy firewall-cmd --reload. Có một việc không phải là giải pháp: chuyển dịch vụ sang cổng không chuẩn. Cách đó giúp bạn tránh được những lần quét lười biếng nhất và làm log yên tĩnh hơn, nhưng nmap -p- vẫn tìm ra cổng mới trong vài phút. Che giấu không phải là bảo mật: hãy đóng cổng hoặc chặn nó bằng tường lửa.
Kiểm tra cổng trong năm phút cho một máy chủ mới
Ngay lần đăng nhập đầu tiên vào một máy vừa được cấp, hãy kiểm kê bằng sudo ss -tulpn. Một bản cài tối giản sạch sẽ chỉ nên hiển thị rất ít: sshd trên cổng 22 và, với các bản phân phối dùng systemd-resolved, một DNS stub trên 127.0.0.53:53. Bất cứ thứ gì khác đều cần được giải thích. Sau đó làm lần lượt theo danh sách kiểm tra này:
- Xác định từng tiến trình lắng nghe theo tên và PID; vô hiệu hóa mọi dịch vụ bạn không yêu cầu.
- Xem xét kỹ mọi bind vào
0.0.0.0hoặc[::]: cơ sở dữ liệu và bảng quản trị nên nằm trên127.0.0.1trừ khi chúng thực sự phục vụ mạng. - Nhận ra ngay các cổng phổ biến: 22 SSH, 80/443 web, 3306 MySQL, 5432 PostgreSQL, 6379 Redis. Cổng 3389 là remote desktop. Trên Linux, nó có nghĩa là xrdp đang chạy, và các quy tắc phơi bày cũng như gia cố bảo mật cho cổng này là chủ đề của hướng dẫn về cổng RDP 3389 của chúng tôi.
- Quét IP công khai từ máy của bạn bằng
nmap -p-và so sánh kết quả với danh sách củass; mỗi điểm khác biệt hoặc là tường lửa đang làm đúng việc, hoặc là một bind vào loopback. - Kết thúc bằng một tường lửa mặc định chặn tất cả, chỉ cho phép những cổng bạn đã chủ động chọn để mở ra ngoài.
Đây là toàn bộ bộ công cụ, mỗi công cụ một dòng:
| Lệnh | Hiển thị | Dùng khi |
|---|---|---|
sudo ss -tulpn | Các socket TCP/UDP đang lắng nghe kèm tiến trình sở hữu | Kiểm tra nhanh hằng ngày trên mọi máy |
netstat -tulpn | Cùng góc nhìn qua net-tools cũ | Hệ thống cũ không có ss |
sudo lsof -i :PORT | Các tiến trình và kết nối trên một cổng | Gắn một cổng với tiến trình và các tệp của nó |
sudo fuser -v PORT/tcp | Các PID đang bind vào một cổng | Tra PID nhanh, viết script |
nmap SERVER_IP (từ xa) | Các cổng thực sự truy cập được từ bên ngoài | Xác minh tường lửa và mức phơi bày thực tế |
cat /proc/net/tcp | Bảng socket thô của kernel (hex) | Container tối giản không cài công cụ nào |
Các lệnh chỉ trở thành phản xạ trên một máy mà bạn có quyền root thật sự và không có gì quan trọng có thể hỏng. Một VPS Linux từ rdp.monster cho bạn đúng môi trường thử nghiệm đó: toàn quyền quản trị, CPU và RAM riêng, băng thông không giới hạn (sử dụng hợp lý), không cần KYC, và máy chủ trực tuyến khoảng 10 giây sau khi thanh toán được xác nhận, đủ nhanh để bạn chạy lệnh ss -tulpn đầu tiên trước khi cà phê kịp nguội.
Câu hỏi thường gặp
Có cần quyền root để kiểm tra cổng đang mở trên Linux không?
ss -tuln hoặc đọc /proc/net/tcp, nên danh sách cổng đang lắng nghe không bao giờ bị ẩn. Giới hạn nằm ở cờ -p: không có root, ss, lsof và fuser chỉ hiển thị các tiến trình thuộc người dùng của bạn, còn các socket khác xuất hiện với cột tiến trình để trống. Với nmap, kiểu quét SYN mặc định (-sS) cần root; phương án thay thế không cần đặc quyền là connect scan (-sT), hoạt động tốt nhưng gây chú ý hơn một chút.Làm sao kiểm tra một cổng cụ thể có mở trên máy chủ từ xa không?
nc -zv example.com 443 thử mở một kết nối TCP và báo thành công hay thất bại mà không gửi dữ liệu. Nếu không có netcat, Bash thuần cũng làm được: timeout 3 bash -c '</dev/tcp/example.com/443' && echo open. Cả hai chỉ chứng minh có thứ gì đó đã chấp nhận kết nối; chúng không cho biết dịch vụ nào đã trả lời hay dịch vụ đó có hoạt động tốt không. Với UDP không có cách kiểm tra nhanh đáng tin cậy, vì một cổng im lặng có thể đang mở hoặc bị lọc; khi đó hãy dùng nmap -sU.Vì sao ss hiển thị cổng đang lắng nghe nhưng tôi không kết nối được từ bên ngoài?
127.0.0.1:PORT hoặc [::1]:PORT nghĩa là dịch vụ chỉ chấp nhận kết nối cục bộ, điều này là cố ý và phổ biến với cơ sở dữ liệu. Nếu nó được gắn vào 0.0.0.0, gói tin đang bị lọc ở đâu đó trên đường đi: một tường lửa trên máy như ufw, firewalld hay nftables thuần, hoặc bộ lọc biên của nhà cung cấp. Một lần quét nmap từ bên ngoài báo cổng là filtered xác nhận có tường lửa; closed nghĩa là lưu lượng tới nơi nhưng không có gì lắng nghe trên giao diện đó.Máy chủ Linux mới cài nên mở những cổng nào?
sshd trên cổng 22 ra mạng. Một DNS resolver dạng stub trên 127.0.0.53:53 (systemd-resolved) là bình thường và không thể truy cập từ bên ngoài. Các image cloud đôi khi cài thêm agent hoặc daemon giám sát, vì vậy hãy xác định từng tiến trình lắng nghe bằng ss -tulpn và vô hiệu hóa những gì bạn không yêu cầu. Mọi dịch vụ bạn cài sau đó nên mặc định gắn vào loopback trừ khi thực sự cần phục vụ mạng, với tường lửa chỉ cho phép những gì công khai.Adrien Roche, Biên tập viên hạ tầng & hosting
Kỹ sư hệ thống với hơn 10 năm vận hành các hệ thống Windows Server và Linux. Adrien phụ trách tài liệu hạ tầng của rdp.monster và viết các hướng dẫn về RDP, hosting VPS, quản trị máy chủ, mạng và công cụ bảo vệ quyền riêng tư.




