C语言再学习 -- Linux常用网络调试工具

参看:Linux常用网络调试工具

linux常用指令,之前我也总结了不少了。
参看:C语言再学习 – Linux 中常用基本命令
参看:Hi3516A开发–环境搭建工具

下面看看网络调试相关的工具:

1、ifconfig

ifconfig 命令用于检查或设置机器上的网卡。

ifconfig 语法:

ifconfig(参数)
参数
add<地址>:设置网络设备IPv6的ip地址; 
del<地址>:删除网络设备IPv6的IP地址; 
down:关闭指定的网络设备;
<hw<网络设备类型 ><硬件地址>:设置网络设备的类型与硬件地址; 
io_addr:设置网络设备的I/O地址; 
irq:设置网络设备的IRQ; 
media<网络媒介类型>:设置网络设备的媒介类型;
mem_start<内存地址>:设置网络设备在主内存所占用的起始地址; 
metric<数目>:指定在计算数据包的转送次数时,所要加上的数目; 
mtu<字节>:设置网络设备的MTU; 
netmask<子网掩码>:设置网络设备的子网掩码; 
tunnel<地址>:建立IPv4与IPv6之间的隧道通信地址; 
up:启动指定的网络设备; 
-broadcast<地址>:将要送往指定地址的数据包当成广播数据包来处理; 
-pointopoint<地址>:与指定地址的网络设备建立直接连线,此模式具有保密功能; 
-promisc:关闭或启动指定网络设备的promiscuous模式; 
IP地址:指定网络设备的IP地址; 网络设备:指定网络设备的名称。

显示网络设备信息:

C语言再学习 -- Linux常用网络调试工具_第1张图片

启动关闭指定网卡

ifconfig eth0 up
ifconfig eth0 down 

用ifconfig修改MAC地址:

ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE 

配置IP地址:

# ifconfig eth0 192.168.2.10 
# ifconfig eth0 192.168.2.10 netmask 255.255.255.0 
# ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255 

设置最大传输单元:

ifconfig eth0 mtu 1500 #设置能通过的最大数据包大小为 1500 bytes

2、ping

ping 命令是最常用的命令之一,用于检查两个设备之间网络是否连通:

ping ip地址/域名  //默认为4个数据包,之后自动停止。

后缀增加 -t:不断使用ping命令发送回响请求信息到目的地,即长ping。要终端并退出ping,按“Ctrl+c”即可。

后缀增加-a:制定对目的地IP地址进行反向名称解析。如果解析成功,ping将显示相应的主机名。

后缀增加-n Count:制定发送回响请求消息的次数,默认值为 4。

后缀增加-l size:制定发送的回响请求消息中 “数据字据的长度”(以字节表示)。默认值为32,size的最大值为65527。

后缀增加-i TTL:指定发送回响请求消息的IP标题中的TTL字段值。其默认值是主机的默认TTL值。TTL值最大值为255。

ping IP并显示测试结果脚本:

@echo off
:: 设置窗口底色为绿色
color FF
title wifi功能测试

echo.
echo.

ping -n 5 127.1 >nul

ping -n 2 www.baidu.com > %temp%\1.ping & ping -n 2 www.baidu.com >> %temp%\1.ping   
::ping阿里公共DNS

findstr "TTL" %temp%\1.ping > nul
if %errorlevel%==0 (echo     √ 外网正常) else (echo     × 外网不通)         
::根据返回值输出

::删除缓存文件
if exist %temp%\*.ping del %temp%\*.ping

echo.
echo.
pause

说明:

D:\>ping -n 2 123.125.114.144>%temp%\1.ping & ping -n 2 180.76.76.76>>%temp%\1.ping

D:\>echo %temp%\1.ping
C:\Users\000\AppData\Local\Temp\1.ping

查看 PC“环境变量”
TEMP
%USERPROFILE%\AppData\Local\Temp

D:\>cat %temp%\1.ping

正在 Ping 123.125.114.144 具有 32 字节的数据:
来自 123.125.114.144 的回复: 字节=32 时间=2ms TTL=56
来自 123.125.114.144 的回复: 字节=32 时间=2ms TTL=56

123.125.114.144 的 Ping 统计信息:
    数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 2ms,最长 = 2ms,平均 = 2ms

正在 Ping 180.76.76.76 具有 32 字节的数据:
来自 180.76.76.76 的回复: 字节=32 时间=3ms TTL=56
来自 180.76.76.76 的回复: 字节=32 时间=3ms TTL=56

180.76.76.76 的 Ping 统计信息:
    数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 3ms,最长 = 3ms,平均 = 3ms

