Linux网络管理命令

一、Linux网络命令概述

1.1 Linux网络命令概述

Linux系统在网络管理中占据重要地位。无论是服务器管理、网络诊断还是安全维护,Linux网络命令都能提供强大的支持。

Linux网络命令用于诊断和测试网络连接、服务可达性以及应用之间的通信。

Linux 常用的网络命令有:pingnetstatssnctelnettcpdumpdignslookupiptablesarproutetracerouteipifconfigcurl等等。

二、Linux 网络命令功能用法

2.1 ping - 检查网络主机连通性测试

ping 命令用于测试网络主机之间的连通性。

基本用法

1
ping [Options] host/ip

2.2 traceroute - 网络诊断命令

traceroute (Windows 系统下是tracert) 是一个网络诊断工具,利用ICMP 协议定位跟踪数据包从源主机到目标主机(通常是一个网站或IP地址)所经过的所有路由路径。TTL 值(存活时间)可以反映数据包经过的路由器或网关的数量,通过操纵独立ICMP 呼叫报文的TTL 值和观察该报文被抛弃的返回信息,traceroute命令能够遍历到数据包传输路径上的所有路由器。

Tps: TTL 是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。

这个工具在 Linux 系统中广泛使用,帮助网络管理员和用户了解数据包在网络中的传输情况,了解网络中的哪些部分可能存在问题(例如延迟或丢包),从而诊断网络问题。

traceroute 的工作原理

  • 存活时间(TTL):traceroute 利用 IP 数据包的 TTL 字段来确定数据包经过的每个网络设备。每当数据包经过一个路由器(一个网段),其存活时间就会减1,当其存活时间是0时,主机便取消(丢弃)数据包,并传送一个ICMP TTL数据包给原数据包的发出者。
  • 发送探测包:traceroute 首先发送 3 个 TTL 为 1 的数据包(到目标主机),数据包到达第一个路由器,路由器会将该包的 TTL 减 1,然后检查发现该包的 TTL 为 0 后将其丢弃 并 返回一个 ICMP 时间超过(TTL exceeded)的消息。
  • 收集并展示信息:traceroute 收集这个 ICMP 消息,并显示第一个路由器的 IP 地址和3个包的往返时间(RTT)。
  • 逐步增加 TTL,重复探测过程:然后 traceroute 逐步增加 探测包的 TTL 值并重复上述 “发送探测包”“收集并展示信息” 这个过程,每次 TTL 增加 1,直到数据包到达目标主机或达到最大 TTL 值(默认为30,实际值见 traceroute 命令输出的第一行 中的 hops max)后结束探测(退出)。

traceroute 命令的一些基本用法和参数

1
traceroute [options] host/ip [packetlen]

Options:

  • -A:使用AS(自治系统)路径,显示每个跳转点的自治系统号码。
  • -d:使用SO_DEBUG选项,启用调试输出。
  • -4:使用IPv4地址。
  • -6:使用IPv6地址。
  • -m:设置最大 TTL 值,即最大跳数,例如:-m 10 表示最多追踪 10 个跃点。默认(不设置)是30。
  • -n:不将 IP 地址解析为主机名,仅显示IP地址,可减少 DNS 查找的时间。
  • -p:指定发送数据包时使用的端口号,对于 ICMP 协议则是指定初始的 ICMP 序号(默认是33434)。
  • -t:设置数据包的TTL(Time to Live)值。
  • -q:设置每跳探测数据包的数量,默认值为 3。
  • -I:使用ICMP ECHO请求来追踪路径。
  • -T:使用TCP SYN包进行追踪。
  • -U:使用UDP数据包进行追踪。
  • -V:显示程序的版本信息
  • -w:设置等待每次回复的时间(超时时间 wait time),单位是秒,默认是5秒。
  • -i:使用指定的网络接口送出数据包。
  • -z:每发送完一个 TTL 值的数据包后暂停一段时间,默认为 1 秒。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[root@m ~]# traceroute www.baidu.com
