Netstat — Công cụ quan trọng trong chẩn đoán mạng cho DevOps / System Admin
Khi bạn là người vận hành server, làm DevOps hay System Admin, đôi khi gặp trường hợp như: khởi chạy service thành công, nhưng khi truy cập vào server qua IP từ trình duyệt, trang web lại không hiện lên được. Lúc ấy bạn sẽ tự hỏi:
-
Service có thực sự đang chạy không?
-
Port đúng như mong muốn đã mở và lắng nghe chưa?
-
Có ứng dụng nào khác đang chiếm port đó không?
-
Cấu hình firewall hoặc route có vấn đề gì không?
Một trong những tool mà mình dùng để kiểm tra các thông tin mạng bên trong server là netstat. Nó giúp hiển thị những gì đang “diễn ra” bên trong: port, connections, đến từ đâu, đi đâu, ai đang dùng, trạng thái kết nối, …
Dưới đây là các lệnh netstat rất hữu dụng nên biết khi làm việc với Linux.
Giải thích nhanh về netstat
-
netstatlà tiện ích dòng lệnh (command-line utility), có mặt gần như trên mọi máy Linux(Library net-tools) -
Nó cung cấp thông tin về:
-
Các kết nối mạng (TCP, UDP,…), cả đang lắng nghe (LISTEN) lẫn đã thiết lập (ESTABLISHED).
-
Process (PID) nào giữ các kết nối/port đó.
-
Bảng định tuyến (routing), các interface mạng, thống kê gói tin…
1. Xem các port đang listening
Đây là lệnh bạn sẽ dùng thường xuyên nhất để kiểm tra xem dịch vụ của mình đã chạy và sẵn sàng nhận kết nối hay chưa.
netstat -tulnGiải thích:
-t: Hiển thị các kết nối TCP.-u: Hiển thị các kết nối UDP.-l: Chỉ hiển thị các socket đang ở trạng tháiLISTEN.-n: Hiển thị địa chỉ IP và số hiệu port (dạng số), không phân giải tên miền. Lệnh sẽ chạy nhanh hơn.
2. Xác định process đang sử dụng port
Khi chúng ta cần biết chính xác process nào đang chiếm một port cụ thể, hãy thêm option
-p.netstat -tulpn-p: Hiển thị Process ID (PID) và tên của process sở hữu socket.
3. Xem toàn bộ các socket đang hoạt động
Khi ta muốn có cái nhìn tổng quan nhất về tất cả hoạt động mạng, bao gồm cả các port đang lắng nghe (
LISTEN) và các kết nối đã được thiết lập (ESTABLISHED), hãy thêm option-a.netstat -aLệnh này sẽ liệt kê tất cả các socket TCP, UDP và cả Unix sockets. Nó hữu ích khi ta muốn rà soát nhanh mọi thứ mà không cần bộ lọc cụ thể.
4. Lọc riêng các kết nối TCP
Trong nhiều trường hợp, ta chỉ quan tâm đến các giao thức hướng kết nối như HTTP, SSH, hoặc FTP, vốn đều sử dụng TCP. Để lọc riêng các kết nối này và làm cho kết quả gọn gàng hơn, hãy dùng lệnh:
netstat -tnOption
-tchỉ hiển thị TCP và-ngiúp hiển thị địa chỉ IP/port thay vì phân giải tên miền.5. Lọc riêng các kết nối UDP
Tương tự, để kiểm tra các dịch vụ sử dụng giao thức không hướng kết nối (connectionless) như DNS, DHCP, hoặc NTP, ta có thể lọc riêng kết nối UDP bằng option
-u.netstat -un6. Kiểm tra bảng định tuyến (Routing Table)
Đây là một lệnh cực kỳ quan trọng để chẩn đoán các vấn đề về kết nối liên mạng (ví dụ: server không thể truy cập Internet). Nó hiển thị route table của kernel, cho biết gói tin sẽ được gửi đi đâu.
netstat -rnKết quả của lệnh này xác nhận default gateway đã được cấu hình đúng hay chưa. Đây là cổng mặc định cho tất cả traffic không có định tuyến cụ thể trong mạng local.
7. Xem thống kê chi tiết của các giao thức mạng
Để đi sâu hơn vào việc chẩn đoán, ta có thể xem các số liệu thống kê cho từng giao thức (IP, TCP, UDP, ICMP) với option
-s.netstat -sLệnh này sẽ cung cấp các thông tin như tổng số gói tin đã gửi/nhận, số gói tin bị lỗi, số lần kết nối được thiết lập… rất hữu ích để tìm ra các vấn đề tiềm ẩn về hiệu năng hoặc lỗi đường truyền.
8. Xem thông tin các interface mạng
Để xem danh sách các interface mạng (ens33,
lo,…) cùng với thống kê về lưu lượng dữ liệu trên từng interface, bạn có thể dùng option-i.netstat -iKết quả sẽ hiển thị các thông số như MTU (Maximum Transmission Unit) và số lượng gói tin nhận (RX) và gửi (TX) thành công hoặc bị lỗi trên mỗi interface.
Các tình huống áp dụng thực tế
Kiểm tra dịch vụ SSH
Để đảm bảo server cho phép kết nối SSH, ta kiểm tra port 22:
netstat -tulpn | grep 22Một kết quả tốt sẽ tương tự như sau:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 860/sshd: /usr/sbin tcp6 0 0 :::22 :::* LISTEN 860/sshd: /usr/sbin0.0.0.0:22: Dịch vụ đang lắng nghe trên port 22 của tất cả các interface mạng.LISTEN: Trạng thái cho thấy dịch vụ đã sẵn sàng nhận kết nối mới.1234/sshd: Processsshdvới PID là1234đang quản lý port này.
Nếu bạn không thể SSH vào server, lệnh này sẽ giúp xác nhận liệu dịch vụ SSH có đang chạy hay không.
Kiểm tra Web Server (HTTP/HTTPS)
Quay lại vấn đề ở đầu bài. Sau khi khởi động Nginx hoặc Apache, hãy dùng lệnh sau để xác thực:
netstat -tulpn | grep 80Kết quả mong đợi:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3162/nginx: masterĐiều này xác nhận rằng web server của bạn đang hoạt động và lắng nghe trên port 80.
Tiếp theo, khi có người dùng truy cập, bạn có thể kiểm tra các kết nối đã được thiết lập:
netstat -an | grep 80Bạn sẽ thấy các dòng có trạng thái
ESTABLISHED, ví dụ:tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 10.0.0.100:80 10.0.0.1:54866 ESTABLISHED tcp 0 0 10.0.0.100:80 10.0.0.1:54865 ESTABLISHEDLISTENcó thể hiểu là “cửa hàng đã mở cửa”.ESTABLISHEDcó nghĩa là “đang có khách hàng giao dịch tại quầy”.
Kiểm tra các kết nối đang hoạt động
Để có cái nhìn tổng quan về các kết nối TCP đang hoạt động trên server, sử dụng lệnh:
netstat -tnKết quả sẽ liệt kê các kết nối, bao gồm IP nguồn (
Foreign Address) và IP đích (Local Address), giúp bạn biết được ai đang kết nối đến server của mình.Kiểm tra Default Gateway
Khi server mất kết nối Internet, một trong những bước đầu tiên là kiểm tra route table:
netstat -rnHãy tìm dòng có
Destinationlà0.0.0.0. Gateway được chỉ định ở dòng này chính là đích đến cho tất cả traffic không có định tuyến cụ thể. Nếu thông tin này sai, server sẽ không thể kết nối ra ngoài mạng local.Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 10.0.0.2 0.0.0.0 UG 0 0 0 ens33 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33Tổng kết
netstatlà một công cụ mạnh mẽ và cần thiết trong bộ công cụ của bất kỳ ai làm việc với Linux. Nắm vững các câu lệnh trên sẽ giúp chúng ta nhanh chóng xác định và xử lý các vấn đề liên quan đến kết nối mạng một cách hiệu quả.
-