/ findstr 命令
findstr是Window系统自带的命令,用于查找某路径下指定的一个或多个文件中包含某些特定字符串的行,并将该行完整的信息打印出来,或者打印查询字符串所在的文件名。其用途和用法类似Linux下的grep命令。findstr命令在MS-DOS下使用。

D:\>findstr "TTL" %temp%\1.ping
来自 123.125.114.144 的回复: 字节=32 时间=2ms TTL=56
来自 123.125.114.144 的回复: 字节=32 时间=2ms TTL=56
来自 180.76.76.76 的回复: 字节=32 时间=3ms TTL=56
来自 180.76.76.76 的回复: 字节=32 时间=3ms TTL=56

::错误码errorlevel或称返回码,常见的返回码为01
D:\>echo %errorlevel%
0

D:\>

3、telnet

telnet 也是最常用的命令之一,telnet 能够用于连接某个服务器并和它进行通信,如果不指定目标主机的端口,则默认向其 23 号端口发起连接请求。

通常指定目标主机和端口:

telnet ip/域名 端口

参看:Hi3516A开发–环境搭建工具
telnet远程控制 部分

4、netstat

netstat 用于查看主机的网络连接状态,常用有以下选项:

  1. -a (或–all): 显示所有 Socket,不使用该选项时不会显示 LISTEN 状态的选项。
  2. -t (或–tcp): 显示 TCP 协议的连接情况。
  3. -u (或–udp): 显示 UDP 协议的连接情况。
  4. -n (或–numeric): 使用 ip 地址显示,而不是显示域名。
  5. -l (或–listening): 显示处于 LISTEN 状态的 Socket。
  6. -p (或–programs): 显示 Socket 对应的程序名称。
  7. -c (或–continuous): 持续显示信息。

例如:查看所有的 TCP 相关选项:
C语言再学习 -- Linux常用网络调试工具_第2张图片

5、nc(netcat)

nc,全名叫 netcat,它可以用来完成很多的网络功能,譬如端口扫描、建立TCP/UDP连接,数据传输、网络调试等等,因此,它也常被称为网络工具的 瑞士军刀 。

安装

apt-get install netcat

常用选项:

-4:只使用 IPv4 地址
-6:只使用 IPv6 地址
-l:启动本地监听
-n:不使用 DNS 解析
-p:指定源端口
-s:指定源 IP 地址
-u:使用 UDP,默认是 TCP
-v:显示详细信息
-w:设定超时时间(只适合用在 Client 端)
-d:禁止从标准输入读取数据,也就是客户端输入数据不会发送到服务端
-k:让服务端保持连接,不断开

详细的可以通过指令: nc -help 查看。

使用

1、启动一个服务器程序。

nc -v -l 127.0.0.1 8080

指定-l选项(listening)用于监听端口,-v选项(verbose)用于输出更详细的信息,一般都会带上这个选项。如果希望其他主机访问这个服务器,可以指定监听 0.0.0.0 地址。

2、模拟一个客户端程序。

nc -v baidu.com 80

就是去除掉上面的-l选项就行,上面的命令会在本地启动一个客户端程序对 baidu.com 的 80 号端口进行连接,而客户端套接字的端口号是随机的,我们可以使用-p选项来指定本地套接字的端口号:

nc -v -p 5000 baidu.com 80

连接之后就能够发送消息了。此外,上述指令的连接端口号可以指定一个范围,这样就可以对主机进行端口扫描,获取目标主机开放的端口:

nc -v -z 192.168.1.46 8000-9000 2>&1 | grep succeed

其中-z选项为连接后不发送数据,我们只需要知道端口是否能连接上,不需要通信。由于-v选项输出是在[stderr]上,因此需要将其重定向到[stdout]上便于 grep 抓取成功的端口。扫描端口功能一般是黑客常用的一个功能,在对目标主机进行攻击前,获取其开放的端口。
C语言再学习 -- Linux常用网络调试工具_第3张图片
此外,为了验证防火墙是否有效,也可以使用 nc 命令的模拟客户端程序来验证。

3、udp 通信测试
在服务器端:

nc -ul 127.0.0.1 8080

指定-u选项为 UDP 工作模式。

在客户端:

nc -u 127.0.0.1 8080

4、传输文件
nc 不仅可以发送消息,还可以发送文件,只要使用 shell 提供的重定向功能就行:
接收端:

nc -l IP地址 端口号 > recv.txt

发送端:

nc IP地址 端口号 < send.txt

这样就把发送端的 send.txt 文件通过接收端的某端口号传输过去了,接收端将文件重新命名为 recv.txt。

5、端口扫描
端口扫描是一个非常重要的功能,很多时候系统管理员会通过扫描服务器上端口,来识别系统中漏洞,nc 工具提供了非常方便的操作:

