Linux下C/C++实现(网络流量分析-NTA)

这篇具有很好参考价值的文章主要介绍了Linux下C/C++实现(网络流量分析-NTA)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

网络流量分析(NTA - Network Traffic Analysis) 就是捕捉网络中流动的数据包,并通过查看包内部数据以及进行相关的协议、流量、分析、统计等,协助发现网络运行过程中出现的问题。通过监控和分析网络环境中的流量,来判断流量是用在哪个系统或者哪个应用,并对流量做相应的分析统计。

网络流量分析解决方案用于监控企业网络。公司利用网络流量分析来记录和分析网络流量和资产间通信的模式。这些数据随后被用于发现和应对安全威胁。网络流量分析跟踪网络可用性和活动,并识别操作和安全方面的违规行为。

网络流量类型

为了更好地管理带宽,网络管理员决定路由器和交换机等网络设备如何处理某些类型的流量。网络流量一般分为两类:实时流量和非实时流量。

实时流量:

被视为对业务运营重要或关键的流量必须以尽可能高的质量按时交付。实时网络流量的示例包括VoIP、视频会议和网络浏览。

非实时流量:

也称为尽力而为流量,是网络管理员认为不如实时流量重要的流量。示例包括用于网络发布和电子邮件应用程序的文件传输协议(FTP)。

为什么网络流量分析和监控很重要

密切关注你的网络周边一种很好的做法。即使有强大的防火墙,错误也可能发生,恶意流量也可能通过。用户还可以利用隧道、外部匿名器和VPN等方法绕过防火墙规则。

此外,近年来勒索软件作为一种常见攻击类型的兴起,使得网络流量监控变得更加重要。

远程桌面协议(RDP)是另一个常见的目标应用程序。请确保阻止防火墙上的任何入站连接尝试。监控防火墙内的流量可以使您验证规则,获得有价值的见解,还可以用作基于网络流量的警报来源。

注意与Telnet等管理协议相关的任何可疑活动。由于Telnet是一种未加密的协议,会话流量将显示适用于设备品牌和型号的命令行界面(CLI)命令序列。CLI字符串可能会显示登录过程、用户凭据的显示、显示启动或运行配置的命令、复制文件等。请确保检查网络数据中是否有任何运行未加密管理协议的设备,例如:

1.Telnet(远程登录)
2.超文本传输协议(HTTP,端口80)
3.简单网络管理协议(SNMP,端口161/162)

分析和监控网络流量的目的是什么?

通过在网络边缘和网络核心实现网络流量分析,可以研究许多操作和安全问题。使用流量分析工具,您可以发现大量下载、流媒体或可疑的入站或出站流量。确保您从监控防火墙的内部接口开始,这将允许您跟踪特定客户端或用户的活动。

NTA还为组织提供了在端点之外对其网络上的威胁的更多可见性。随着移动设备、物联网设备、智能电视等的兴起,你需要的不仅仅是来自防火墙的日志,而是更智能的东西。当网络受到攻击时,防火墙日志也会出现问题。您可能会发现,由于防火墙上的资源负载,它们无法访问,或者它们被覆盖(有时甚至被黑客修改),导致重要的取证信息丢失。

Linux监控网络流量分析

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。/proc文件系统中包含了很多目录,其中/proc/net/dev 保存了网络适配器及统计信息。

  • /proc/net/dev

Linux下C/C++实现(网络流量分析-NTA),C/C++,linux,c语言,c++,网络流量,网络安全
bytes: 接口发送或接收的数据的总字节数
packets: 接口发送或接收的数据包总数
errs: 由设备驱动程序检测到的发送或接收错误的总数
drop: 设备驱动程序丢弃的数据包总数
fifo: FIFO缓冲区错误的数量
frame: 分组帧错误的数量
colls: 接口上检测到的冲突数
compressed: 设备驱动程序发送或接收的压缩数据包数
carrier: 由设备驱动程序检测到的载波损耗的数量
multicast: 设备驱动程序发送或接收的多播帧数

  • /proc/net/snmp

