Cách sử dụng lệnh ss trên Linux

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.

Một kết quả sau khi dùng lệnh ss
Một kết quả sau khi dùng lệnh ss

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: 

Thứ Sáu, 31/07/2020 08:10
31 👨 118
0 Bình luận
Sắp xếp theo