traceroute to www.baidu.com (183.240.98.198), 30 hops max, 60 byte packets
 1  192.168.0.1 (192.168.0.1)  0.989 ms  2.408 ms  2.394 ms
 2  192.168.1.1 (192.168.1.1)  1.676 ms  1.904 ms  1.899 ms
 3  10.68.0.1 (10.68.0.1)  5.133 ms  5.352 ms  6.192 ms
 4  183.224.90.37 (183.224.90.37)  7.160 ms  7.395 ms  7.386 ms
 5  221.183.49.69 (221.183.49.69)  8.355 ms  8.346 ms 221.183.78.45 (221.183.78.45)  7.895 ms
 6  221.183.41.29 (221.183.41.29)  45.490 ms 221.183.41.113 (221.183.41.113)  38.399 ms  33.005 ms
 7  * * 221.183.79.146 (221.183.79.146)  32.953 ms
 8  120.241.249.6 (120.241.249.6)  43.480 ms 120.241.249.22 (120.241.249.22)  44.842 ms *
 9  * * *
...
29  * * *
30  * * *
[root@m ~]#

traceroute命令输出解释

  • 第一行显示了目标地址和一些其它参数信息,比如尝试探测的最大跳数、探测报文的字节数。
  • 后续的每一行代表一个 跃点,从本地网络开始,直到目标服务器,其中:
    • 第一列:跳数(Hop Number,网络路径上跃点的序号),每个跳数代表数据包在到达目标主机途中经过的一个路由器或网络设备。
    • 第二列:通常形式是跃点的主机名(后跟着IP),这是数据包在该跳数到达的路由器或网络设备的 IP 地址(如果能够解析 IP 地址)。
    • 第三列:数据包从源主机到当前主机的往返时间(RTT,Round-Trip Time)。显示了数据包从发送到接收到返回的时间,单位通常是毫秒(ms)。

Tips:

  • 每一行通常会有三组 跃点主机名(后跟着IP)RTT 值,这是因为 traceroute 默认发送三个探测数据包到每个跃点(跳数)。
  • 如果 一个 RTT 值 前面的 跃点主机名(后跟着IP) 省略(未列出),则表示该 RTT 值跃点主机名(后跟着IP) 与前一个 RTT 值跃点主机名(后跟着IP) 相同,以此类推,直到找到该行的 第二列 跃点主机名(后跟着IP)
  • 星号 (*):如果某个跃点的网络设备没有响应某一个探测包(这通常表示在该跳点发生了数据包丢失或超时) 或者 由于跃点网络策略不发送 ICMP 消息,那么该行中 该探测包将显示星号(*)。

使用场景:

  • 确定网络延迟的原因。(观察 traceroute 输出中跳数的增加、识别延迟峰值RTT等)
  • 识别网络中可能的瓶颈。
  • 了解数据包的路由路径。
  • 诊断网络连接问题。

注意事项:

  • traceroute 可能需要管理员权限,特别是在使用 ICMP 时。
  • 某些网络可能配置为不响应 traceroute 请求,导致路径中的某些跃点不显示 (用 * 表示)。
  • 使用traceroute可能会受到网络安全策略的限制。

常见问题

  • 部分跳数显示为星号(* * *):
    • 每一个 * 表示发送出去的 一个探测包未返回 ICMP 消息,这可能是由于中间路由器配置了防火墙,禁止ICMP或者UDP探测包的返回。
  • 到达中间某一跳后停止(未到达目标主机 或 最大 TTL):
    • 可能是由于中间某个路由器配置了防火墙,导致后续探测包无法通过。
  • 不同的操作系统可能有不同的实现:
    • traceroute 在不同操作系统上的实现可能有所差异,例如在Windows上对应的工具是 tracert。

2.3 mtr(My Traceroute)命令

mtr(My Traceroute)命令是一种网络诊断工具,它结合了ping和traceroute的功能,用于分析网络连接的路径和质量。

使用 mtr 命令诊断网络延迟问题是一种有效的方法,因为它可以显示数据包从源主机到目标主机(如网站服务器)的每跳延迟和丢包情况。