简单网络管理协议(SNMP)是一种网络协议,用于管理和监控互联网协议网络中的网络连接设备。提供了主机各层的IP、ICMP、ICMPMsg、TCP、UDP详细数据

Linux下C/C++实现(网络流量分析-NTA),C/C++,linux,c语言,c++,网络流量,网络安全

  • /proc/net/netstat

/proc/net/netstat 提供了主机的收发包数、收包字节数据。

在查看centos机器的网络状态时,尝尝要看看计数器文件/proc/net/netstat,但是直接cat,如下显示

Linux下C/C++实现(网络流量分析-NTA),C/C++,linux,c语言,c++,网络流量,网络安全上面这个太难看懂,有如下awk脚本,可以格式化

cat /proc/net/netstat |  awk '(f==0) {name=$1; i=2; while ( i<=NF) {n[i] = $i; i++ }; f=1; next} (f==1){ i=2; while ( i<=NF){ printf "%s%s = %d\n", name, n[i], $i; i++}; f=0} ' 

Linux下C/C++实现(网络流量分析-NTA),C/C++,linux,c语言,c++,网络流量,网络安全
Linux下C/C++实现(网络流量分析-NTA)


static int split_ifname(char *if_name, char *drv, uint32_t *instance)
{
	char *p;
	int n, m;

	n = 0;
	for (p = if_name; *p; p++)
		n++;
	if (n <= 1)
		return (B_FALSE);
	m = n;
	for (p--; isdigit(*p); p--)
		n--;
	if (m == n || n == 0)
		return (B_FALSE);
	(void) strncpy(drv, if_name, n);
	drv[n] = '\0';
	*instance = (uint32_t)atol(++p);
	return (B_TRUE);
}

static void diag(int use_errno, char *format, ...)
{
	va_list ap;
	char *error_str;

	(void) fprintf(stderr, "%s: ", g_progname);
	if (use_errno) 
	{
		error_str = strerror(errno);
		if (! error_str)
			error_str = strerror(0);
	}
	va_start(ap, format);
	(void) vfprintf(stderr, format, ap);
	va_end(ap);
	if (use_errno)
		(void) fprintf(stderr, ": %s\n", error_str);
	else
		(void) fputc('\n', stderr);
}

#define	die(...) \
do { \
	diag(__VA_ARGS__);			\
	exit(2);				\
} while (0)

