基于:https://github.com/aprilmadaha/pingmesh, 进行了修改
-
原来的代码是在客户端执行fping,这个版本是基于tcping。tcping监听的端口是22。
-
因为fping可以支持多个destination ip,如:
fping [10.100.0.5 10.100.0.6 -q -p 12000 -c 5]-
返回:
10.100.0.5 : xmt/rcv/%loss = 5/5/0%,min/avg/max = 0.79/0.86/0.94 10.100.0.6 :xmt/rcv/%loss = 5/5/0%, min/avg/max = 0.01/0.01/0.02 -
在这个版本中,通过编写shell脚本,在multi_tcping.sh里执行多任务,对多个目标ip执行tcping测试
-
-
原来的代码会通过fping自己测试自己,即client ip是10.100.0.5, destination ip也是10.100.0.5。在这个版本里会进行判断,如果client ip = destination ip,则跳过
-
把服务器端的2个go部署到crontab里,随OS启动
-
把客户端的服务部署到service里,随OS启动
主要分为三个角色:
服务器端:
-
部署MariaDB,创建database ,名字叫ping。在这个数据库里,有三张Table:
-
表Host,用来记录客户端的IP
-
表Valu,用来记录客户端之间tcping的测试结果
-
-
Server端起了2个服务:
-
pingmesh-s-v1.1-GetHostIp.go,用来从MariaDB数据库里读取host记录,并下发给客户端
-
pingmesh-s-v1.1-GetResult.go,允许客户端把测试结果进行上报,并保存到MariaDB数据表Valu里
-
客户端:
- multi_tcping.sh,执行60次tcping,并把结果进行汇总和统计(平均值,最大值,最小值)
- pingmesh-c-v1.1.go,从服务器端获得客户端IP列表,通过执行multi_tcping.sh,来进行tcping测试,并把测试结果上报给服务器端
展示层:
- 对tcping的延迟结果进行展示
-
请先创建1个Azure Virtual Network,并创建1个subnet。步骤略
-
创建4台虚拟机,操作系统为Rocky 9.4。步骤略:
虚拟机名称 角色说明 内网IP地址 可用区 需要安装的软件 pingmesh-server 服务器 10.240.0.100 1 golang, mariadb pingmesh-client01 客户端01 10.240.0.101 1 golang pingmesh-client02 客户端02 10.240.0.102 2 golang pingmesh-client03 客户端03 10.240.0.103 3 golang -
等待虚拟机创建完毕后,查看rocky 版本:
[root@pingmesh-server ~]# cat /etc/os-release NAME="Rocky Linux" VERSION="9.4 (Blue Onyx)" ID="rocky" ID_LIKE="rhel centos fedora" VERSION_ID="9.4" PLATFORM_ID="platform:el9" PRETTY_NAME="Rocky Linux 9.4 (Blue Onyx)" ANSI_COLOR="0;32" LOGO="fedora-logo-icon" CPE_NAME="cpe:/o:rocky:rocky:9::baseos" HOME_URL="https://rockylinux.org/" BUG_REPORT_URL="https://bugs.rockylinux.org/" SUPPORT_END="2032-05-31" ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9" ROCKY_SUPPORT_PRODUCT_VERSION="9.4" REDHAT_SUPPORT_PRODUCT="Rocky Linux" REDHAT_SUPPORT_PRODUCT_VERSION="9.4"
请确保客户端和服务器端的时区都是相同的。我这里的演示环境,所有的虚拟机都是UTC时区
-
我们先ssh到pingmesh-server,运行:
sudo yum install mariadb-server -y -
启动mariadb服务:
sudo systemctl start mariadb -
在系统启动时自动启动 MariaDB 服务:
sudo systemctl enable mariadb -
初始化mariadb:
mysql_secure_installation Switch to unix_socket authentication [Y/n] n Change the root password? [Y/n] y New password: //这里使用密码为123456 Re-enter new password: -
其他步骤略
-
安装完毕后,执行
mysql -u root -p -
先创建一个数据库,叫ping (不能用其他的database名称)。命令是:
MariaDB [(none)]> create database ping; -
退出mysql命令行:
MariaDB [(none)]> exit; -
下载数据库样例表:
wget https://raw.githubusercontent.com/leizhang1984/pingmesh/refs/heads/main/Server/pingmesh.sql
-
把pingmesh.sql导入到mariadb,
mysql -u root -p ping < pingmesh.sql -
把客户端的3个内网ip地址,都插入到表host里:
use ping; insert into host(host) values ('10.240.0.101'),('10.240.0.102'),('10.240.0.103');
-
确认导入表成功,
MariaDB [ping]> show tables; +----------------+ | Tables_in_ping | +----------------+ | fw | | host | | valu | +----------------+ 3 rows in set (0.000 sec) -
暂时关闭selinux:
setenforce 0 -
永久关闭selinux:
sudo vi /etc/selinux/config -
修改配置文件,找到
SELINUX这一行,并将其值设置为disabled。最后重启服务器
请确保客户端和服务器端的时区都是相同的。我这里的演示环境,所有的虚拟机都是UTC时区
-
安装go,这里的go版本必须是1.21.0
-
运行下面的命令进行下载:
wget https://golang.org/dl/go1.21.0.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz -
设置环境变量
vi ~/.bashrc -
增加内容:
export PATH=$PATH:/usr/local/go/bin -
使环境变量生效:
source ~/.bashrc -
检查go版本:
[root@pingmesh-server ~]# go version go version go1.21.0 linux/amd64 -
把我们2个项目文件都下载到服务器上,这里我保存的路径是/software
wget https://raw.githubusercontent.com/leizhang1984/pingmesh/refs/heads/main/Server/pingmesh-s-v1.1-GetHostIp.go wget https://raw.githubusercontent.com/leizhang1984/pingmesh/refs/heads/main/Server/pingmesh-s-v1.1-GetResult.go -
修改pingmesh-s-v1.1-GetHostIp.go里的代码,为pingmesh-server的内网ip: 10.240.0.100
lis,err := net.Listen("tcp","10.240.0.100:58098") //监听端口 -
修改pingmesh-s-v1.1-GetResult.go里的代码,为pingmesh-server的内网ip: 10.240.0.100
lis,err := net.Listen("tcp","10.240.0.100:58099") //监听端口 -
然后我们运行命令:
go mod init pingmesh-server -
运行命令:
go get github.com/go-sql-driver/mysql -
再执行:
go mod tidy -
编译2个go文件,执行命令:
go build pingmesh-s-v1.1-GetResult.go go build pingmesh-s-v1.1-GetHostIp.go我们就可以观察到编译的结果:
-
把服务器端的2个服务,设置为开机自动启动
crontab -e -
在crontab文件中,添加以下2行:
@reboot sleep 60 && nohup /software/pingmesh-s-v1.1-GetResult > /software/output.log 2>&1 &
@reboot sleep 60 && nohup /software/pingmesh-s-v1.1-GetHostIp >> /software/output.log 2>&1 &请确保客户端和服务器端的时区都是相同的。我这里的演示环境,所有的虚拟机都是UTC时区
-
我们ssh登录到:pingmesh-client01
-
暂时关闭selinux:
setenforce 0 -
永久关闭selinux:
sudo vi /etc/selinux/config修改配置文件,找到
SELINUX这一行,并将其值设置为disabled。最后重启 -
安装下面的步骤,安装tcping
yum install -y tcptraceroute bc cd /usr/bin wget -O tcping https://soft.mengclaw.com/Bash/TCP-PING chmod +x tcping -
下载和安装go环境,具体可以参考上面的内容,步骤略。
-
下载客户端程序:
wget https://raw.githubusercontent.com/leizhang1984/pingmesh/refs/heads/main/Client/pingmesh-c-v1.1.go -
修改上面go代码里的2个func,都是如下。10.240.0.100换成自己服务器端的ip
conn, err := jsonrpc.Dial("tcp", "10.240.0.100:58099") //10.240.0.100换成自己服务器端的ip -
初始化go项目:
go mod init pingmesh-client go get github.com/go-sql-driver/mysql go mod tidy -
编译代码:
go build pingmesh-c-v1.1.go -
下载tcping的shell脚本:
wget https://raw.githubusercontent.com/leizhang1984/pingmesh/refs/heads/main/Client/multi_tcping.sh-
设置shell脚本的权限为可执行:
chmod +x multi_tcping.sh -
设置客户端服务,让系统开机自动执行:
sudo vi /etc/systemd/system/pingmeshclient.service -
设置服务配置文件
[Unit] Description=Pingmesh Service After=network.target [Service] Type=simple User=root WorkingDirectory=/software ExecStartPre=/bin/sleep 60 ExecStart=/software/pingmesh-c-v1.1 StandardOutput=file:/software/output.log StandardError=file:/software/output.log Restart=on-failure [Install] WantedBy=multi-user.target重新加载:
sudo systemctl daemon-reload -
启动服务:
sudo systemctl enable pingmeshclient.service sudo systemctl start pingmeshclient.service -
在其他的客户端上,都执行上述的步骤。
-
我们ssh到pingmesh-server服务上,登录mariadb
-
切换数据库:
use ping;
-
检查tcping延迟数据:
select * from valu;
可以看到src是源ip, dst是目标ip, loss丢包率,还有rttmin, rttavg, rttmax
下图的日期列是tss,是个unix时间戳
-
因为我这里所有的虚拟机(服务器+客户端),都是UTC时区,如果我们想显示的日志是北京时区(UTC+8),可以执行TSQL语句是:
SELECT src, dst, loss, DATE_FORMAT(CONVERT_TZ(FROM_UNIXTIME(tss), '+00:00', '+08:00'), '%Y-%m-%d %H:%i:%s') AS tss_beijing_time, id, rttmin, rttavg, rttmax FROM valu;
- 我这里把WebUI展示的服务,部署在服务器端。当然你也可以单独部署一台Web UI
- WebUI需要依赖python,我们首先检查python的版本:
[root@pingmesh-server software]# python3 --version
Python 3.9.18
- 安装python包管理工具
yum install python3-pip -y
- 安装python依赖
pip3 install flask
pip3 install pymysql
- 然后我们下载项目文件,其中WebUI层在目录:WebUI
git clone https://github.com/leizhang1984/pingmesh
- 我们cd WebUI目录
- 修改pingmesh.py中的代码,因为我这里WebUI和服务器在同一台虚拟机里,所以host为localhost。你可以按照你的需要进行配置修改
conn = pymysql.connect(
host='localhost',
user='root',
password='123456',
db='ping',
charset='utf8'
)
- 运行WebUI服务
python3 pingmesh.py
如果需要后台运行,请执行:
nohup python3 pingmesh.py > pingmeshpy.log 2>&1 &
- 然后我们打开浏览器,地址输入:http://[服务器端的ip]:9000/。显示效果如下:
这里介绍一下常见的拍错步骤:
- 请先确认客户端的服务已经启动
[root@pingmesh-client01 ~]# ps aux | grep "ping"
root 876 0.0 0.0 1228648 5268 ? Ssl 13:51 0:00 /software/pingmesh-c-v1.1- 客户端pingmesh-c-v1.1的output.log是否有报错
[root@pingmesh-client01 software]# cat output.log
[root@pingmesh-client01 software]#
-
客户端的multi_tcping.sh脚本,会在/tmp产生psping统计数据的临时文件,临时文件一旦被统计完会自动删除
[root@pingmesh-client01 tmp]# ll /tmp/ total 36 -rw-------. 1 root root 138 Oct 2 03:01 crontab.6j37O1 drwx------ 3 root root 17 Oct 2 13:50 systemd-private-1eccfe812c74408495ca78107b23f082-chronyd.service-Ad0tnd drwx------ 3 root root 17 Oct 2 13:50 systemd-private-1eccfe812c74408495ca78107b23f082-dbus-broker.service-ps8r7z drwx------ 3 root root 17 Oct 2 13:50 systemd-private-1eccfe812c74408495ca78107b23f082-systemd-logind.service-Xv8NkU -rw------- 1 root root 346 Oct 2 05:29 tmp.2hiM0kE8fI -rw------- 1 root root 2249 Oct 2 05:38 tmp.7SgH9ZRUxs -rw------- 1 root root 346 Oct 2 05:29 tmp.bXgm11LaIZ -rw------- 1 root root 2249 Oct 2 05:38 tmp.iscZ7oqGSU -rw------- 1 root root 5190 Oct 2 14:01 tmp.lqnVa3OYYK -rw------- 1 root root 5190 Oct 2 14:01 tmp.xFvA85cAxU
-
请先确认服务器端的2个服务都已经启动
[root@pingmesh-server ~]# ps aux | grep "ping" root 1067 0.0 0.0 7124 1424 ? S 13:51 0:00 /bin/sh -c sleep 60 && nohup /software/pingmesh-s-v1.1-GetHostIp >> /software/output.log 2>&1 & root 1070 0.0 0.0 7124 1552 ? S 13:51 0:00 /bin/sh -c sleep 60 && nohup /software/pingmesh-s-v1.1-GetResult > /software/output.log 2>&1 & root 1112 0.0 0.0 1230760 6936 ? Sl 13:52 0:00 /software/pingmesh-s-v1.1-GetResult root 1113 0.0 0.0 1231016 7324 ? Sl 13:52 0:00 /software/pingmesh-s-v1.1-GetHostIp root 1204 0.0 0.0 6408 2176 pts/0 S+ 13:54 0:00 grep --color=auto ping
-
检查output.log是否有客户端连接的日志
[root@pingmesh-server software]# tail -f output.log 2025/10/02 13:59:02 <nil> 2025/10/02 13:59:02 <nil> new client in comming 2025/10/02 13:59:03 <nil> 2025/10/02 13:59:03 <nil> 2025/10/02 13:59:03 <nil> new client in comming 2025/10/02 13:59:04 <nil> 2025/10/02 13:59:04 <nil> 2025/10/02 13:59:04 <nil> new client in comming 2025/10/02 14:00:04 <nil> 2025/10/02 14:00:04 <nil> 2025/10/02 14:00:04 <nil> new client in comming 2025/10/02 14:00:05 <nil> 2025/10/02 14:00:05 <nil> 2025/10/02 14:00:05 <nil>




