Giới thiệu
netstat (network statistics) là một công cụ mạng nằm trong gói công cụ net-tools, sử dụng dòng lệnh, được sử dụng để khắc phục sự cố và cấu hình mạng. netstat là công cụ hoạt động đa nền tảng, được tích hợp sẵn trên các hệ điều hành Linux, Unix-Like và có sẵn trên cả Windows. Đây là một trong những công cụ gỡ lỗi dịch vụ mạng cơ bản nhất trên Unix/Linux, mạnh mẽ và rất hữu dụng đối với quản trị viên mạng Linux cũng như quản trị viên hệ thống trong việc giải quyết các vấn đề về sự cố liên quan đến network như là lượng connect kết nối, traffic, tốc độ, trạng thái của từng port, Ip... Nó cũng có thể được coi là một công cụ monitor, giúp giám sát các kết nối mạng (cả đến và đi) bằng cách cung cấp các thông tin như bảng định tuyến hay một số thống kê giao diện mạng.
Trong phạm vi bài viết này, mình sẽ cùng các bạn tìm hiểu sử dụng netstat trên hệ điều hành Linux nhé! ))
Note
Hiện tại bộ công cụ iproute2 đã được thay thế mặc định cho bộ công cụ net-tools ở các bản phân phối Linux mới như RHEL7, CentOS 7,... Cùng với đó, công cụ ss mới cũng được sử dụng thay cho netstat với một số ưu điểm ưu điểm đơn giản hơn và nhanh hơn công cụ truyền thống netstat. Các chức năng và cách sử dụng của lệnh ss nhìn chung cũng tương tự như netstat.
Các tùy chọn thiết lập lệnh netstat
Lệnh netstat được xây dựng với nhiều các cờ tùy chọn khác nhau, để xem thông tin sử dụng lệnh và các tùy chọn, bạn sẽ dử dụng netstat -h
hoặc netstat --help
thanhthu ~ netstat -h
usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}
netstat [-vWnNcaeol] [<Socket> ...]
netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }
-r, --route display routing table
-i, --interfaces display interface table
-g, --groups display multicast group memberships
-s, --statistics display networking statistics (like SNMP)
-M, --masquerade display masqueraded connections
-v, --verbose be verbose
-W, --wide don't truncate IP addresses
-n, --numeric don't resolve names
--numeric-hosts don't resolve host names
--numeric-ports don't resolve port names
--numeric-users don't resolve user names
-N, --symbolic resolve hardware names
-e, --extend display other/more information
-p, --programs display PID/Program name for sockets
-o, --timers display timers
-c, --continuous continuous listing
-l, --listening display listening server sockets
-a, --all display all sockets (default: connected)
-F, --fib display Forwarding Information Base (default)
-C, --cache display routing cache instead of FIB
-Z, --context display SELinux security context for sockets
<Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}
{-x|--unix} --ax25 --ipx --netrom
<AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: inet
List of possible address families (which support routing):
inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
Có rất nhiều tùy chọn, một số tùy chọn phổ biến thường được sử dụng mà bạn có thể chú ý ở đây là
-a
: Hiển thị tất cả các sockets, kể cả listening và non-listening-l
: Hiển thị các socket đang lắng nghe-t
: Chỉ hiển thị các kết nối tcp-u
: Chỉ hiển thị các kết nối udp-n
: Xem địa chỉ số (không phân giải)-p
: Hiển thị chương trình PID cho từng socket-r
: Hiển thị bảng định tuyến-s
: Pull và hiển thị thống kê mạng được sắp xếp theo giao thức-i
: Hiển thị danh sách các giao diện mạng
Tiếp theo, mình sẽ chỉ cho các bạn một vài ví dụ cụ thể trong việc sử dụng lệnh netstat
này nha!
Các ví dụ lệnh netstat thường được sử dụng
1. Liệt kê tất cả các port
netstat -a
thanhthu ~ netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:32182 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:40131 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:32196 0.0.0.0:* LISTEN
tcp 0 0 localhost:10248 0.0.0.0:* LISTEN
tcp 0 0 localhost:10249 0.0.0.0:* LISTEN
tcp 0 0 localhost:35947 0.0.0.0:* LISTEN
tcp 0 0 localhost:sge-qmaster 0.0.0.0:* LISTEN
tcp 0 0 localhost:10256 0.0.0.0:* LISTEN
tcp 0 0 i121035-lt:45024 1.80.190.35.bc.go:https ESTABLISHED
tcp 0 0 i121035-lt:59730 th-in-f100.1e100.:https ESTABLISHED
tcp 0 0 localhost:sge-qmaster localhost:48358 ESTABLISHED
tcp 0 0 i121035-lt:50182 server-54-192-23-:https ESTABLISHED
tcp 0 0 localhost:48312 localhost:sge-qmaster ESTABLISHED
tcp 0 0 localhost:59498 localhost:6443 ESTABLISHED
tcp 0 0 localhost:sge-qmaster localhost:48360 ESTABLISHED
tcp 0 0 localhost:59672 localhost:6443 ESTABLISHED
tcp 0 0 i121035-lt:44486 ti-in-f94.1e100.n:https ESTABLISHED
tcp 0 0 localhost:59688 localhost:6443 ESTABLISHED
tcp 0 0 localhost:59634 localhost:6443 ESTABLISHED
tcp 0 0 localhost:sge-qmaster localhost:48300 ESTABLISHED
tcp 0 0 i121035-lt:43512 10.42.0.36:5000 TIME_WAIT
Đây là một lệnh kiểm tra tổng quá, nó bao gồm rất rất nhiều thông tin bao gồm tất cả các port ( của cả giao thức TCP và UDP), các listening và non-listening sockets. Bởi vì bao gồm rất nhiêu thứ nên trong thực tế, khi sử dụng , ta sẽ kết hợp tùy chọn cùng các tùy chọn khác để lọc ra các nhóm thông tin cụ thể cũng như chi tiết hơn như các lệnh dưới đây.
netstat -at
: Chỉ kiểm tra các port TCPnetstat -au
: Chỉ kiểm tra các port UDPnetstat -l
: Đây là tùy chọn có phạm vi nhỏ hơn-a
khi chỉ liệt kê các port đang ở trạng thái listening. Tùy chọn này cũng thường đi kèm với tùy chọn-t
hay-u
để lọc ra các kết nối TCP hay UDP.
Kiểm tra các tiến trình
Sử dụng tùy chọn -p
của netstat sẽ hiển thị cho chúng ta thấy tên chương trình và process ID (PID) của chúng. Chẳng hạn như ta sử dụng lệnh netstat -ltupn
. Lệnh này có ý nghĩa sẽ hiển thị tất cả port TCP và UDP đang ở trạng thái listening cùng với tên chương trình và PID của chúng. Ở đây mình hay dùng thêm tùy chọn -n
để hiển thị các địa chỉ và số cổng được biểu diễn dưới dạng số, mà không hiển thị một tên cụ thể.
thanhthu ~ netstat -pltun
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 664/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1271/sshd
tcp 0 0 0.0.0.0:32182 0.0.0.0:* LISTEN 2945/k3s
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 27507/cupsd
tcp 0 0 127.0.0.1:40131 0.0.0.0:* LISTEN 2945/k3s
tcp 0 0 0.0.0.0:32196 0.0.0.0:* LISTEN 2945/k3s
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 2945/k3s
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 2945/k3s
tcp 0 0 127.0.0.1:35947 0.0.0.0:* LISTEN 966/containerd
tcp 0 0 127.0.0.1:6444 0.0.0.0:* LISTEN 2945/k3s
tcp 0 0 127.0.0.1:10256 0.0.0.0:* LISTEN 2945/k3s
tcp6 0 0 :::22 :::* LISTEN 1271/sshd
tcp6 0 0 ::1:631 :::* LISTEN 27507/cupsd
tcp6 0 0 :::10250 :::* LISTEN 2945/k3s
tcp6 0 0 :::3306 :::* LISTEN 3678/docker-proxy
tcp6 0 0 :::10251 :::* LISTEN 2945/k3s
tcp6 0 0 :::6443 :::* LISTEN 2945/k3s
tcp6 0 0 :::10252 :::* LISTEN 2945/k3s
udp 0 0 127.0.0.53:53 0.0.0.0:* 664/systemd-resolve
udp 0 0 0.0.0.0:68 0.0.0.0:* 30433/dhclient
udp 0 0 0.0.0.0:8472 0.0.0.0:* -
udp 0 0 0.0.0.0:631 0.0.0.0:* 27508/cups-browsed
udp 0 0 0.0.0.0:43286 0.0.0.0:* 816/avahi-daemon: r
udp 0 0 224.0.0.251:5353 0.0.0.0:* 25223/chrome
udp 0 0 224.0.0.251:5353 0.0.0.0:* 25223/chrome
udp 0 0 224.0.0.251:5353 0.0.0.0:* 25329/chrome --type
udp 0 0 224.0.0.251:5353 0.0.0.0:* 25329/chrome --type
udp 0 0 0.0.0.0:5353 0.0.0.0:* 816/avahi-daemon: r
udp6 0 0 :::43431 :::* 816/avahi-daemon: r
udp6 0 0 :::5353 :::* 816/avahi-daemon: r
Hiển thị thống kê mạng
Để hiển thị các thông tin thống kê mạng, chúng ta sử dụng lệnh netstat -s
hoặc cũng có thể lọc thông tin theo các kết nối TCP, UDP...
thanhthu ~ netstat -s
Ip:
Forwarding: 1
882951 total packets received
1 with invalid addresses
129399 forwarded
0 incoming packets discarded
752132 incoming packets delivered
851013 requests sent out
280 dropped because of missing route
2 reassemblies required
1 packets reassembled ok
Icmp:
115 ICMP messages received
30 input ICMP message failed
ICMP input histogram:
destination unreachable: 110
echo requests: 2
echo replies: 3
353 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 348
echo requests: 3
echo replies: 2
IcmpMsg:
InType0: 3
InType3: 110
InType8: 2
OutType0: 2
.....................
Hiển thị bảng định tuyến
Để xem bảng định tuyến IP của kernel, chúng ta sử dụng lệnh netstat -r
:
thanhthu ~ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default _gateway 0.0.0.0 UG 0 0 0 enp1s0
10.42.0.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
link-local 0.0.0.0 255.255.0.0 U 0 0 0 enp1s0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-0eadd6bb4887
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-d21d6936f375
192.168.19.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s0
Hiển thị các giao diện mạng
Để hiển thị các giao diện mạng của kernel, chúng ta sử dụng lệnh netstat -i
thanhthu ~ netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
br-0eadd 1500 1 0 0 0 629 0 0 0 BMRU
br-d21d6 1500 0 0 0 0 0 0 0 0 BMU
cni0 1450 360459 0 0 0 370384 0 0 0 BMRU
docker0 1500 0 0 0 0 0 0 0 0 BMU
enp1s0 1500 521818 0 647 0 229844 0 0 0 BMRU
flannel. 1450 0 0 0 0 0 0 625 0 BMRU
lo 65536 435776 0 0 0 435776 0 0 0 LRU
veth8509 1450 93651 0 0 0 47643 0 0 0 BMRU
veth0698 1450 15316 0 0 0 15264 0 0 0 BMRU
Netstat kết hợp cùng các lệnh linux khác
Ngoài kết hợp giữa các tùy chọn chỉ thị lệnh khác nhau, netstat càng trở nên hữu dụng hơn khi được kết hợp với các lệnh linux khác bằng cách sử dụng cơ chế đường ống pipe
trong linux. Ví dụ:
- Khi bạn muốn kiểm tra một cổng cụ thể, chẳng hạn như cổng 22:
netstat -lntp | grep ':22'
thanhthu ~ netstat -lntp | grep ':22'
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1271/sshd
tcp6 0 0 :::22 :::* LISTEN 1271/sshd
- Hiện thị số kết nối của mỗi ip đến server
netstat -apn |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
thanhthu ~ netstat -apn |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
1 10.0.1.9
1 10.0.4.115
1 10.42.0.33
1 1.54.241.81
1 74.125.23.189
1 91.108.56.150
2 10.42.0.39
2 10.43.69.202
2 13.230.76.0
2 162.247.242.21
2 192.168.19.60
2 74.125.204.94
3 10.42.0.35
3 104.21.92.71
3 13.225.89.117
4 10.42.0.28
4 10.42.0.29
4 172.67.188.158
6 10.42.0.26
6 10.42.0.40
9
12 10.42.0.42
13 10.42.0.30
25 0.0.0.0
136 127.0.0.1
Trong đó:
netstat -apn
: Hiển thị tất cả các kết nối cùng tên chương trình và PID của chúng, các địa chỉ ip và port ở dạng số, không phân giải tên.grep 'tcp\|udp'
: Lọc lấy các kết nối TCP và UDPawk '{print $5}'
: Chỉ in ra cột số 5 là cột IP:PORTcut -d: -f1
: Chia các dòng kết quả thành các cột, điểm phân chia là ký tự : sau đó lấy thông tin cột 1 (các IP không có cổng)sort
: sắp xếp kết quảuniq -c
: nhóm các IP giống nhau lại, hiển thị ra cột đầu tiên sẽ hiển thị số lượng của các IP giống nhausort -n
: sắp xếp kết quả theo số, từ thấp đến cao
Tạm kết
Qua bài viết trên, mình đã giới thiệu đến các bạn các chức năng cũng như cách dùng cơ bản của netstat. Hy vọng qua bài viết này, các bạn có thể hiểu và nắm rõ hơn về netstat - một phương pháp kinh điển để khắc phục các sự cố về mạng trên hệ điều hành Unix/Linux.
Cảm ơn các bạn đã theo dõi bài viết của mình :3