static void update_stats(int net_dev)
{


...
	if (lseek(net_dev, 0, SEEK_SET) != 0)
		die(1, "lseek: %s", PROC_NET_DEV_PATH);
	bufsiz = 0;
	while ((n = read(net_dev, (void *) proc_net_buffer + bufsiz, sizeof(proc_net_buffer) - bufsiz)) > 0) 
	{
	    bufsiz += n;
	}
	if (bufsiz < 0)
		die(1, "read: %s", PROC_NET_DEV_PATH);
	else if (bufsiz < 200)
		die(0, "%s: invalid format\n", PROC_NET_DEV_PATH);

...

	/* 终止我们的字符串 */
	bufp = proc_net_buffer + 200;
	buf_remain = bufsiz - 200;
	bufp[buf_remain + 1] = '\0';

	gettimeofday(&now_tv, NULL);

	skip_to_newline = 0;
	g_nicdata_count = 0;
	lastp = NULL;
	while (*bufp) 
	{
		if (skip_to_newline) 
		{
			/* 需要跳过以前的数据 */
			for (; *bufp; bufp++)
				if (*bufp == '\n') 
				{
					bufp++;
					break;
			}
			if (! *bufp)
				break;
		}
		skip_to_newline = 1;

		/* 获取接口名称 */
		while (*bufp == ' ')
			bufp++;
		/* 检查格式 */
		n = strcspn(bufp, ":");
		if (n >= sizeof (if_name))
			die(0, "%s: interface name too long",
				PROC_NET_DEV_PATH);
		(void) strncpy(if_name, bufp, n);
		if_name[n] = '\0';
...
		loopback = streql("lo", if_name);
		if (g_nonlocal && loopback)
			continue;

		bufp += n + 1;
		ret = sscanf(bufp, "%llu %llu %llu %llu %llu %llu %llu"
			" %llu %llu %llu %llu %llu %llu %llu %llu %llu\n",
			&ll[0], &ll[1], &ll[2], &ll[3], &ll[4], &ll[5],
			&ll[6], &ll[7], &ll[8], &ll[9], &ll[10], &ll[11],
			&ll[12], &ll[13], &ll[14], &ll[15]);
		if (ret != 16)
			die(0, "%s: invalid format", PROC_NET_DEV_PATH);
		/* 如果从未看到数据包,则跳过接口 */
		if (ll[1] == 0 && ll[9] == 0)
			continue;

		g_nicdata_count++;
		nicp = find_nicdatap(&g_nicdatap, &lastp, if_name);
		nicp->new.tv.tv_sec = now_tv.tv_sec;
		nicp->new.tv.tv_usec = now_tv.tv_usec;
		nicp->new.rbytes = ll[0];
		nicp->new.rpackets = ll[1];
		nicp->new.wbytes = ll[8];
		nicp->new.wpackets = ll[9];
		nicp->new.sat = ll[2];
		nicp->new.sat += ll[3];
		nicp->new.sat += ll[11];
		nicp->new.sat += ll[12];
		nicp->new.sat += ll[13];
		nicp->new.sat += ll[14];
		if (g_opt_x) {
			nicp->new.ierr = ll[2];
			nicp->new.oerr = ll[10];
			nicp->new.coll = ll[13];
		}
		if (loopback)
			nicp->flags |= NIC_LOOPBACK;
		get_speed_duplex(nicp);
		nicp->report = 1;
	}
	if (g_tcp || g_udp)
		load_snmp(g_snmp);
	if (g_tcp) 
	{
		g_tcp_new->tv = now_tv;
		load_netstat(g_netstat);
	}
	if (g_udp)
		g_udp_new->tv = now_tv;
}

...

static void load_netstat(FILE *netstat)
{
...

	if (fseek(netstat, 0, SEEK_SET) != 0)
		die(1, "fseek: %s", PROC_NET_NETSTAT_PATH);
	remaining = 1;
	while (remaining) 
	{
		p = fgets(buf, sizeof (buf), netstat);
		if (! p)
			break;
		if (g_tcp && strncmp("TcpExt: SyncookiesSent SyncookiesRecv "
		    "SyncookiesFailed EmbryonicRsts PruneCalled RcvPruned "
		    "OfoPruned OutOfWindowIcmps LockDroppedIcmps "
		    "ArpFilter TW TWRecycled TWKilled PAWSPassive "
		    "PAWSActive PAWSEstab DelayedACKs DelayedACKLocked "
		    "DelayedACKLost ListenOverflows ListenDrops ",
		    p, 273) == 0) 
		  {
			/* We are after field 20 and 21 */
			int n = fscanf(netstat, "TcpExt: %*d %*d %*d "
				"%*d %*d %*d %*d %*d %*d %*d "
				"%*d %*d %*d %*d %*d %*d %*d "
				"%*d %*d %lld %lld ",
				&ll[0], &ll[1]);
			if (n == 2)
				g_tcp_new->listenDrop = ll[0] + ll[1];
			remaining--;
		}
	}
}


/*
获取TCP和UDP统计信息
*/

