Bài viết này sẽ giới thiệu với các bạn về cách theo dõi kết nối mạng dùng lệnh ss của hệ điều hành Linux. Trong bài viết này chúng ta sẽ tìm hiểu cách sử dụng lệnh ss
để chúng ta có thể tự học Linux một cách dể dàng hơn.
1. Giới thiệu lệnh ss
Công cụ ss
được sử dụng để giúp chúng ta cách hiển thị tất cả các thông tin của socket mạng trong hệ thống Linux. Nó cho phép hiển thị thông tin như netstat
và sẽ hiển thị nhiều thông tin trạng thái hơn các công cụ khác. Lệnh ss
sẽ lấy thông tin trực tiếp từ kernel.
Lệnh ss
cung cấp cho chúng ta các thông tin về:
- Tất cả các TCP sockets.
- Tất cả các UDP sockets.
- Tất cả các kết nối ssh/ftp/http/https.
- Tất cả các tiến trình được kết nối với máy chủ.
- Lọc trạng thái như: SYN-RECV, SYN-SENT,TIME-WAIT, địa chỉ port.
2. Sử dụng lệnh ss
👉 Ví dụ 1: Sử dụng lệnh ss
không chứa các tùy chọn để liệt kê tất cả các kết nối bất kì ở tất cả các trạng thái.
[root@blogd-net-lab01 ~]# ss
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 /var/lib/sss/pipes/nss 30476 * 30474
u_str ESTAB 0 0 * 22713 * 22712
u_str ESTAB 0 0 /run/dbus/system_bus_socket 23436 * 23435
u_str ESTAB 0 0 * 30554 * 30556
u_str ESTAB 0 0 /run/systemd/journal/stdout 19510 * 19509
u_str ESTAB 0 0 /run/systemd/journal/stdout 24221 * 24220
u_str ESTAB 0 0 /run/dbus/system_bus_socket 23869 * 23868
u_str ESTAB 0 0 * 23435 * 23436
u_str ESTAB 0 0 /var/lib/sss/pipes/nss 25476 * 25475
...
👉 Ví dụ 2: Chúng ta có thể sử dụng tùy chọn -a
kết hợp với lệnh ss
để hiển thị danh sách các listen socket và non-listen socket:
[root@blogd-net-lab01 ~]# ss -a
NetidState Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN 0 0 rtnl:1950352230 *
nl UNCONN 0 0 rtnl:kernel *
nl UNCONN 0 0 rtnl:NetworkManager/944 *
nl UNCONN 0 0 rtnl:NetworkManager/944 *
nl UNCONN 0 0 rtnl:1950352230 *
nl UNCONN 768 0 tcpdiag:kernel *
...
👉 Ví dụ 3: Sử dụng lệnh ss
với tùy chọn -l
hiển thị các listen socket như sau:
[root@blogd-net-lab01 ~]# ss -l
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN 0 0 rtnl:1950352230 *
nl UNCONN 0 0 rtnl:kernel *
nl UNCONN 0 0 rtnl:NetworkManager/944 *
nl UNCONN 0 0 rtnl:NetworkManager/944 *
nl UNCONN 0 0 rtnl:1950352230 *
nl UNCONN 4352 0 tcpdiag:ss/1744 *
nl UNCONN 768 0 tcpdiag:kernel *
nl UNCONN 0 0 xfrm:kernel *
nl UNCONN 0 0 selinux:kernel *
nl UNCONN 0 0 selinux:systemd/1685 *
...
👉 Ví dụ 4: Lệnh ss
giúp chúng ta hiển thị tất cả các kết nối bằng giao thức TCP bằng cách sử dụng tùy chọn -t
như bên dưới:
[root@blogd-net-lab01 ~]# ss -t
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.18.56:ssh 192.168.18.182:52614
👉 Ví dụ 5: Chúng ta có thể kết hợp tùy chon -l
với tùy chọn -t
bên trên để hiển thị các listen TCP đang kết nối như sau:
[root@blogd-net-lab01 ~]# ss -lt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
LISTEN 0 128 [::]:ssh [::]:*
👉 Ví dụ 6: Lệnh ss
giúp chúng ta hiển thị tất cả các kết nối UDP socket bằng cách sử dụng tùy chọn -u
và tùy chọn -a
như bên dưới:
[root@blogd-net-lab01 ~]# ss -ua
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 192.168.18.56%ens192:bootpc 0.0.0.0:*
UNCONN 0 0 127.0.0.1:323 0.0.0.0:*
UNCONN 0 0 [::1]:323 [::]:*
👉 Ví dụ 7: Chúng ta có thể kết hợp tùy chon -l
với tùy chọn -u
bên trên để hiển thị các listen UDP đang kết nối như sau:
[root@blogd-net-lab01 ~]# ss -lu
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 192.168.18.56%ens192:bootpc 0.0.0.0:*
UNCONN 0 0 127.0.0.1:323 0.0.0.0:*
UNCONN 0 0 [::1]:323 [::]:*
👉 Ví dụ 8: Để có thể hiển thị PID (ID của tiến trình) của cac socket đang được kết nối chúng ta sử dụng tùy chọn -p
kết hợp với lệnh ss
như bên dưới:
[root@blogd-net-lab01 ~]# ss -p
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 * 22713 * 22712 users:(("dbus-daemon",pid=871,fd=11))
u_str ESTAB 0 0 /run/dbus/system_bus_socket 23436 * 23435 users:(("dbus-daemon",pid=871,fd=13))
u_str ESTAB 0 0 * 30554 * 30556 users:(("(sd-pam",pid=1689,fd=2),("(sd-pam",pid=1689,fd=1),("systemd",pid=1685,fd=2),("systemd",pid=1685,fd=1))
u_str ESTAB 0 0 /run/systemd/journal/stdout 19510 * 19509 users:(("systemd-journal",pid=712,fd=16),("systemd",pid=1,fd=41))
u_str ESTAB 0 0 /run/systemd/journal/stdout 24221 * 24220 users:(("systemd-journal",pid=712,fd=25),("systemd",pid=1,fd=55))
...
👉 Ví dụ 9: Khi chúng ta muốn liệt kê tổng các trạng thái của socket trên máy chủ của chúng ta thì sử dụng lệnh ss
với tùy chọn -s
như sau:
[root@blogd-net-lab01 ~]# ss -s
Total: 157
TCP: 3 (estab 1, closed 0, orphaned 0, timewait 0)
Transport Total IP IPv6
RAW 1 0 1
UDP 3 2 1
TCP 3 2 1
INET 7 4 3
FRAG 0 0 0
👉 Ví dụ 10: Để hiển thị các địa chỉ IPV4 của socket đang kết nối chúng ta sử dụng tùy chọn -4
cùng với lệnh ss
:
[root@blogd-net-lab01 ~]# ss -4
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 192.168.18.56:ssh 192.168.18.182:52614
👉 Ví dụ 11: Để hiển thị các địa chỉ IPV6 của socket đang kết nối chúng ta sử dụng tùy chọn -6
cùng với lệnh ss
:
[root@blogd-net-lab01 ~]# ss -6
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
👉 Ví dụ 12: Lệnh ss
cho phép chúng ta lọc socket port number hoặc address number. Để hiển thị tất cả các kết nối của socket đích hoặc socket nguồn của ssh
chúng ta thực thi lệnh sau:
[root@blogd-net-lab01 ~]# ss -at '( dport = :22 or sport = :22 )'
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
ESTAB 0 0 192.168.18.56:ssh 192.168.18.182:52614
LISTEN 0 128 [::]:ssh [::]:*
Hoặc lệnh bên dưới:
[root@blogd-net-lab01 ~]# ss -at '( dport = :ssh or sport = :ssh )'
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
ESTAB 0 0 192.168.18.56:ssh 192.168.18.182:52614
LISTEN 0 128 [::]:ssh [::]:*
3. Lời kết
Qua bài trên, giúp cho chúng ta cách hiển thị tất cả các thông tin của socket mạng của hệ điều hành Linux. Đây là một công cụ cực kỳ hữu ích để chúng ta có thể theo dõi các kết nối và socket. Từ đó giúp chúng ta quản lý máy chủ một cách tốt nhất.