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