Linux下常用网络工具使用总结

平时在Android/Ubuntu这样的Linux系统中, 经常跟网络打交道, 不可避免的要使用网络工具来定位问题;这里对Linux常用的网络工具进行简单的总结, 方便后续查阅使用. 主要看看以下几个常用的网络工具 :

  • ping: 基于ICMP协议, 发送ICMP数据包用于测试网络连通状态
  • traceroute: 基于UDP/ICMP/TCP协议用于跟踪网络连通状态, 打印达到目标地址的路由信息
  • tcpdump : 用于抓取tcp/ip包, 分析网络问题的必需神器
  • iproute2 : 查看/添加/删除当前路由信息
  • netstat: 查看网络状态
  • netcfg: 配置网口(使能网口以及配置IP等)
  • iptables: 网络数据包的过滤以及防火墙策略配置
  • netcat: 用于快速建立TCP/UDP链接,检测网络的连通性
  • iPerf: 网络性能测试工具, 用来衡量网络吞吐量/带宽
  • tc: Traffic Control, 用于显示/修改网卡配置的工具

ping

ping通过向目标节点发送ICMP的ECHO_REQUEST包来测试目标地址的可达性与连通性;向目标地址发送ECHO_REQUEST包后, 如果正常接收到ECHO_RESPONSE, 则说明网络是连通的; 但如果没有接收到任何回应,并不能说明网络的不通, 有可能是请求或者响应在某个地方丢失了.通过ping的洪峰测试模式, 持续发包到目标地址, 也可以查看当前网络状态, 如RTT(Round-trip time)时间, 网络的丢包率等信息.

ping usage

一般测试中常用的参数有如下几个:

  • -c: 设置发多少个ECHO_REQUEST
  • -i: 两个包之间的时间间隔, 默认是1s
  • -I: 指定数据包出去的端口
  • -w: ping测试的超时时间, 多久结束
  • -f: 洪峰测试, 持续(两个包的时间间隔为0)向目标主机发送数据包
  • -s: 指定发送数据包的大小
  • -M: 选择Path MTU发现策略, 有三个选择: do代表不要对数据包进行分片, want表示执行PMTU发现, 但是可以在本地进行数据包的分片,
    `dont`表示不要设置分片标志位(可以分片)
    

示例: 向某个域名发送10包,

1
2

ping -c 10 www.google.com

持续向某个主机连续20s发送数据包, 并指定出口为wlp5s0:

1
2

ping -f -w 20 -I wlp5s0 www.google.com

通过指定包大小以及PMTU的策略,可以用来发现某个路径上最大的MTU大概是多少:

1
2

ping -v -w 20 -M do -s 1460 www.baidu.com

一般, ping测试完成后, 会打印发生了多少个包, 接收的包个数以及丢包率, 总的测试时间以及RTT:

ping output

traceroute

traceroute能够跟踪打印通往某个网络主机的路由信息, 用于定位网络不通时,在哪个路由节点发生的异常. traceroute利用的是IP协议中的包的TTL(Time-To-Live)字段不断发送”探针”包;其首先会向网络发送一个TTL为1的包, 返回后接着向网络发送一个TTL为2的包, 以此持续发送, 直到最后到达目标主机或者超时为止.traceroute的参数较多, 可以通过man traceroute或者traceroute --help查看具体的用法.

示例, 查找到达www.google.com的路由:

1
2

traceroute www.google.com

tcpdump

tcpdump用于抓取网络数据包的利器, 最初的版本是由Van Jacobson, Sally Floyd, Vern Paxson在1988年编码, 后来在各种操作系统中都得到了广泛的使用, 更多详细信息可以参考https://www.tcpdump.org/;如果你使用的是Linux系统, 可以通过man tcpdump来查看tcpdump的具体使用信息. 这里来看下Linux下的tcpdump工具具体如何使用.

以Ubuntu系统为例, tcpdump有很多参数:

Tcpdump命令参数

常用的参数主要有如下几个:

  • -i *interface*/--interface=*interface*: 设置需要抓包的网口, 在Ubuntu系统可以通过ifconfig查看每个网络接口信息; 在Android下可以通过busybox ifconfig查看;
  • -n: 不要将IP地址转换成域名;
  • -s *snaplen*/ --snapshot--length=*snaplen*: 为了保持兼容性, 一般将该值设为0;
  • -w *file*: 保存网络数据包到某个文件;
  • expression: 表达式, 由于网络数据包的过滤, 关于表达式的语法格式可以参考man pcap-filter;

示例: 比如我要抓取某个端口wlp5s0上的所有数据包, 可以使用:

1
2

tcpdump -i wlp5s0 -s 0 -n -w ~/all.pcap

如果只是想看某个端口指定一个协议, 如tcp的数据包, 则可以:

1
2

tcpdump -i wlp5s0 -s 0 -w ip proto \\tcp

这里ip proto \\tcp就是包过滤的表达式, 具体的写法可以参考man pcap-filter或者http://alumni.cs.ucr.edu/~marios/ethereal-tcpdump.pdf

iproute2

看名字大概也知道iproute2这个是用来管理linux系统路由表的, 但在这个工具系列中其实也集成了其他有用的功能, 比如地址/链路的管理, 查看ARP信息, 配置网络接口信息以及配置策略路由(policy routing)等(man ip查看对应信息), 对于Ubuntu系统可以通过man ip-route来查看如何使用iproute:

ip-route usage

示例: 想看下系统的路由表,