安装 mtr: 如果系统尚未安装 mtr,可以通过包管理器进行安装。例如,

1
2
3
4
5
# 在 Debian/Ubuntu 上使用以下命令:
sudo apt-get install mtr

# 在 CentOS/RHEL 上使用:
sudo yum install mtr

mtr 命令的一些基本用法和参数:

1
mtr [options] host/ip

Options:

  • -c: 设置显示次数
  • -r: 生成一次性的报告,而不是持续更新的输出。
  • -n: 参数禁用 DNS 解析,直接使用 IP 地址进行测试
  • -i: 参数调整发送 ICMP 请求的时间间隔,例如 -i 0.5 表示每 0.5 秒发送一次请求。
  • -s: 参数可以指定 ICMP 数据包的大小
  • -u: 参数可以用UDP协议进行测试。
  • -o [FIELDS]: 参数可以自定义输出字段的顺序。

mtr会持续跟踪,实时更新。例如,如你想诊断访问阿里公共 DNS 的延迟问题,可以使用:

1
mtr 223.5.5.5

mtr 会持续显示到目标地址的每跳延迟和丢包情况。输出通常包括以下几列:

  • Host:跃点的 IP 地址或主机名。
  • Loss%:到该跃点的丢包率。
  • Snt:发送的探测包数量。
  • Last:最后收到的响应时间。
  • Avg:平均响应时间。
  • Best:最佳(最小)响应时间。
  • Wrst:最差(最大)响应时间。
  • StDev:响应时间的标准偏差,表示网络的稳定性。

分析延迟

  • 高延迟:如果某个跃点的 Last、Avg 或 Wrst 列显示较高的数值,可能表示该跃点存在网络延迟问题。
  • 延迟波动:高 StDev 值可能表明网络拥塞或不稳定的连接。
  • 延迟峰值:Wrst 列中的高值可能表明间歇性的网络问题。
  • 丢包率:如果 Loss% 列显示较高的百分比,可能表示数据包在该跃点丢失,这可能是网络不稳定或配置问题。

进一步诊断

  • 如果发现特定跃点存在问题,可以尝试 ping 该跃点的 IP 地址进行进一步测试。
  • 使用 -n 参数禁用 DNS 解析,直接使用 IP 地址进行测试,以排除 DNS 解析的问题。
  • 使用 -i 参数调整发送 ICMP 请求的时间间隔,例如 -i 0.5 表示每 0.5 秒发送一次请求。

2.4 ifconfig 命令

ifconfig是一个网络管理工具,用于配置、控制和查询网络接口。在许多旧的Linux发行版中,ifconfig是查看和配置网络接口的主要工具。要查看IP地址,只需在终端中输入 ifconfig 命令。这将显示系统中所有网络接口的详细信息,包括IP地址、子网掩码和MAC地址。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[root@ ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0c:29:68:8d:60  
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe68:8d60/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24890 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15457 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:36589294 (34.8 MiB)  TX bytes:2070249 (1.9 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:560 (560.0 B)  TX bytes:560 (560.0 B)

ifconfig 命令的输出包含多个字段,每个字段提供不同的网络信息。在上面输出中,可以看到两个网络接口:eth0 和 lo。

  • eth0: 这是一个以太网接口。

    • Link encap:Ethernet: 链路封装类型,以太网。
    • HWaddr 00:0c:29:68:8d:60: 硬件地址(MAC地址)。
    • inet addr:192.168.1.100: IPv4地址。
    • Bcast:192.168.1.255: 广播地址。
    • Mask:255.255.255.0: 子网掩码。
    • inet6 addr: fe80::20c:29ff:fe68:8d60/64 Scope:Link: IPv6地址。
    • UP BROADCAST RUNNING MULTICAST: 接口状态。
    • MTU:1500: 最大传输单元。
    • RX packets:24890: 接收到的数据包数量。
    • TX packets:15457: 发送的数据包数量。
    • RX bytes:36589294 (34.8 MiB): 接收到的字节数。
    • TX bytes:2070249 (1.9 MiB): 发送的字节数。
  • lo: 这是一个本地回环接口。

    • inet addr:127.0.0.1: IPv4地址。
    • Mask:255.0.0.0: 子网掩码。
    • inet6 addr: ::1/128 Scope:Host: IPv6地址。
    • UP LOOPBACK RUNNING: 接口状态。
    • MTU:65536: 最大传输单元。
    • RX packets:8: 接收到的数据包数量。
    • TX packets:8: 发送的数据包数量。
    • RX bytes:560 (560.0 B): 接收到的字节数。
    • TX bytes:560 (560.0 B): 发送的字节数。

2.5 ss(Socket Statistics)命令

ss 命令是一个功能强大的工具,它提供了对 Linux 系统中网络套接字的深入洞察。通过灵活使用各种选项和过滤器,可以快速获取所需的网络信息,从而更有效地管理和调试网络连接。

ss 命令是 socket statistics 的缩写,是一个用于显示套接字(socket)统计信息的工具。它提供了比 netstat 更快、更详细的网络连接、监听端口等信息。它是 iproute2 包的一部分,大多数现代 Linux 发行版默认已经安装了这个包。如果系统中没有 ss 命令,可以通过包管理器安装:

1
2
3
4
5
# 对于基于 Debian 的系统(如 Ubuntu),使用:
apt-get install iproute2

# 对于基于 Red Hat 的系统(如 CentOS),使用:
yum install iproute

ss 命令的基本语法如下:

1
ss [options] [filter]

options 是命令行选项,filter 是用来过滤输出的表达式。

常用的选项包括:

  • -n, –numeric:以数字格式显示地址和端口。
  • -t, –tcp:仅显示 TCP 套接字信息。
  • -u, –udp:仅显示 UDP 套接字信息。
  • -l, –listening:仅显示处于监听状态的套接字。
  • -a, –all:显示所有套接字信息,包括监听和非监听状态的套接字。
  • -r, –resolve:尝试解析服务名为主机名。
  • -p, –processes:显示与每个套接字相关联的进程信息,包括进程 ID 和进程名称。
  • -e, –extended:显示详细的 TCP 套接字信息。
  • -s, –summary:显示套接字统计摘要信息。

ss 命令的常见用法:

  1. 不带任何选项的情况下,ss 将显示所有类型的套接字。

  2. 使用 -t(TCP)、-u(UDP)或 -a(所有套接字)来过滤特定类型的套接字。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
ss -t    # 只显示 TCP 套接字
ss -u    # 只显示 UDP 套接字
ss -a    # 显示所有类型的套接字

# 示例
[root@mubei ~]# ss -t
State      Recv-Q Send-Q             Local Address:Port                              Peer Address:Port                
ESTAB      0      0                   172.16.16.63:47464                             169.254.0.55:lsi-bobcat           
ESTAB      0      0                   172.16.16.63:37298                            169.254.0.138:8186                 
ESTAB      0      28                  172.16.16.63:ssh                                39.128.6.43:8158                 
ESTAB      0      0                   172.16.16.63:47466                             169.254.0.55:lsi-bobcat           
ESTAB      0      0          [::ffff:172.16.16.63]:6022                   [::ffff:122.226.147.98]:52556                
ESTAB      0      0          [::ffff:172.16.16.63]:6022                   [::ffff:122.226.147.98]:55352                
ESTAB      0      239        [::ffff:172.16.16.63]:afs3-fileserver           [::ffff:39.128.6.43]:19130                
ESTAB      0      0          [::ffff:172.16.16.63]:6022                   [::ffff:122.226.147.98]:58140                
ESTAB      0      0          [::ffff:172.16.16.63]:6022                      [::ffff:80.94.92.86]:56212                
ESTAB      0      0          [::ffff:172.16.16.63]:6022                   [::ffff:122.226.147.98]:60930  
  1. 使用 -l 选项可以查看所有监听状态的套接字:
1
ss -l
  1. 通过 -p 选项查看特定进程的套接字:
1
ss -lnp | grep :8080 # 查看端口号为 8080的套接字
  • -l:显示监听状态的套接字。
  • -n:不解析服务名称,直接显示数字。
  • -p:显示进程信息。
  1. -o 选项可以显示每个套接字的详细信息,如状态、接收/发送缓冲区大小等:
1
2
3
[root@mubei ~]# ss -o state established '( dport = :22 or sport = :22 )'
Netid  Recv-Q Send-Q               Local Address:Port                                Peer Address:Port                
tcp    0      28                    172.16.16.63:ssh                                  39.128.6.43:8158                  timer:(on,298ms,0)
  1. 使用 state 选项可以过滤特定状态的套接字,如 established、listen 等。
1
ss state established
  1. 通过 -r 选项解析 IP 和端口号
1
2
# 显示 TCP 协议的 sockets 只显示处于监听状态的端口:
ss -tlr
  1. 本地和目标地址过滤
1
2
3
4
5
6
7
# 匹配本地地址和端口号
ss src 192.168.2.152

# 匹配远程地址和端口号
ss dst 192.168.2.152
ss dst 192.168.2.153:50460
ss dst 192.168.2.153:mysql
  1. 通过 TCP 的状态进行过滤

ss 命令还可以通过 TCP 连接的状态进行过滤,支持的 TCP 协议中的状态有:established、syn-sent、fin-wait-1、fin-wait-2、closed、close-wait、last-ack、listen、closing。

1
2
3
4
5
6
7
8
# 列举出处于 FIN-WAIT-1 状态的源端口为 80 或者 443,目标网络为 192.168.2/24 所有 tcp 套接字
ss -o state FIN-WAIT-1 dst 192.168.2/24

# 显示所有状态为 Established 的 HTTP 连接
ss state listening '( sport = :http or dport = :http )'

# 使用 ipv4 时的过滤语法
ss -4n state listening
  1. 列出所有连接到 2181 端口的连接和对 2181 端口的监听
1
ss -r state all dport = :2181

2.6 nc(netcat)命令

nc(netcat)是一个简单、可靠的网络工具,可以用于实现任意TCP/UDP端口的侦听、端口扫描、机器之间传输文件等任务。

Tips:有些 Linux 发行版中 nc 是 ncat 的一个软链接文件。

nc 命令的一些基本用法和参数

1
nc [OPTIONS...] [hostname] [port]

常用参数说明:

  • -h:打印帮助。
  • -k:强制nc在其当前连接完成后继续侦听另一个连接。必须与 -l 一起使用。
  • -l:用于指定nc将处于侦听模式,即作为server侦听指定端口。
  • -n:不对任何指定的地址、主机名或端口进行任何DNS或服务查找。
  • -p:指定本机应该使用的源端口。
  • -s:指定发送数据的源IP地址,适用于多网卡机。
  • -u:指定nc使用UDP协议,默认为TCP。
  • -v:输出交互或出错信息,新手调试时尤为有用。
  • -w:超时秒数,后面跟正整数。
  • -z:表示zero,表示扫描时不发送任何数据。

用法示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 测试远程主机指定tcp/udp端口是否开放
nc -zv 8.8.8.8 53
nc -uzv 8.8.8.8 53

# 打开一个到 10.0.10.9 的52端口的TCP连接,使用31337端口作为源端口,超时时间为5秒:
nc -p 31337 -w 5 10.0.10.9 52
# 打开一个到 10.0.10.9 52端口的TCP连接,使用10.1.2.3作为连接本地端的IP地址:
nc -s 10.1.2.3 10.0.10.9 52

# 创建并监听一个UNIX流套接字:
nc -lU /var/tmp/usocket

# 传输文件: ------------------------------------------------ start
#server:
nc -lp 5050 > tfile

#client
nc -nv 192.168.56.2 5050 < tfile
Connection to 192.168.56.2 port 5050 [tcp/*] succeeded!
# 传输文件: ------------------------------------------------ end

# 扫描指定范围的端口(扫TCP端口的速度很慢):
nc -zv 192.168.1.123 20-1024
nc -uzv 192.168.1.123 20-1024

Tips: nc 和 ncat 命令在Linux操作系统中是不一样的。

  • 首先,nc是"netcat"的缩写,而ncat则是"netcat (from Nmap)“的缩写,其中nc来自于netcat原始版本,而ncat则来自于nmap项目。
  • 其次,ncat比nc多了一些特性,例如SSL/TLS加密、通过HTTP代理进行转发等等,因此ncat的功能更为强大。
  • 最后,需要注意的是,在某些Linux发行版中,nc已经被替换为了ncat,因此在使用nc命令时需要注意查看命令的具体帮助信息。

2.7 sar(System Activity Reporter )命令

sar 命令是 System Activity Reporter 的简称,它是 Linux 系统中用于监控和报告系统活动的工具,包括CPU使用率、内存使用情况、磁盘I/O、网络活动等。

使用 sar 命令观测网络接口的收发包速率,可以通过指定 -n 参数配合相应的子选项来实现。要专注于网络接口的收发包速率,特别是每秒钟的收发包数,可以使用 -n DEV 选项。

以下是一个基本的命令示例,用于监视指定网络接口(例如 eth0 和 lo)的实时收发包速率,每隔1秒输出一次,共输出5次:

1
sar -n DEV --iface=eth0,lo 1 5

--iface=eth0,lo 1 5 部分指定了监控的网络接口和采样间隔及次数。这里,–iface=eth0,lo 指定了要监控的网络接口为 eth0 和 lo(回环接口),即同时监控这两个接口的网络活动(接口名由逗号分隔)。最后的 1 5 表示每1秒采集一次数据,总共采集5次。

输出内容解析: 输出内容会包括但不限于以下几部分,具体格式可能根据系统的版本和配置有所不同: 时间戳:每行数据的开始通常会有一个时间戳,表明数据采样的具体时间点。最后一部分的第一列输出 Average,表明观测期间各项数据的平均值。

  • IFACE:网络接口名称,这里会显示为 eth0 或 lo,对应监控的网络设备。
  • rxpck/s:每秒接收的数据包数量。
  • txpck/s:每秒发送的数据包数量。
  • rxkB/s:每秒接收到的千字节总数。
  • txkB/s:每秒发送的千字节总数。
  • rxcmp/s:每秒接收的压缩包数量(如果适用)。
  • txcmp/s:每秒发送的压缩包数量(如果适用)。
  • rxmcst/s:每秒接收的组播包数。
  • %ifutil:网络接口利用率百分比。对于半双工接口,其利用率是通过将 rxkB/s 和 txkB/s 的总和,以接口速度的百分比来计算的。而在全双工接口中,利用率则是 rxkB/s 和 txkB/s 中较大的那一个作为计算依据。

根据具体的监控需求,可以调整采样间隔和次数,以及选择不同的网络接口进行监控。

三、网卡流量监控利器——vnStat

3.1 vnStat 概述

vnStat是一款网络流量监测工具,它利用内核提供的网络接口统计数据作为信息来源。这意味着vnStat并不会实际嗅探任何流量,同时也确保了无论网络流量大小,系统资源的轻量级使用。

默认情况下,流量统计以五分钟级别保存最近48小时的数据,以小时级别保存最近4天,以日级别保存过去两个完整月,以年级别永久保存。数据保留期限完全可由用户配置。同时提供总流量和最活跃日期列表。

3.2 docker部署

1. 官方docker部署

vnStat守护进程和HTTP服务器在同一容器中运行,以下官方示例对于大多数用户来说可以直接使用,但会导致HTTP服务器也使用主机网络,这可能不是某些用户所期望的功能。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# docker-compose.yml
version: "3.7"
services:

  vnstat:
    image: vergoh/vnstat:latest
    container_name: vnstat
    restart: unless-stopped
    network_mode: "host"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - vnstatdb:/var/lib/vnstat
    environment:
      - HTTP_PORT=8685
      - HTTP_BIND=*
      - HTTP_LOG=/dev/stdout
      - LARGE_FONTS=0
      - CACHE_TIME=1
      - RATE_UNIT=1
      - INTERFACE_ORDER=0
      - QUERY_MODE=0
      - DARK_MODE=0
      - PAGE_REFRESH=0

volumes:
  vnstatdb:

2. 双容器运行,vnstat容器收集数据,vnstati容器提供web服务

vnStat守护进程在一个容器(vnstat)中运行,使用主机网络来访问所有网络接口,但不提供任何服务或绑定端口。第二个容器(vnstati)不使用主机网络,而是提供HTTP服务器,使用只读共享卷访问统计信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# docker-compose.yml
version: "3.7"
services:

  vnstat:
    image: vergoh/vnstat:latest
    container_name: vnstat
    restart: unless-stopped
    network_mode: "host"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - vnstatdb:/var/lib/vnstat
    environment:
      - HTTP_PORT=0

  vnstati:
    image: vergoh/vnstat:latest
    container_name: vnstati
    restart: unless-stopped
    ports:
      - "8685:8685"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - vnstatdb:/var/lib/vnstat:ro
    environment:
      - HTTP_PORT=8685
      - HTTP_LOG=/dev/stdout
      - LARGE_FONTS=0
      - CACHE_TIME=1
      - RATE_UNIT=1
      - INTERFACE_ORDER=0
      - QUERY_MODE=0
      - DARK_MODE=0
      - PAGE_REFRESH=0
      - RUN_VNSTATD=0

volumes:
  vnstatdb:

推荐的 docker compose 编排文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# docker-compose.yml
version: "3.7"
services:
  vnstat-data:
    image: vergoh/vnstat:latest
    container_name: vnstat
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 10M
        reservations:
          cpus: '0.80'
          memory: 6M
    restart: unless-stopped
    network_mode: "host"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./vnstatdb:/var/lib/vnstat
    environment:
      - HTTP_PORT=0
      - EXCLUDE_PATTERN=^docker|^veth|^br-
    logging:
      driver: 'json-file'
      options:
        max-size: '5m'
        max-file: '1'

  vnstat-web:
    image: vergoh/vnstat:latest
    container_name: vnstat-web
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 20M
        reservations:
          cpus: '0.80'
          memory: 10M
    restart: unless-stopped
    ports:
      - 8086:8685
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./vnstatdb:/var/lib/vnstat:ro
    environment:
      - HTTP_PORT=8685
      - HTTP_LOG=/dev/stdout
      - LARGE_FONTS=0
      - CACHE_TIME=1
      - RATE_UNIT=1
      - INTERFACE_ORDER=0
      - QUERY_MODE=0
      - DARK_MODE=0
      - PAGE_REFRESH=30
      - RUN_VNSTATD=0
    logging:
      driver: 'json-file'
      options:
        max-size: '5m'
        max-file: '1'

3.3 停止监控不感兴趣的网卡

有些情况下,我们不希望监控全部网卡的流量信息,只监控我们感兴趣的网卡流量信息,怎么办呢?

其实vnstat 已经提供了相关命令:

停止监控不必要的接口

1
docker exec vnstat vnstat -i br-20f8582bfc70 --remove --force

这边的br-20f8582bfc70就是我们希望去除监控的网卡名。

以下 shell 脚本 可以快速打印出 启用/禁用 主机全部网卡 监控的命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/bin/bash
echo '-----------'
echo 'ip link show'
echo '-----------'

array=$(ip link show  | grep BROADCAST | awk '{print $2}' | tr -d ':')

#打印命令,替换:为空字符串
echo '-----remove------'
for eth in $array; do
  echo  "docker exec vnstat vnstat -i ${eth} --remove --force"
done

#打印命令,替换:为空字符串
echo '----- add ------'
for eth in $array; do
  echo  "docker exec vnstat vnstat -i ${eth} --add"
done