您现在的位置是:首页 >技术教程 >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
bytes: 接口发送或接收的数据的总字节数
packets: 接口发送或接收的数据包总数
errs: 由设备驱动程序检测到的发送或接收错误的总数
drop: 设备驱动程序丢弃的数据包总数
fifo: FIFO缓冲区错误的数量
frame: 分组帧错误的数量
colls: 接口上检测到的冲突数
compressed: 设备驱动程序发送或接收的压缩数据包数
carrier: 由设备驱动程序检测到的载波损耗的数量
multicast: 设备驱动程序发送或接收的多播帧数
- /proc/net/snmp
简单网络管理协议(SNMP)是一种网络协议,用于管理和监控互联网协议网络中的网络连接设备。提供了主机各层的IP、ICMP、ICMPMsg、TCP、UDP详细数据
- /proc/net/netstat
/proc/net/netstat 提供了主机的收发包数、收包字节数据。
在查看centos机器的网络状态时,尝尝要看看计数器文件/proc/net/netstat,但是直接cat,如下显示
上面这个太难看懂,有如下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
", name, n[i], $i; i++}; f=0} '
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] = '