基于Linux的ARP攻击检测防护软件设计与实现
基于Linux的ARP攻击检测防护软件设计与实现
本文介绍基于Linux系统开发的ARP攻击检测防护软件的设计与实现,该软件能够检测常见的网络攻击,包括ICMP flood、TCP攻击和ARP欺骗攻击,并记录攻击源的IP地址和MAC地址。同时,软件还能够扫描局域网内活动主机,并记录其IP地址和MAC地址。软件使用Python语言编写,并通过Tkinter库实现可视化界面,所有记录将保存在本地文件中。
1. 软件模块设计
该软件主要包括以下模块:
- 攻击检测模块: 负责检测ICMP flood、TCP攻击和ARP欺骗攻击。
- 主机扫描模块: 负责扫描局域网内活动主机。
- 记录模块: 负责记录攻击事件和扫描结果。
- 可视化界面模块: 负责提供用户界面,方便用户查看记录和操作软件。
2. 软件实现细节
2.1 攻击检测模块
攻击检测模块使用Scapy库实现,该库提供了丰富的网络协议分析和构造功能。
2.1.1 ICMP flood攻击检测
from scapy.all import *
def icmp_flood_detect(pkt):
if pkt.haslayer(ICMP):
if pkt[ICMP].type == 8:
src = pkt[IP].src
count = 0
for p in pkt_lst:
if p[IP].src == src and p.haslayer(ICMP) and p[ICMP].type == 8:
count += 1
if count > 10:
print('ICMP flood attack detected from', src)
该函数会检测是否有ICMP echo request报文,并统计同一源IP地址的报文数量。如果超过10个,则判定为ICMP flood攻击,并输出攻击源IP地址。
2.1.2 TCP攻击检测
def tcp_attack_detect(pkt):
if pkt.haslayer(TCP):
src = pkt[IP].src
dst = pkt[IP].dst
sport = pkt[TCP].sport
dport = pkt[TCP].dport
flags = pkt[TCP].flags
if flags == 0x02:
count = 0
for p in pkt_lst:
if p[IP].src == src and p[IP].dst == dst and p[TCP].sport == sport and p[TCP].dport == dport and p[TCP].flags == 0x02:
count += 1
if count > 10:
print('TCP SYN flood attack detected from', src)
elif flags == 0x03:
count = 0
for p in pkt_lst:
if p[IP].src == src and p[IP].dst == dst and p[TCP].sport == sport and p[TCP].dport == dport and p[TCP].flags == 0x03:
count += 1
if count > 10:
print('TCP FIN flood attack detected from', src)
该函数会检测TCP报文的标志位,如果是SYN或FIN,则统计同一源IP地址、目的IP地址、源端口和目的端口的报文数量。如果超过10个,则判定为TCP SYN flood或TCP FIN flood攻击,并输出攻击源IP地址。
2.1.3 ARP欺骗攻击检测
def arp_spoof_detect(pkt):
if pkt.haslayer(ARP):
src = pkt[ARP].psrc
mac = pkt[ARP].hwsrc
if src in ip_mac_dict and ip_mac_dict[src] != mac:
print('ARP spoofing attack detected from', src)
else:
ip_mac_dict[src] = mac
该函数会检测ARP报文,如果发现源IP地址已经在字典中存在,但对应的MAC地址不同,则判定为ARP欺骗攻击,并输出攻击源IP地址。
2.2 主机扫描模块
def scan_hosts():
global ip_mac_dict
ans, unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst='192.168.1.0/24'), timeout=5, verbose=False)
for snd, rcv in ans:
ip_mac_dict[rcv[ARP].psrc] = rcv[ARP].hwsrc
该函数使用Scapy库发送ARP广播报文,并接收响应报文,从而获取局域网内主机的IP地址和MAC地址。
2.3 记录模块
import pandas as pd
from datetime import datetime
def save_records():
global pkt_lst
global ip_mac_dict
df = pd.DataFrame(columns=['Time', 'Source IP', 'Source MAC', 'Destination IP', 'Destination MAC', 'Protocol'])
for pkt in pkt_lst:
if pkt.haslayer(IP):
src_ip = pkt[IP].src
src_mac = ip_mac_dict[src_ip] if src_ip in ip_mac_dict else 'Unknown'
dst_ip = pkt[IP].dst
dst_mac = ip_mac_dict[dst_ip] if dst_ip in ip_mac_dict else 'Unknown'
protocol = pkt[IP].proto
df = df.append({'Time': datetime.now(), 'Source IP': src_ip, 'Source MAC': src_mac, 'Destination IP': dst_ip, 'Destination MAC': dst_mac, 'Protocol': protocol}, ignore_index=True)
df.to_csv('records.csv', index=False)
该函数将所有捕获的网络数据包保存到一个CSV文件中,包括时间、源IP地址、源MAC地址、目的IP地址、目的MAC地址和协议类型。
2.4 可视化界面模块
import tkinter as tk
def update_display():
global pkt_lst
global ip_mac_dict
text.delete('1.0', tk.END)
for pkt in pkt_lst:
if pkt.haslayer(IP):
src_ip = pkt[IP].src
src_mac = ip_mac_dict[src_ip] if src_ip in ip_mac_dict else 'Unknown'
dst_ip = pkt[IP].dst
dst_mac = ip_mac_dict[dst_ip] if dst_ip in ip_mac_dict else 'Unknown'
protocol = pkt[IP].proto
text.insert(tk.END, f'Time: {datetime.now()} Source IP: {src_ip} Source MAC: {src_mac} Destination IP: {dst_ip} Destination MAC: {dst_mac} Protocol: {protocol}
')
root.after(1000, update_display)
def start_capture():
global pkt_lst
pkt_lst = []
sniff(prn=lambda pkt: pkt_lst.append(pkt), filter='arp or icmp or tcp', store=False)
def stop_capture():
global pkt_lst
pkt_lst = []
root = tk.Tk()
root.title('ARP Attack Detection and Protection')
frame1 = tk.Frame(root)
frame1.pack(side=tk.TOP, padx=10, pady=10)
icmp_button = tk.Button(frame1, text='ICMP Flood Detection', command=lambda: print('ICMP Flood Detection'))
icmp_button.pack(side=tk.LEFT, padx=10)
tcp_button = tk.Button(frame1, text='TCP Attack Detection', command=lambda: print('TCP Attack Detection'))
tcp_button.pack(side=tk.LEFT, padx=10)
ar_button = tk.Button(frame1, text='ARP Spoof Detection', command=lambda: print('ARP Spoof Detection'))
ar_button.pack(side=tk.LEFT, padx=10)
frame2 = tk.Frame(root)
frame2.pack(side=tk.TOP, padx=10, pady=10)
start_button = tk.Button(frame2, text='Start Capture', command=start_capture)
start_button.pack(side=tk.LEFT, padx=10)
stop_button = tk.Button(frame2, text='Stop Capture', command=stop_capture)
stop_button.pack(side=tk.LEFT, padx=10)
scan_button = tk.Button(frame2, text='Scan Hosts', command=scan_hosts)
scan_button.pack(side=tk.LEFT, padx=10)
save_button = tk.Button(frame2, text='Save Records', command=save_records)
save_button.pack(side=tk.LEFT, padx=10)
frame3 = tk.Frame(root)
frame3.pack(side=tk.TOP, padx=10, pady=10)
text = tk.Text(frame3, height=20, width=80)
text.pack()
root.after(1000, update_display)
root.mainloop()
3. 软件使用说明
- 运行软件后,点击“Start Capture”按钮开始捕获网络数据包。
- 点击“Scan Hosts”按钮扫描局域网内活动主机。
- 点击“Save Records”按钮将所有记录保存到本地文件中。
- 点击“ICMP Flood Detection”、“TCP Attack Detection”和“ARP Spoof Detection”按钮分别开启对应攻击类型的检测。
- 软件会将所有捕获到的数据包和攻击事件记录在可视化界面中。
4. 总结
本文介绍了基于Linux系统的ARP攻击检测防护软件的设计与实现,该软件能够有效地检测常见的网络攻击,并记录攻击源信息,为网络安全管理提供参考。同时,软件还提供了友好的可视化界面,方便用户操作和查看记录。
原文地址: https://www.cveoy.top/t/topic/jngE 著作权归作者所有。请勿转载和采集!