static void load_snmp(FILE *snmp)
{
..

	/* 从/proc/net/snmp加载TCP和/或UDP统计信息 */
	if (fseek(snmp, 0, SEEK_SET) != 0)
		die(1, "fseek: %s", PROC_NET_SNMP_PATH);
	remaining = 0;
	if (g_tcp)
		remaining++;
	if (g_udp)
		remaining++;
	while (remaining) 
	{
		p = fgets(buf, sizeof (buf), snmp);
		if (! p)
			break;
		if (g_tcp && strncmp("Tcp: RtoAlgorithm RtoMin RtoMax MaxConn "
				"ActiveOpens PassiveOpens AttemptFails "
				"EstabResets CurrEstab InSegs OutSegs "
				"RetransSegs InErrs OutRsts", p, 141) == 0) 
				{
			int n;
			n = fscanf(snmp, "Tcp: %lld %lld %lld %lld "
			    "%lld %lld %lld %lld %lld %lld "
			    "%lld %lld %lld %lld\n",
			    &ll[0], &ll[1], &ll[2], &ll[3],
			    &ll[4], &ll[5], &ll[6], &ll[7],
			    &ll[8], &ll[9], &ll[10], &ll[11],
			    &ll[12], &ll[13]);
			if (n == 14) 
			{
				g_tcp_new->inDataInorderSegs = ll[9];
				g_tcp_new->outDataSegs = ll[10];
				g_tcp_new->estabResets = ll[7];
				g_tcp_new->outRsts = ll[13];
				g_tcp_new->attemptFails = ll[6];
				...
				g_tcp_new->retransBytes = ll[11];
				g_tcp_new->passiveOpens = ll[5];
				g_tcp_new->activeOpens = ll[4];
			}
			remaining--;
		} 
		else if (g_udp && strncmp("Udp: InDatagrams NoPorts "
				"InErrors OutDatagrams RcvbufErrors "
				"SndbufErrors\n", p, 72) == 0) {
			int n;
			n = fscanf(snmp, "Udp: %lld %lld %lld %lld "
			    "%lld %lld\n",
			    &ll[0], &ll[1], &ll[2], &ll[3],
			    &ll[4], &ll[5]);
			if (n == 6) 
			{
				g_udp_new->inDatagrams = ll[0];
				g_udp_new->outDatagrams = ll[3];
				g_udp_new->inErrors = ll[2]; /* + ll[4]? */
				g_udp_new->outErrors = ll[5];
			}
			remaining--;
		}
	}
}

static void print_header(void)
{
...
	switch (g_style) 
	{
	case STYLE_SUMMARY:
		(void) printf("%8s %8s %14s %14s\n",
		    "Time", "Int", g_runit_1, g_wunit_1);
		break;
	case STYLE_FULL:
		(void) printf("%8s %8s %7s %7s %7s "
		    "%7s %7s %7s %5s %6s\n",
		    "Time", "Int", g_runit_1, g_wunit_1, "rPk/s",
		    "wPk/s", "rAvs", "wAvs", "%Util", "Sat");
		break;
	case STYLE_FULL_UTIL:
		(void) printf("%8s %8s %7s %7s %7s "
		    "%7s %7s %7s %6s %6s\n",
		    "Time", "Int", g_runit_1, g_wunit_1, "rPk/s",
		    "wPk/s", "rAvs", "wAvs", "%rUtil", "%wUtil");
		break;
	case STYLE_EXTENDED:
		update_timestr(NULL);
		(void) printf("%-10s %7s %7s %7s %7s  "
		    "%5s %5s %5s %5s %5s  %5s\n",
		    g_timestr, g_runit_2, g_wunit_2, "RdPkt", "WrPkt",
		    "IErr", "OErr", "Coll", "NoCP", "Defer", "%Util");
		break;
	case STYLE_EXTENDED_UTIL:
		update_timestr(NULL);
		(void) printf("%-10s %7s %7s %7s %7s  "
		    "%5s %5s %5s %5s %5s %6s %6s\n",
		    g_timestr, g_runit_2, g_wunit_2, "RdPkt", "WrPkt",
		    "IErr", "OErr", "Coll", "NoCP", "Defer",
		    "%rUtil", "%wUtil");
		break;
	}
}

