Lệnh ss là phương pháp mới thay thế cho netstat kinh điển. Bạn có thể sử dụng nó trên Linux để lấy số liệu về các kết nối mạng. Dưới đây là cách làm việc với công cụ hữu ích này.
Lệnh ss và netstat
Thay thế cho lệnh netstat đã cũ, lệnh ss cung cấp cho bạn những thông tin về giao tiếp giữa máy tính của bạn và máy tính khác, mạng và các dịch vụ khác.
Lệnh ss sẽ hiển thị các số liệu của Transmission Control Protocol (TCP), User Datagram Protocol (UDP), Unix (interprocess) và các raw socket. Raw socket hoạt động ở mạng cấp OSI, có nghĩa là giao thức TCP và UDP phải được xử lý bởi phần mềm, chứ không phải bởi lớp vận chuyển. Các tin nhắn của Internet Control Message Protocol (ICMP) và tiện ích ping đều sử dụng raw socket.
Sử dụng lệnh ss
Bạn không phải cài đặt lệnh ss, nó đã có sẵn trên các phiên bản mới nhất của các bản phân phối Linux. Tuy nhiên, kết quả của lệnh này có thể vừa dài vừa rộng.
Liệt kê các kết nối mạng
Gõ lệnh sau:
ss
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str ESTAB 0 0 * 41826 * 41827
u_str ESTAB 0 0 /run/systemd/journal/stdout 35689 * 35688
u_str ESTAB 0 0 * 35550 * 35551
...
u_str ESTAB 0 0 * 38127 * 38128
u_str ESTAB 0 0 /run/dbus/system_bus_socket 21243 * 21242
u_str ESTAB 0 0 * 19039 * 19040
u_str ESTAB 0 0 /run/systemd/journal/stdout 18887 * 18885
u_str ESTAB 0 0 /run/dbus/system_bus_socket 19273 * 17306
icmp6 UNCONN 0 0 *:ipv6-icmp *:*
udp ESTAB 0 0 192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps
Các cột sẽ lần lượt xuất hiện như sau:
- Netid: Các loại socket.
- State: Tình trạng socket.
- Recv-Q: Số lượng packet nhận được.
- Send-Q: Số lượng packet gửi đi.
- Local Address:Port: Địa chỉ cục bộ và cổng (hoặc những giá trị tương đương cho Unix socket).
- Peer Address:Port: Địa chỉ từ xa và cổng (hoặc giá trị tương đương cho Unix socket).
Đối với socket UDP cột State thường để trống. Với socket TCP nó có thể là một trong những phần sau:
- LISTEN: Chỉ dành cho bên server. Socket đang đợi yêu cầu kết nối.
- SYN-SENT: Chỉ dành cho bên client. Socket này tạo một yêu cầu kết nối và đợi xem khi nào nó được chấp nhận.
- SYN-RECEIVED: Chỉ dành cho bên server. Socket này đợi nhận diện kết nối sau khi yêu cầu kết nối được chấp nhận.
- ESTABLISHED: Dành cho server và client. Một kết nối hoạt động được thành lập giữa server và client, cho phép dữ liệu được truyền qua lại giữa hai bên.
- FIN-WAIT-1: Dành cho server và client. Socket này đang đợi một yêu cầu kết nối từ socket từ xa, hoặc nhận biết một yêu cầu kết nối được gửi từ trước đó.
- FIN-WAIT-2: Dành cho server và client. Socket này đang đợi yêu cầu kết nối từ socket từ xa.
- CLOSE-WAIT: Dành cho Server và client. Socket này đang đợi yêu cầu kết nối từ người dùng cục bộ.
- CLOSING: Socket này đang đợi một yêu cầu kết nối nhận diện từ socket từ xa.
- LAST-ACK: Dành cho server và client. Socket này đang đợi một nhận diện yêu cầu kết nối nó gửi đến socket từ xa.
- TIME-WAIT: Dành cho server và client. Socket này gửi một nhận diện đến socket từ xa để cho biết nó nhận được yêu cầu từ socket từ xa. Bây giờ nó đang đợi để chắc chắn rằng nhận diện này đã được chấp nhận.
- CLOSED: Không có kết nối vì vậy socket bị hủy.
Danh sách những socket đang hoạt động
Để xem những socket đang hoạt động, thêm -l(listening) vào lệnh như sau:
ss -l
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
nl UNCONN 0 0 rtnl:NetworkManager/535 *
nl UNCONN 0 0 rtnl:evolution-addre/2987 *
...
u_str LISTEN 0 4096 /run/systemd/private 13349 * 0
u_seq LISTEN 0 4096 /run/udev/control 13376 * 0
u_str LISTEN 0 4096 /tmp/.X11-unix/X0 33071 * 0
u_dgr UNCONN 0 0 /run/systemd/journal/syslog 13360 * 0
u_str LISTEN 0 4096 /run/systemd/fsck.progress 13362 * 0
u_dgr UNCONN 0 0 /run/user/1000/systemd/notify 32303 * 0
Tất cả những socket này đều không có kết nối và đang hoạt động. “rtnl” nghĩa là routing netlink, sử dụng để truyền thông tin giữa kernel và các tiến trình userspace.
Liệt kê tất cả các socket
Để liệt kê tất cả các socket, bạn có thể sử dụng lựa chọn -a(all):
ss -a
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
nl UNCONN 0 0 rtnl:NetworkManager/535 *
nl UNCONN 0 0 rtnl:evolution-addre/2987 *
...
u_str LISTEN 0 100 public/showq 23222 * 0
u_str LISTEN 0 100 private/error 23225 * 0
u_str LISTEN 0 100 private/retry 23228 * 0
...
udp UNCONN 0 0 0.0.0.0:631 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:*
...
tcp LISTEN 0 128 [::]:ssh [::]:*
tcp LISTEN 0 5 [::1]:ipp [::]:*
tcp LISTEN 0 100 [::1]:smtp [::]:*
Kết quả sẽ bao gồm tất cả các socket bất kể tình trạng.
Liệt kê các socket TCP
Bạn có thể sử dụng một bộ lọc, chỉ lấy những socket cần hiển thị. Ở đây, chúng ta sử dụng lựa chọn -t(TCP), chỉ những socket TCP mới được liệt kê ra:
ss -a -t
Liệt kê các socket UDP
Lựa chọn -u(UDP) cũng là bộ lọc tương tự. Sử dụng nếu bạn chỉ muốn thấy socket UDP:
ss -a -u
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
UNCONN 0 0 0.0.0.0:631 0.0.0.0:*
UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:*
UNCONN 0 0 0.0.0.0:60734 0.0.0.0:*
UNCONN 0 0 127.0.0.53%lo:domain 0.0.0.0:*
ESTAB 0 0 192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps
UNCONN 0 0 [::]:mdns [::]:*
UNCONN 0 0 [::]:51193 [::]:*
Liệt kê các socket Unix
Để thấy các socket Unix, bạn có thể thêm -x (Unix) vào dòng lệnh như sau:
ss -a -x
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str ESTAB 0 0 * 41826 * 41827
u_str ESTAB 0 0 * 23183 * 23184
u_str ESTAB 28 0 @/tmp/.X11-unix/X0 52640 * 52639
...
u_str ESTAB 0 0 /run/systemd/journal/stdout 18887 * 18885
u_str ESTAB 0 0 /run/dbus/system_bus_socket 19273 * 17306
Liệt kê các raw socket
Để lọc raw socket, thêm -w (raw):
ss -a -w
Liệt kê socket IP phiên bản 4
Socket sử dụng giao thức TCP/IP phiên bản 4 có thể được liệt kê bằng cách sử dụng lựa chọn -4(IPV4):
ss -a -4
Liệt kê socket IP phiên bản 6
Bạn có thể dùng -6 (IPV6) để tìm những socket IP phiên bản 6:
ss -a -6
Liệt kê socket theo tình trạng
Bạn có thể liệt kê socket theo tình trạng. Nó sẽ chia làm các loại tình trạng như đã thành lập, đang hoạt động hoặc đã đóng.
Dùng lệnh sau nếu muốn tìm những kết nối TCP đã thành lập, lệnh ss sẽ liệt kê theo tên:
ss -t -r state established
Bốn kết nối được liệt kê đều ở trong tình trạng đã thành lập. Tên mạng chủ, ubuntu20-04, đã được giải quyết và “ssh” đã thể hiện thay vì 22 cho kết nối SSH ở dòng thứ hai.
Liệt kê socket theo giao thức
Bạn có thể liệt kê socket sử dụng một giao thức đặc biệt như dport và sport, tương ứng với các cổng đích và cổng nguồn.
Nhập nội dung sau để liệt kê các socket theo giao thức HTTPS trên một kết nối đã thiết lập (lưu ý mở khoảng trắng sau dấu ngoặc đơn và trước khi đóng):
ss -a state established ‘( dport = :https or sport = :https )’
Bạn có thể sử dụng tên giao thức hoặc cổng thường kết nối với giao thức. Cổng mặc định cho SSH là cổng 22.
Liệt kê các kết nối tới địa chỉ IP đặc biệt
Với lại chọn dst, bạn có thể liệt kê các kết nối tới một địa chỉ IP nhất định.
Dùng lệnh sau:
ss -a dst 192.168.4.25
Xác định quy trình
Để xem các quy trình đang sử dụng socket, bạn có thể sử dụng tùy chọn quy trình (-p), như hiển thị bên dưới (lưu ý phải sử dụng sudo):
sudo ss -t -p
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.4.28:57650 54.218.19.119:https users:(("firefox",pid=3378,fd=151))
ESTAB 0 0 192.168.4.28:ssh 192.168.4.25:43946 users:(("sshd",pid=4086,fd=4),("sshd",pid=3985,fd=4))
Tham khảo thêm: