跳转至

分析工具

两个主要用于网络管理的软件包

iproute2 是更现代、更一致、功能更强大的工具集,逐渐成为标准

而 net-tools 已经不再维护,逐渐被淘汰

  • net-tools
    • ifconfig 用于配置和显示网络接口信息的命令,启用或禁用接口、设置 IP 地址、查看接口统计信息等
    • iptunnel 用于创建和管理隧道,如 IP in IP 或 GRE 隧道
    • route 用于查看和修改IP路由表,添加或删除路由条目,控制数据包的目的地路由
    • netstat 显示网络连接、路由表、接口统计、伪装连接和多播成员资格等信息
    • arp 用于操作或查看 ARP 缓存
  • iproute2
    • ip 替代 ifconfig, route, iptunnel 等命令
    • ss 替代 netstat,提供更详细和更快速的输出
    • tc Traffic Control,用于控制和配置网络流量,包括队列、分类和流量整形。
    • bridge:用于设置和管理网络桥接设备。
    • ip rule 和 ip route:用于高级路由配置和策略路由。

net-tools

ifconfig

if, interface,网络接口,即网卡

ifconfig  # 查看所有网卡
ifconfig eth0 ip_new [netmask 子网掩码]  # 修改ip和子网掩码
ifconfig eht0 up/down  # 启用或停用网卡,等价于:ifup/ifdown eth0

返回字段解析

# 第一行
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>  # net_device flags(网络设备状态标识)
    # BROADCAST 表示这个网卡有广播地址,可以发送广播包
    # MULTICAST 表示网卡可以发送多播包
    # UP 表示网卡处于启动的状态
    # LOWER_UP 表示L1是启动的,也即网线插着呢
mtu 1500  # 最大传输单元1500字节(这是以太网的默认值)
    # MAC头后面的正文(包括IP头、TCP头、HTTP头)不允许超过1500个字节,存不下则分片传输
qdisc pfifo_fast  # queueing discipline(排队规则)
    # 内核通过某个网络接口发送数据包时,需要按照这个排队规则将数据包加入队列
state UP

# 第二行
link/ether 00:15:5d:21:b9:ea brd ff:ff:ff:ff:ff:ff  # MAC地址

# 第三行
xxx.xx.xxx.x scope global eth0  # ethernet 以太网卡,范围global,对外访问
127.0.0.1/8 scope host lo  # loopback 环回接口,范围host,供本机相互通信

route

# 查看网关(路由)
# 默认每条ip会反解为域名,所以会较慢,-n参数不解析主机名
route -n
route del default gw 10.211.55.1  # 删除默认网关(0.0.0.0)
route add default gw 10.211.55.1  # 增加默认网关
route add -host 10.0.0.1 gw 10.211.55.2  # 指定主机添加明细路由
route add -net 102.168.0.0 netmask 255.255.255.0 gw 10.211.55.3  # 指定网段添加明细路由

arp

# 查看ARP Cache
arp -a  # windows

# 动态类型是通过广播获取然后缓存的
# 否则就是静态的,比如手动添加
arp -s IP MAC

20210729233402

netstat

# 当前所有连接的详情
netstat -alepn | grep :80  # 查看哪个进程绑定到了80端口
'
-a 列出所有连接、监听、socket信息
-t 仅列出tcp包
-u 仅列出udp包

-l LISTEN 状态的

-p 列出端口对应的进程

-n 将域名显示为ip地址

-c 持续输出
'

# 返回信息,可以清楚地看到一条 TCP 连接的四元组
Active Internet connections (only servers)
Proto   Recv-Q  Send-Q   Local Address         Foreign Address         State       PID/Program name    
tcp        0      0     0.0.0.0:28036           0.0.0.0:*              LISTEN      34965/sshd: /usr/sb  # sshd 远程控制服务
tcp        0      0     127.0.0.53:53           0.0.0.0:*              LISTEN      25963/systemd-resol 
tcp6       0      0     :::28036                :::*                   LISTEN      34965/sshd: /usr/sb

iproute2

ip

ip addr  # 或者:ip address
"""
1: lo(环回接口loopback): <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo  # scope host 表示这张网卡只可供本机互相通信
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0(第一块网卡): <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000
    # <有广播地址(可以发送广播包),可以发送多播包,启动状态,L1是启动的(网线插着呢)> 最大传输单元为1500(以太网默认值)
    link/ether aa:aa:00:10:3f:d8 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    altname ens18
    inet 23.105.203.144/21 metric 100 brd 23.105.207.255 scope global eth0
       valid_lft forever preferred_lft forever         # scope global 表示这张网卡对外接收所有的包
    inet6 fe80::a8aa:ff:fe10:3fd8/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000
    link/ether ba:aa:00:10:3f:d8 brd ff:ff:ff:ff:ff:ff
    altname enp0s19
    altname ens19
    inet 169.254.254.254/32 brd 169.254.254.254 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::b8aa:ff:fe10:3fd8/64 scope link 
       valid_lft forever preferred_lft forever
"""
ip route

