Chương trình lệnh ss (socket statistic) trên Linux có khả năng cung cấp thông tin về network/socket kết nối hay hơn và nhanh hơn nhiều so với công cụ truyền thống ‘netstat‘. Lệnh ss cũng dần được thay thế công cụ ‘netstat‘ trên 1 số hệ thống OS mới. Lý do ví sao ‘ss‘ nhanh hơn ‘netstat‘ là do ‘netstat‘ phải đọc thông tin files trong thư mục /proc để thu thập dữ liệu hiển thị, cách tiếp cận này sẽ khó khăn nếu hệ thống có quá nhiều kết nối tới. Còn chương trình lệnh ss thì sẽ lấy dữ liệu trực tiếp từ kernel space nên nhanh hơn rất nhiều.
Vậy trong bài viết này, chúng ta cùng xem khả năng kiểm tra các kết nối network và thống kê socket bằng lệnh SS trên Linux nhé.
Cú pháp lệnh lệnh ss
# ss [ OPTIONS ]
hoặc
# ss [ OPTIONS ] [ FILTER ]
Contents
- 1. Liệt kê toàn bộ các kết nối
- 2. Liệt kê riêng các kết nối TCP/UDP/Unix connection
- 3. Liệt kê các port network đang được mở
- 4. In thông tin thống kê tổng kết
- 5. Liệt kê các kết nối socket IPv4 hoặc IPv6
- 6. Hiển thị thông tin bộ đếm thời gian của kết nối
- 7. Hiển thị tên tiến trình và pid
- 8. Lọc các kết nối với trạng thái TCP
- 9. Lọc các kết nối dựa trên địa chỉ IP và Port
1. Liệt kê toàn bộ các kết nối
# ss | less State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 125.212.220.11:http 118.68.8.165:56212 ESTAB 0 0 125.212.220.55:http 113.174.174.246:58363 ESTAB 0 0 125.212.220.11:http 66.249.79.86:59041 ESTAB 0 0 125.212.220.11:http 66.249.71.47:64738 ESTAB 0 0 125.212.220.55:http 113.174.174.246:58366 ESTAB 0 128 125.212.220.11:ssh 125.212.220.68:48806 ESTAB 0 0 125.212.220.11:http 118.68.8.165:56211 ESTAB 0 0 125.212.220.11:http 115.72.59.242:51140
2. Liệt kê riêng các kết nối TCP/UDP/Unix connection
+ Liệt kê các kết nối TCP.
– Mặc định, nếu chỉ sử dụng option “-t” thì chương trình chỉ report các kết nối đang ở trạng thái “ESTABLISHED” hoặc “CONNECTED“. Nếu sử dụng option “-ta” thì sẽ liệt kê đầy đủ các trạng thái khác liên quan.
# ss -ta # ss -t State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 125.212.220.55:http 153.191.2.145:50919 CLOSING 1 10387 125.212.220.11:http 192.243.55.134:6052 ESTAB 0 0 125.212.220.11:ssh 125.212.220.68:48806 ESTAB 0 0 125.212.220.55:http 153.191.2.145:50921 ESTAB 0 0 125.212.220.11:http 203.205.62.105:65263 ESTAB 0 0 125.212.220.11:http 116.100.68.245:45893 ESTAB 0 0 125.212.220.55:http 42.119.112.100:57318 ESTAB 0 0 125.212.220.55:http 42.119.112.100:57317 LAST-ACK 0 554 125.212.220.55:http 92.21.229.62:51798 FIN-WAIT-1 0 83 ::ffff:125.212.220.11:mysql ::ffff:222.186.130.158:myrtle ESTAB 0 0 125.212.220.55:http 66.249.71.107:61719 ESTAB 0 0 125.212.220.11:http 31.13.102.99:10852 CLOSING 1 1 ::ffff:125.212.220.61:mysql ::ffff:222.186.130.158:xnds
+ Liệt kê các kết nối UDP
# ss -u # ss -ua State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 192.168.1.2:48268 *:* UNCONN 0 0 192.168.1.2:56575 *:* UNCONN 0 0 *:40309 *:* UNCONN 0 0 192.168.1.2:56879 *:* UNCONN 0 0 *:49014 *:* UNCONN 0 0 192.168.1.2:53124 *:* UNCONN 0 0 127.0.1.1:domain *:*
+ Liệt kê các kết nối Unix socket
# ss -x u_str ESTAB 0 0 /var/run/dovecot/login/login 43806080 * 0 u_str ESTAB 0 0 * 43820121 * 0 u_str ESTAB 0 0 /var/lib/mysql/mysql.sock 43820122 * 0 u_str ESTAB 0 0 * 43823233 * 0 u_str ESTAB 0 0 * 43824772 * 0 u_str ESTAB 0 0 * 43828306 * 0 u_str ESTAB 0 0 /var/lib/mysql/mysql.sock 43828307 * 0 u_str ESTAB 0 0 * 43830757 * 0
3. Liệt kê các port network đang được mở
– Các option “-ltn” hoặc “-lun” sẽ giúp liệt kê các port network tcp/udp đang được mở mà không cần phân giải tên port làm gì.
– Còn option “-l” thì sẽ liệt kê toàn bộ các port đang listen.
# ss -ltn # ss -lun # ss -l LISTEN 0 50 :::submission :::* LISTEN 0 128 :::memcache :::* LISTEN 0 128 *:memcache *:* LISTEN 0 128 :::pop3 :::* LISTEN 0 128 *:pop3 *:* LISTEN 0 128 127.0.0.1:783 *:* LISTEN 0 128 :::imap :::* LISTEN 0 128 *:imap *:* LISTEN 0 45 *:nbx-ser *:* LISTEN 0 10 *:webcache *:* LISTEN 0 45 *:nbx-dir *:*
4. In thông tin thống kê tổng kết
– Sử dụng option “-s” .
Total: 418 (kernel 689) TCP: 1882 (estab 68, closed 1747, orphaned 16, synrecv 0, timewait 1747/0), ports 307 Transport Total IP IPv6 * 689 - - RAW 0 0 0 UDP 11 9 2 TCP 135 118 17 INET 146 127 19 FRAG 0 0 0
5. Liệt kê các kết nối socket IPv4 hoặc IPv6
– Liệt các kết nối socket IPv4 với option ‘-f inet‘ hoặc ‘-4‘.
# ss -tl -f inet State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* LISTEN 0 128 *:10050 *:* LISTEN 0 128 127.0.0.1:smux *:* LISTEN 0 128 *:ssh *:*
– Liệt các kết nối socket IPv6 với option ‘-f inet6‘ hoặc ‘-6‘.
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 ::1:smtp :::* LISTEN 0 128 :::ssh :::*
6. Hiển thị thông tin bộ đếm thời gian của kết nối
– Với option ‘-o‘ thì thông tin thời gian tồn tại của từng kết nối sẽ được hiển thị kèm theo.
# ss -tn -o State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:43839 108.160.162.37:80 ESTAB 0 0 192.168.1.2:36335 204.144.140.26:80 timer:(keepalive,26sec,0) ESTAB 0 0 192.168.1.2:33141 83.170.73.249:6667 ESTAB 0 0 192.168.1.2:58857 74.121.141.84:80 timer:(keepalive,23sec,0) ESTAB 0 0 192.168.1.2:42794 173.194.40.239:80 timer:(keepalive,32sec,0)
7. Hiển thị tên tiến trình và pid
– Để hiển thị thông tin tên tiến trình/pid đang sở hữu sử dụng kết nối tương ứng thì ta thêm option ‘-p‘.
# ss -ltp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* users:(("master",2051,12)) LISTEN 0 128 *:90 *:* users:(("nginx",1701,6),("nginx",1700,6),("nginx",1699,6),("nginx",1697,6),("nginx",1696,6)) LISTEN 0 5 127.0.0.1:6600 *:* users:(("mpd",2392,5)) LISTEN 0 128 127.0.0.1:9000 *:* users:(("php5-fpm",1620,0),("php5-fpm",1619,0),("php5-fpm",1616,7)) LISTEN 0 16 *:2633 *:* users:(("oned",1853,16)) LISTEN 0 50 127.0.0.1:mysql *:* users:(("mysqld",1095,10)) LISTEN 0 5 127.0.1.1:domain *:* users:(("dnsmasq",1347,5)) LISTEN 0 32 *:ftp *:* users:(("vsftpd",1051,3)) LISTEN 0 128 *:ssh *:* users:(("sshd",1015,3)) LISTEN 0 128 127.0.0.1:ipp *:* users:(("cupsd",688,11)) LISTEN 0 128 :::http :::* users:(("apache2",5322,4),("apache2",5321,4),("apache2",5317,4),("apache2",5316,4),("apache2",5313,4),("apache2",2505,4)) LISTEN 0 128 :::ssh :::* users:(("sshd",1015,4)) LISTEN 0 128 ::1:ipp :::* users:(("cupsd",688,10))
8. Lọc các kết nối với trạng thái TCP
Chương trình lệnh ‘ss‘ hỗ trợ tuyệt vời trong khả năng lọc thông số liên quan để hiển thị thông tin bạn mong muốn. ‘ss‘ thực hiện chức năng lọc với cấu trúc lệnh như sau :
# ss [ OPTIONS ] [ STATE-FILTER ] [ ADDRESS-FILTER ]
Sau đây sẽ là các ví dụ thể hiện khả năng lọc các kết nối socket dựa trên các trạng thái TCP.
Vd 8.1:
– Hiển thị toàn bộ kết nối TCP IPv4 ở trạng thái ‘established‘.
# ss -t4 state established Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.1.2:54436 165.193.246.23:https 0 0 192.168.1.2:43386 173.194.72.125:xmpp-client 0 0 192.168.1.2:38355 199.59.150.46:https 0 0 192.168.1.2:56198 108.160.162.37:http
– Hiển thị toàn bộ kết nối TCP IPv4 ở trạng thái ‘time-wait‘.
# ss -t4 state time-wait Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.1.2:42261 199.59.150.39:https 0 0 127.0.0.1:43541 127.0.0.1:2633
– Danh sách trạng thái bạn có thể filter như sau :
+ established
+ syn-sent
+ syn-recv
+ fin-wait-1
+ fin-wait-2
+ time-wait
+ closed
+ close-wait
+ last-ack
+ closing
+ all – tất cả các trạng thái trên
+ connected – các trạng thái ngoại trừ trạng thái ‘listen’ và ‘closed’.
+ synchronized – các trạng thái ngoại trừ trạng thái ‘listen’ và ‘syn-sent’.
9. Lọc các kết nối dựa trên địa chỉ IP và Port
Ngoài khả năng lọc thông tin kết nối dựa trên trạng thái TCP thì ‘ss’ cũng hỗ trợ lọc thông tin dựa trên địa chỉ IP và port của kết nối socket. Sau đây là các ví dụ thể hiện điều đó.
Lưu ý:
– ‘source port‘ : là chỉ thông tin port của hệ thống bạn đang khởi chạy lệnh.
– ‘destination port‘ : là chỉ thông tin port của server remote.
– Thông tin port được bắt đầu bằng dấu ‘:‘.
Vd 9.1 :
– Liệt kê thông tin kết nối socket với source port HTTP hoặc HTTPS.
# ss -nt '( dst :443 or dst :80 )' State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:58844 199.59.148.82:443 ESTAB 0 0 192.168.1.2:55320 165.193.246.23:443 ESTAB 0 0 192.168.1.2:56198 108.160.162.37:80 ESTAB 0 0 192.168.1.2:54889 192.241.177.148:443 ESTAB 0 0 192.168.1.2:39893 173.255.230.5:80 ESTAB 0 0 192.168.1.2:33440 38.127.167.38:443 # ss -nt4 src :443 or src :80 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:80 199.59.148.82:443 ESTAB 0 0 192.168.1.2:80 165.193.246.23:443 ESTAB 0 0 192.168.1.2:80 108.160.162.37:80 ESTAB 0 0 192.168.1.2:80 192.241.177.148:443 ESTAB 0 0 192.168.1.2:80 173.255.230.5:80 ESTAB 0 0 192.168.1.2:80 38.127.167.38:443
Vd 9.2:
– Lọc theo địa chỉ IP từ remote kết nối tới server.
# ss -nt dst 74.125.236.178
– Lọc IP theo lớp network CIDR cũng ok luôn.
# ss -nt dst 74.125.236.178/16
– Lọc IP kết hợp thông tin port.
# ss -nt dst 74.125.236.178:80
Vd 9.3:
– Bạn có thể sử dụng những biểu thức điều kiện như sau :
+ > hoặc gt : nhiều hơn giá trị so sánh.
+ < hoặc lt : ít hơn giá trị so sánh.
+ <= hoặc le : ít hơn hoặc bằng giá trị so sánh.
+ => hoặc ge : nhiều hơn hoặc bằng giá trị so sánh.
+ == hoặc eq : bằng giá trị so sánh.
+ != hoặc ne : không bằng giá trị so sánh.
– Lọc theo port có giá trị lớn hơn 5000.
# ss -nt src 127.0.0.1 sport gt :5000
– Lọc theo port có giá trị bằng port 25
# sudo ss -ntlp sport eq :smtp
Như vậy là ta đã điểm qua các ví dụ về sử dụng chương trình lệnh ‘ss‘ rồi nhé. Cám ơn các bạn đã đọc bài viết tại Cuongquach.com . Còn rất nhiều lệnh Linux khác đang đợi bạn tìm hiểu đấy.