nc -vz 192.168.0.117 1-100

这条命令扫描 192.168.1.3 上 1-100 端口区间,有哪些端口是开放的。

# nc -vz 192.168.0.117 1-100
...
nc: connect to 192.168.0.117 port 21 (tcp) failed: Connection refused
Connection to 192.168.0.117 22 port [tcp/ssh] succeeded!
nc: connect to 192.168.0.117 port 23 (tcp) failed: Connection refused
...

可以看到,只有 22 号端口是开放的。

更多参看:Linux网络命令必知必会之瑞士军刀 nc(netcat)

6、lsof

lsof(list opened file desciptor)是Linux上查看系统打开的文件描述符的命令,需要使用 apt 或 yum 包管理器进行安装。

由于网络套接字在 Linux 系统中也是用文件描述符来管理,因此可以使用 lsof 来查看网络的连接情况,lsof 通过 -i 选项可以只显示网络连接相关的信息,使用 -P 选项可以显示端口号而不是别名,使用 -n 选项可以显示 IP 地址而不是其别名。
C语言再学习 -- Linux常用网络调试工具_第4张图片

7、tcpdump

tcpdump 是Linux系统提供的强大抓包工具,通过命令的形式提供类似于 wireshark 的功能,同样可以使用包管理器进行安装。

常用的命令选项:

-i: 指定需要抓包的网卡名称,如果需要抓取所有网卡的包可以指定为 any。
-X: 以十六进程格式显示数据包的内容,不包括链路层的包头信息。可以指定 -XX 查看链路层包头信息。
-n: 不使用 IP 地址的别名显示,-nn 为不使用 IP 地址和端口的别名显示。
-S: 使用绝对包序号(seq字段)而不是相对序号。
-v: 显示详细抓包过程,-vv可以显示更详细的过程。
-w: 将抓取的数据包保存到文件中,该选项后面跟文件名。
-r: 从指定的文件(上面使用-w选项保存的文件)中读取数据包数据。

此外,tcpdump 最强大之处在于可以使用过滤表达式来对抓取的包进行过滤,就像 wireshark 一样。

  1. host 过滤器(指定主机)
tcpdump -i any host 127.0.0.1    // 抓取从 127.0.0.1 发出或收到的包
  1. net 过滤器(指定网段)
tcpdump -i any net 192.168.1    // 抓取从网段 192.168.1.x 发出或收到的包
tcpdump -i any net 192.168.1.0/24  // 使用 CIDR 格式
  1. port 过滤器(指定端口)
tcpdump -i any port 8000   // 抓取发送或接收端口为 8000 的包
  1. 通过 src 和 dst 过滤方向
tcpdump -i any src 192.168.1.1  // 抓取发送端地址为 192.168.1.1 的包
  1. proto 过滤器(指定协议:tcp, udp, icmp, igmp, arp等)
tcpdump -i any icmp       // 抓取 ICMP 协议包
  1. 过滤器之间可以通过逻辑符号(and, or, not)进行组合。
tcpdump -i lo src port 8000 and dst port 8001

这里举例来说明如何使用。
观察一下 TCP 连接时三次握手过程。使用两台主机,目标主机名为 fxd-pi,在上面使用 nc 启动一个 8000 端口的监听服务器,并使用 tcpdump 进行抓包,过滤端口为 8000 的包。在另一台机器(这里称为本地机器)通过 nc 连接,可以看到如下包:
C语言再学习 -- Linux常用网络调试工具_第5张图片
可以看到,首先是本地机器向 fxd-pi 发送的一个请求同步报文(标志为[S],就是 SYN),然后 fxd-pi 回复了一个应答报文(标志为[S.], 是SYN-ACK),然后本地机器再回复了一个应答报文,三次握手成功。

然后我们可以仔细分析一下报文的内容,这里使用 -X 选项,因此报文包含了 IP 报文的首部和 TCP 报文的首部。对其中关键位置的内容进行验证,以第一个报文为例,第 13-16 字节内容为0x0a8663f5,对应源 IP 地址 10.134.99.245;第 17-20 字节内容为0x0a8662ec,对应目的 IP 地址为 10.134.98.236。
C语言再学习 -- Linux常用网络调试工具_第6张图片
再往后面就是 TCP 报文内容,由于是 SYN 同步报文,因此没有携带任何内容,后面的 40 个字节全都是 TCP 首部,这从 TCP 首部中的首部长度字段也可以看出来。其中 0xb20a 和 0x1f40 分别为源端口号和目的端口号。
C语言再学习 -- Linux常用网络调试工具_第7张图片

你可能感兴趣的:(网络,c语言,学习)