...

运行结果:
Linux下C/C++实现(网络流量分析-NTA),C/C++,linux,c语言,c++,网络流量,网络安全

Time列:表示当前采样的响应时间.
lo and ens37: 网卡名称.
rKB/s : 每秒接收到千字节数.
wKB/s : 每秒写的千字节数.
rPk/s : 每秒接收到的数据包数目.
wPk/s : 每秒写的数据包数目.
rAvs : 接收到的数据包平均大小.
wAvs : 传输的数据包平均大小.
%Util : 网卡利用率(百分比).
Sat : 网卡每秒的错误数.网卡是否接近饱满的一个指标.尝试去诊断网络问题的时候,推荐使用-x选项去查看更多的统计信息.

  • 查看tcp相关信息
    Linux下C/C++实现(网络流量分析-NTA),C/C++,linux,c语言,c++,网络流量,网络安全
    InKB : 表示每秒接收到的千字节.
    OutKB : 表示每秒传输的千字节.
    InSeg : 表示每秒接收到的TCP数据段(TCP Segments).
    OutSeg : 表示每秒传输的TCP数据段(TCP Segments).
    Reset : 表示TCP连接从ESTABLISHED或CLOSE-WAIT状态直接转变为CLOSED状态的次数.
    AttF : 表示TCP连接从SYN-SENT或SYN-RCVD状态直接转变为CLOSED状态的次数,再加上TCP连接从SYN-RCVD状态直接转变为LISTEN状态的次数
    %ReTX : 表示TCP数据段(TCP Segments)重传的百分比.即传输的TCP数据段包含有一个或多个之前传输的八位字节.
    InConn : 表示TCP连接从LISTEN状态直接转变为SYN-RCVD状态的次数.
    OutCon : 表示TCP连接从CLOSED状态直接转变为SYN-SENT状态的次数.
    Drops : 表示从完成连接(completed connection)的队列和未完成连接(incomplete connection)的队列中丢弃的连接次数.

  • 查看udp相关信息
    Linux下C/C++实现(网络流量分析-NTA),C/C++,linux,c语言,c++,网络流量,网络安全

    InDG : 每秒接收到的UDP数据报(UDP Datagrams)
    OutDG : 每秒传输的UDP数据报(UDP Datagrams)
    InErr : 接收到的因包含错误而不能被处理的数据包
    OutErr :因错误而不能成功传输的数据包.

  • 查看网卡速度

Linux下C/C++实现(网络流量分析-NTA),C/C++,linux,c语言,c++,网络流量,网络安全

If you need the complete source code, please add the WeChat number (c17865354792)

总结

网络流量分析解决方案领先于其他网络安全工具,如入侵检测系统(IDS)、入侵防御系统(IPS)和防火墙。虽然这些工具主要关注网络周边的流量,但网络流量分析分析所有类型的网络通信,包括传统的TCP/IP数据包、云流量、虚拟网络流量以及API和SaaS交互。

Welcome to follow WeChat official account【程序猿编码

参考:https://man7.org/linux/man-pages/man5/proc.5.html文章来源地址https://www.toymoban.com/news/detail-720867.html