SS

ss 的参数与 netstat 基本相同

ss -ntpl
"""
State         Recv-Q      Send-Q       Local Address:Port       Peer Address:Port     Process                                                 
LISTEN        0           4096         127.0.0.53%lo:53         0.0.0.0:*             users:(("systemd-resolve",pid=25963,fd=14))
LISTEN        0           128          0.0.0.0:28036            0.0.0.0:*             users:(("sshd",pid=34965,fd=3))
LISTEN        0           128          [::]:28036               [::]:*                users:(("sshd",pid=34965,fd=4))
"""

网络故障排除

查看 DNS 解析

nslookup www.baidu.com
"""
Server(DNS服务器):         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
www.baidu.com   canonical name(别名) = www.a.shifen.com.
www.a.shifen.com        canonical name = www.wshifen.com.
Name:   www.wshifen.com
Address: 104.193.88.123
Name:   www.wshifen.com
Address: 104.193.88.77
"""

显示当前系统中的所有网络设备,即网卡列表

ip addr  # iproute2

ifconfig  # net-tools

ipconfig /all  # windows

主机问题

检测网络是否畅通,网络丢包率、网络延迟等信息

主要使用 ping 工具,它基于 ICMP 协议

不可达的原因通常有:IP 对应的主机关机、断线、拒绝响应 ICMP 协议、防火墙拦截了 ICMP 协议等

ping [-c 2] www.baidu.com
'
-c n 限制尝试次数
-i n 设置时间间隔
可接 host_name 或 ip
'

# 返回
# 基础信息
PING www.wshifen.com (104.193.88.77) 56(84) bytes of data.
64 bytes from 104.193.88.77 (104.193.88.77): icmp_seq=1 ttl=55 time=7.82 ms  # TTL(time to live)表示两个IP之间传输的时间
64 bytes from 104.193.88.77 (104.193.88.77): icmp_seq=2 ttl=55 time=7.27 ms
# 统计信息
--- www.wshifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms  # 丢包率、网络延迟
rtt min/avg/max/mdev = 7.266/7.544/7.822/0.278 ms # 最小/平均/最大时间

可以追踪路由,查看每一跳

traceroute 测试本机到目标主机经过哪些路由,基于 ICMP 协议

traceroute -w 1 www.baidu.com
"""
-w time 如果超时最多等待(wait)几秒

1   *  *  * 
2   96.44.162.49  0.779ms  0.611ms  0.679ms 
3   69.12.70.232  0.379ms  0.696ms  0.252ms 
4   63.218.212.169  0.728ms  0.654ms  0.642ms 
5   63.218.178.58  7.766ms  7.656ms  7.677ms 
6   63.219.23.98  8.155ms  8.128ms  8.126ms 
7   63.219.23.98  7.844ms  7.780ms  7.667ms 
8   104.193.88.13  10.636ms  8.459ms  8.530ms 
9   *  *  * 
10   *  *  * 
"""

mtr 查看数据包是否丢失比 traceroute 信息更清晰,而且不需要额外安装

mtr www.baidu.com

20220711155551

端口问题

检查当前主机到目标主机某端口是否畅通

telnet www.baidu.com 80
"""
Trying 104.193.88.123...
Connected to www.wshifen.com.  # 表示畅通,否则返回端口不可达
Escape character is '^]'.
^]  # 使用ctrl+右方括号退出
telnet> quit  # 然后再输入quit关闭
Connection closed.
"""

端口如果能通,可以抓包分析数据包

tcpdump -i any -n port 80
tcpdump -i any -n host 10.0.0.1 and port 80 -w /tmp/filename
"""
-i any  抓取所有网卡的数据包
-n  如果有域名,解析为ip形式显示
host 10.0.0.1  抓取流向指定主机的数据
port 80  抓取流向指定端口的数据
-w path  存储到文件
"""

数据包如果也没问题,检查服务监听范围

使用 netstat 或 ss 查看 IP 地址和端口的使用情况

也可以结合 lsof 一起使用

# 查看哪个进程占用了8080接口
netstat -a | grep 8080
# 或
lsof -i :8080

lsof /var/run/docker.sock  # 查看谁打开了这个文件