1
2

ip route # 等价于 ip route show default

如果想要看某个具体的路由表信息:

1
2

ip route show table main # local, main, or all

那么, 如果要在某个路由表中添加一项路由信息, 如何操作?假定现在, 需要在main路由表中对应的端口ppp0中添加一个目标ip为211.137.20.302的路由:

1
2

ip route add table main scope link dev ppp0 211.137.20.302

想要删除路由表中的某一项, 语法跟路由表添加很相似:

1
2

ip route del table main scope link dev ppp0 211.137.20.302

在某个网口上添加默认路由:

1
ip route add default proto static scope link dev wlp5s0

netstat

netstat主要用来看路由表, 当前网络链接状态以及网络数据统计等, 最新的Linux系统已经使用ip(man ip)来替代(具体的信息可以通过man netstat查看).不过在Android的busybox中仍然可以发挥作用:

netstat usage

例如输入adb shell busybox netstat -rn显示路由表:

netstat routing table

netcfg

在Ubuntu系统中并没有看到netcfg工具, Android里边有一个netcfg工具用于配置网口:

1
2

usage: netcfg [<interface> {dhcp|up|down}]

通过ADB命令adb shell netcfg可以查看当前网口的配置:

netcfg output

如果要在Android中配置一个以太网口(Ethernet), 确保驱动加载完成后, 输入以下指令即可:

  1. 使能网口
1
2

netcfg <interface> up
  1. 通过DHCP获取IP地址
1
2

netcfg <interface> dhcp

iptables

iptables是netfilter(https://www.netfilter.org/)在用户空间的工具, 可以用来读网络数据包进行转发, 拦截, 过滤以及修改. 简单说来, netfilter是在tcp/ip的内核传输路径添加各种hooks函数,如PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING; 这些hooks函数负责将数据包发送个各个队列(tables), 示意图如下:

iptables-netfilter flow

在Linux中内置的tables有如下几个:

  • Filter: 用于数据包过滤(接收或者丢弃)
  • Nat: IP地址转换, 有源地址(snat), 目标地址(dnat)以及masquerade(装饰)三种
  • Managle: 修改数据包的头(ttl/tos等)
  • Raw: 主要用于配置链接跟踪(connection tracking)

在Ubuntu系统中, 输入man iptables可以查看iptables的具体用法:

iptables usage

比如要查看当前iptables规则, 可以通过iptables --list; 一般iptables命令有如下几个部分组成:

iptables command structure

假定你现在需要拦截所有来自某个IP地址的数据包, 可以这样操作:

1
2

iptables -A INPUT -s 182.23.23.23 -i wlp5s0 -j DROP

如果只是想丢弃某种协议的数据包, 比如UDP, 则可以指定协议类型:

1
2

iptables -A INPUT -s 182.23.23.23 -i wlp5s0 -j DROP -p udp

通过iptables的规则链条, 我们可以很方便的构造一系列防火墙规则, 看起来是非常强大的一个工具了. 很值得学习~

netcat

netcat通常简写成nc, 是一个用于建立TCP/UDP连接的小工具, 在Linux下netcat -h或者nc -h都可以查看其使用说明;Android也包含了一个缩减版的netcat, 可以通过nc -h查看. 以Ubuntu为例, 通常nc有如下几个参数:

netcat usage

比如要测试下跟google的TCP连接是否正常(设置-v可以输出连接的状态信息):

1
2

nc -v www.google.com 80

类似的, 也可以建立一个UDP连接:

1
nc -v -u www.google.com 80

netcat有个比较有用的功能就是扫描某个主机给定范围的端口是否正常可连接: 如下这个指令用来查看网关192.168.225.11-10000的端口是否可用

1
2

nc -v -z 192.168.225.1 1-10000

如果我们想要测试两个主机给定端口的连通性,可以按照如下步骤操作:

1
2
3
4
5
6

#在HOST1监听2323这个端口
nc -v -l -p 2323

#在HOST2上主动连接2323这个端口
nc -v -X connect 192.168.225.1 2323

关于nc更多有趣的应用, 可以到官网上查看 http://nc110.sourceforge.net/.

iPerf

iPerf是一个基于TCP/UPD协议的网络测试工具, 常用来测试网络吞吐量以及带宽. 在测试时需要客户端与服务端都支持. 目前有iperf3/iperf2两个版本, 相关文档参考https://iperf.fr/iperf-doc.php. 这里我们基于iperf2介绍下如何来使用iperf.

iPerf的参数主要分为三类, 一类是通用参数, 如参数格式, 多线程测试等;一类是客户端使用的参数, 如目标地址;一类是服务端的参数, 如基于UDP或者通过Daemon进程执行等.

iperf usage

比如简单来测试下网络带宽(ping.online.net是免费用来测试网络的服务器):

1
2

iperf -f M -m -c ping.online.net

测试完成后, 会输出如下信息:

iperf test output

tc

tc即Traffic Control, 可以显示/修改网卡的配置, 如设置网卡的延时, 传输速率, 控制包的传输顺序等, 在linux上输入man tc可以查看具体的使用说明:

tc usage

比如要看下当前网卡队列的状态, 可以输入:

1
2

tc -s qdisc show dev eth0

这里只是简单引出iperf的使用方法, 更多使用场景可以到官网上看看文档https://iperf.fr/.

以上便是常用几个网络工具的总结了, 大家有什么好的Linux工具可以推荐下~以后持续更新

参考文献