网络检查工具

By | 2021年12月31日

netshoot

这是一个用于容器诊断的瑞士军刀,安装了常用网络工具,如 tcpdump、netstat等。

# 使用主机网络,对主机网络上的 docker虚拟网桥 使用 tcpdump 端口,查看是否有流量经过
docker run -it --rm --net host nicolaka/netshoot bash -c 'tcpdump -i docker_gwbridge udp port 514 -vv -X'

# 使用主机网络,列出正在监听的IP和端口
docker run -it --rm --net host nicolaka/netshoot bash -c 'netstat -ltpn

tcpdump

案例

# 过滤源地址是 192.168.3.223 的,-v 会报文内容列出来,但不会有十六进制。(兴业客户那用这个出不来日志,必须用  -vv -X 才行)
tcpdump -i ens192 udp and src host 192.168.3.223 and port 514 -n -v

# 查看发往 ens192 网卡、且udp端口为 514 的数据
tcpdump -i ens192 udp port 514
tcpdump -i ens192 udp port 514 -vv -X
# -n 不把网络地址转换成(域名),当使用 tcpdump 捕获网络数据包时,默认情况下它会尝试解析 IP 地址为域名。如果你想让 tcpdump 在显示输出时不进行 DNS 解析,只显示 IP 地址而不是域名,可以通过添加 -n 参数来实现。
tcpdump -i ens192 udp port 514 -n -vv -X

# 使用 -C 显示前后8行
tcpdump -i ens192 udp port 514 -vv -X | grep -C 8 '192.168.1.2'

# 过滤找含有 ASA 的数据
tcpdump -i ens192 udp and port 514 -vv -X | grep ASA

# -X 参数:把协议头和内容显示出来,会以ASCII和16进制的形式显示(16进制实际是编码的二进制数据,编码可以是UTF-8、GBK等)
# -w 参数:后面跟文件路径,表示将结果写到文档里,控制台会打印总数量
# -vv 参数:输出详细的报文信息
# -i 参数:指定监听的网络接口
tcpdump -i ens192 udp port 514 -vv -X -w /home/demo.txt 
tcpdump -i ens192 udp and host 192.168.1.157 and port 514 -vv -X -w demo.txt
tcpdump -i ens192 udp and host 192.168.1.157 and port 514 -vv -X > mysyslog.txt

# 输出 cap.pcapng 文件用于 wireshark 分析
tcpdump -i any -n host 192.168.1.120 -w cap.pcapng

# 结合 awk 实时更新包数量
# -l:将捕获的数据强制输出到标准输出(STDOUT),确保可以被 awk 处理。
# awk:实时统计输出的行数并动态显示捕获的包数量。
# \r:动态刷新当前行,而不是打印新行。
tcpdump -i docker_gwbridge udp port 514 -l | awk '{count++; printf "\rPackets captured: %d", count}'

如果 CentOS7 上装了 Logstash 接收数据,记得关闭防火墙 firewalld 或放通 514 端口,否则数据会收不到!

模拟发送和接收 GBK、UTF-8 编码的数据

模拟发送一条 UDP 的 GBK 数据,这里我用的是 XShell(SSH 客户端)。
修改方式如下,选择一个会话并打开属性对话框:

将”终端”里的UTF-8默认编码改成GBK:

用此GBK会话连到跳板机 192.168.2.192 ,连上去后向服务器 192.168.3.220 发送 GBK 数据:

# 使用 nc 命令向地址为 192.168.3.220 的 514 端口上发送一条带有中文的 UDP 消息
echo "思科ASA" | nc -4u  192.168.3.220 514

服务器 192.168.3.220 收到数据:

从上图可以看到,Ascii 区域对于中文是用”…”这种表示的,并不会出现 “\\xB7\\xFE\\xCE” 这种十六进制的。在左侧区域才会显示编码的十六进制数据,具体是用什么编码的可以使用在线工具检测下,这样的工具似乎不多,我这里推荐这个:the-x ,它可以自动识别十六进制字符串是用的什么编码,并转换成中文,如图:

另外,如果我们想模拟发送 UTF-8的中文数据,改下XShell会话的编码就可以了,如图:

nc 命令

yum install nc

# 检查 1194 的 udp 端口是否开放
nc -vuz 185.255.130.172 1194

# 向 192.168.3.220 的 514 端口上发送一条带有中文的 UDP 消息
# -4 参数:只使用IPv4
# -u 参数:使用UDP替代默认的TCP
echo "思科ASA" | nc -4u  192.168.3.220 514

# 模拟发送一条天融信的Syslog(UDP)策略命中日志到 192.168.3.220 的 514 端口上
echo "id=tos time=\"2020-06-11 11:59:29\" fw=NLP-2F-TG4324-1  pri=6 type=ac  recorder=FW-NAT src=192.168.1.85 dst=192.168.1.255 sport=54915 dport=54915 smac=9c:b6:d0:c2:35:cd dmac=ff:ff:ff:ff:ff:ff proto=udp indev=null outdev=null user= rule=accept connid=295682 parentid=0 dpiid=0 natid=0 policyid=9645 msg=\"null\"\r\n" | nc -4u  192.168.3.220 514

nethogs

流量监控工具,特点是实时监控每个进程的带宽占用情况。

# 每隔5秒刷一次
# -s 表示按 Send 从大到小排序
nethogs -sd 5

监控展示页面的一些快捷键:

m - 修改显示单位
r - 按接收流量排序 RECEIVED
s - 按发送流量排序 SENT
q - 退出命令提示符

前段时间发现阿里云ECS服务器流量费用大增,阿里云收的是出方向的流量费用,用 nethogs 通过进程排查,看 SENT 字段值:

PROGRAM 列是进程名,有时候直接显示进程名字,多数情况是按 172.18.0.2:3306-112.81.49.27:47828 格式显示,左侧的 172.18.0.2:3306 是服务器上的进程,右侧表示此进程正在发送数据到 112.81.49.27,若左侧进程IP是公网卡上的IP(可通过 ip addr 查看),那么说明是通过公网出去的,阿里云会收取费用。

如果想具体看进程是哪个程序在使用,可以用 netstat -anpt | grep 3306 进一步查看。

hping3

# 安装
apt-get install hping3

# 端口扫描,其中-I eth0指定使用eth0端口,-S指定TCP包的标志位SYN,-p 80指定探测的目的端口。
# TCP包的标志位解释:SYN-创建一个连接、FIN-终结一个连接、ACK-确认接收到的数据。
hping3 -I eth0  -S 192.168.10.1 -p 80

参考:https://wangchujiang.com/linux-command/c/hping3.html

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注