目 录
一、需求
如果一个Linux网络主机接收到太多来自某个未知IP地址的数据包,可能涉及多种情况,以下是一些可能的原因:
1、网络扫描或探测
未知IP地址可能正在进行网络扫描或探测,尝试发现主机上的开放端口和服务。这种活动可能用于后续的恶意攻击,如尝试利用已知的漏洞。
2、拒绝服务攻击(DoS/DDoS)
大量来自同一未知IP地址的数据包可能是拒绝服务攻击的一部分,旨在耗尽主机的资源(如带宽、CPU或内存),导致服务不可用。
3、误配置或网络故障
在某些情况下,数据包洪流可能只是由于网络配置错误或故障导致的。例如,网络设备可能错误地将流量路由到目标主机,或者主机可能错误地配置了监听大量不必要的流量。
4、僵尸网络活动
僵尸网络(Botnet)是由大量被恶意软件感染并受远程控制的计算机组成的网络。这些被感染的计算机可能被用来发动大量针对特定目标的攻击,包括发送大量数据包。
5、正常但由于意外而带来的流量
在某些情况下,大量来自同一IP地址的数据包可能是正常的活动,但是出现了错误的动作。例如,一个合法的用户或服务可能配置不当,导致生成过多的网络流量。
总之,出现这种情况,基本上是危险的前兆。那么,我们有没有办法通过命令或者脚本等手段,找到这个问题根源呢?
二、解决思路
要查看网络情况,首先要进行抓包,然后对抓到的数据包进行分析。比如我们可以用最常见的tcpdump进行抓包,然后通过awk,cut等工具对数据包进行分析,最后把所有发过来的数据包筛选出来,统计IP地址相同的包,并显示出来。因此,可以列出如下步骤:
1、通过tcpdump抓取一定时间的数据包保存下来;
2、周期性的执行这个命令;
3、对抓到的数据包进行分析,主要是对源IP地址这部分进行分析;
4、统计出源IP地址的数量;
5、对IP地址数量进行排序。
三、实现方式
1、抓一定数量的数据包
抓取1万数据包的命令如下:
tcpdump -c 10000 -i eth0
实际操作效果如下:
[root@ecs-52a1 121yunwei]# tcpdump -c 10000 -i eth0 >/home/pkts.pcap
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10000 packets captured
20172 packets received by filter
8890 packets dropped by kernel
[root@ecs-52a1 121yunwei]#
[root@ecs-52a1 121yunwei]#
2、抓取1小时的数据包
命令如下:
timeout 1h tcpdump -i eth0 -w /home/pkts.pcap
为了可以周期性的执行,可以把这个命令保存为shell脚本文件,方便调用,如下:
#!/bin/bash
# capture_packets.sh
# 定义抓包文件名称(固定不变,以便后续覆盖)
PCAP_FILE="/home/pkts.pcap "
# 执行 tcpdump 抓包一个小时,使用 timeout 命令限制时间,并覆盖之前的文件
timeout 1h tcpdump -w "$PCAP_FILE" -i eth0
3、以小时为周期,周期性的执行抓包1小时
crontab -e
内容编辑如下:
*/5 * * * * capture_packets.sh
4,抓包分析并输出结果
采用如下命令分析结果
awk '{print $3}' /home/pkts.pcap | cut -d. -f 1-4 | sort | uniq -c | sort -nk 1
测试效果如下:
[root@ecs-52a1 121yunwei]#
[root@ecs-52a1 121yunwei]# awk '{print $3}' /home/pkts.pcap | cut -d. -f 1-4 | sort | uniq -c | sort -nk 1
1
1 ecs-52a1.45937
1 ecs-52a1.49669
1 ecs-52a1.7060
12 112.86.84.88
30 ecs-52a1.gbjd816
324 222.93.149.89
[root@ecs-52a1 121yunwei]#
根据这个结果,最大的访问量是222.93.149.89过来的访问,只有324个,所以不存在网络攻击。
5,周期性分析并输出结果
可以生成脚本文件analysis_packets.sh,把命令也写到crontab中,如下
*/5 * * * * capture_packets.sh && sleep 2s && analysis_packets.sh
(1)定时设置
这个表达式前半部分为定时任务设置,如下:
*/5: 这表示每5分钟执行一次。星号(*)代表任意值,而斜杠(/)后面跟的数字表示间隔。因此,*/5 意味着从0分钟开始,每隔5分钟。
*: 小时。星号表示“每小时”。
*: 一个月中的哪一天。星号表示“每天”。
*: 月份。星号表示“每个月”。
*: 一周中的哪一天(0代表星期日,1代表星期一,依此类推)。星号表示“每周的每一天”。
综上,这个定时任务表示:每小时的每5分钟执行后面的命令。
(2)命令部分
如下为命令部分的解释:
capture_packets.sh: 这是一个shell脚本,它的功能很可能是捕获网络数据包。
&&: 这是一个逻辑操作符,表示“如果前一个命令成功执行(返回值为0),则执行后面的命令”。
sleep 2s: 这个命令会使系统暂停2秒。
&&: 同上,是逻辑操作符。
analysis_packets.sh: 这是另一个shell脚本,它的功能可能是分析之前捕获的数据包。
总结下来,这个 crontab 行的作用是:每小时的每5分钟,执行 capture_packets.sh 脚本捕获数据包,等待2秒,然后执行 analysis_packets.sh 脚本分析数据包。注意,如果 capture_packets.sh 执行失败(返回值不为0),则后续的 sleep 和 analysis_packets.sh 将不会执行。