到了这里,关于Linux下C/C++实现(网络流量分析-NTA)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 国科大网络协议安全大作业——分析流量并使用Snort规则进行检测

    SHA256(Secure Hash Algorithm 256-bit)是一种密码学哈希函数,用于计算数据的哈希值。每个文件使用一个哈希算法只会有一个确定的哈希值。 被感染主机设置为ubuntu22.04,虚拟机IP地址为192.168.88.142 原因:避免wireshark奇怪报错  2.2.1在终端执行 file命令查看文件类型 2.2.2计算该文件

    2024年02月04日
    浏览(40)
  • Kali Linux --《网络安全》-- 使用 WireShark 对常用协议抓包并分析原理

    作为一款高效免费的抓包工具,wireshark可以捕获并描述网络数据包,其最大的优势就是免费、开源以及多平台支持,在GNU通用公共许可证的保障范围下,用户可以免费获取软件和代码,并拥有对其源码修改和定制的权利,如今其已是全球最广泛的网络数据包分析软件之一。接

    2023年04月08日
    浏览(38)
  • 【Linux网络】ssh服务与配置,实现安全的密钥对免密登录

    目录 一、SSH基础 1、什么是ssh服务器 2、对比一下ssh协议与telnet协议 3、常见的底层为ssh协议的软件: 4、拓展 二、SSH软件学习 1、ssh服务软件学习  2、sshd公钥传输的原理: 3、ssh命令学习: 4、学习解读sshd服务配置文件: 三、ssh服务的应用 1、使用密钥对免密码登录 第一步

    2024年02月04日
    浏览(43)
  • LINUX网络流量限速控制

    Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。 Linux流量控制的基本原理如下图所示。 接收包从输入接口(Input Interface)进来后,经过流量限制(Ingress Policing)丢弃不符合规定的数据包,由输

    2024年02月16日
    浏览(19)
  • Linux 网络流量监控利器 iftop命令详解及实战

    简介 iftop 是什么 在 Linux 系统下即时监控服务器的网络带宽使用情况,有很多工具,比如 iptraf、nethogs 等等,但是推荐使用小巧但功能很强大的 iftop 工具。 iftop 是 Linux 系统一个免费的网卡实时流量监控工具,类似于 top 命令。iftop 可以监控指定网卡的实时流量、端口连接信

    2024年02月03日
    浏览(41)
  • Linux C/C++下抓包分析mysql流量(协议解析)

    MySQL通信协议是一个有状态的协议,主要用于MySQL客户端与服务器之间的通信。这个协议在MySQL客户端连接器(如Connector/C、Connector/J等)、MySQL Proxy以及主从复制中都有实现。 该协议的特性包括:支持SSL、压缩和认证等功能。 MySQL客户端和服务端的交互过程主要分为两个阶段:

    2024年02月05日
    浏览(34)
  • Linux——管理网络安全

    1.管理服务器防火墙 (1)Linux内核中包含netfilter是网络流量操作(如数据包过滤、网络地址转换和端口转换)的框架。Filewalld是一个动态防火墙管理器,是nftables框架的前端,它会检查进入系统的每个数据包的源地址。若源地址分配到特定区域,则应用该区域的规则;若未分

    2023年04月08日
    浏览(70)
  • 【Linux&网络安全】Linux操作系统安全配置(超全超详细)

    查看账号 在我们Linux系统当中,默认的情况下,所有的系统上的帐号与一般身份使用者,还有root的相关信息, 都是记录在/etc/passwd这个文件内的。至于个人的密码则是记录在/etc/shadow这个文件下。 此外,Linux所有的群组名称都纪录在/etc/group内!这三个文件可以说是Linux系统里

    2024年02月01日
    浏览(30)
  • Linux系统下查看网卡配置和网络流量监控指令:ifconfig、ethtool

    ifconfig 查看所有活动网卡信息 ifconfig -a 查看所有网卡信息 ifconfig eth0 查看具体网卡信息 ifconfig eth0 up/down 激活/禁用网卡 ifup/ifdown eth0 激活/禁用网卡(重新读取配置文件) ip //查看ip指令使用参数 ip addr ethtool bond0 //查看bond0网口的配置信息 ethtool eth0 //查看bond0网口的配置信息

    2024年02月06日
    浏览(35)
  • 【网络安全】-Linux操作系统—操作系统发展历史与Linux

    操作系统(Operating System,简称OS)是管理计算机硬件与软件资源的系统软件,它是计算机系统的核心与基石。操作系统的发展历史可以追溯到20世纪50年代。 初期的操作系统 在计算机技术的早期,操作系统并不存在。那时,计算机使用一种叫做批处理系统的方式来运行程序。

    2024年02月03日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包