# 网络安全护盾.py """ 该模块包含处理网络数据包和基于TTL(生存时间)值检测IP欺骗的函数。 """ from scapy.layers.inet import IP, ICMP from scapy.all import * from IPy import IP as IPTEST import sys # 用于存储IP地址及其对应的TTL值,初始化为空字典 tt1Values = {} # 用于设定判断IP欺骗的TTL阈值,初始值为5 THRESH = 5 def checkTTL(ipsrc, ttl): """ 检查给定IP源地址的TTL值是否异常,以判断是否可能存在IP欺骗。 参数: ipsrc (str): 数据包的源IP地址。 ttl (str): 数据包的TTL值。 返回: None """ if IPTEST(ipsrc).iptype() == 'PRIVATE': return if ipsrc not in tt1Values: pkt = sr1(IP(dst=ipsrc) / ICMP(), retry=0, timeout=1, verbose=0) if pkt is not None: tt1Values[ipsrc] = pkt.ttl diff = abs(int(ttl) - int(tt1Values.get(ipsrc, 0))) if diff > THRESH: print('\n[!] 检测到可能的IP欺骗包来自:' + ipsrc) print('[!] TTL:' + ttl + ', 实际TTL:' + str(tt1Values.get(ipsrc))) def processTTL(pkt): """ 处理网络数据包,提取IP和TTL信息,并检查IP欺骗。 参数: pkt: 一个网络数据包。 异常: Exception: 如果处理数据包时发生错误。 """ try: if pkt.haslayer(IP): ipsrc = pkt.getlayer(IP).src ttl = str(pkt.getlayer(IP).ttl) checkTTL(ipsrc, ttl) else: raise ValueError("数据包不包含IP层") except Exception as e: print(f"处理数据包错误:{e}", file=sys.stderr) raise # 如果你希望在调用栈中进一步处理这个异常,则重新抛出 def main(): from optparse import OptionParser parser = OptionParser("usage%prog " + "-i<interface> -t <thresh>") parser.add_option('-i', dest='iface', type='string', help='指定网络接口') parser.add_option('-t', dest='thresh', type='int', help='指定阈值计数') (options, args) = parser.parse_args() if options.iface is None: conf.iface = 'eth0' else: conf.iface = options.iface if options.thresh is not None: THRESH = options.thresh sniff(prn=processTTL, store=0) if __name__ == '__main__': main()
# 网络安全护盾test_1.py """ 该模块包含网络安全护盾.py中函数的测试用例。 """ from 网络安全护盾 import processTTL, checkTTL from scapy.layers.inet import IP, ICMP from scapy.packet import Raw import pytest from unittest.mock import patch from io import StringIO import sys def test_processTTL(): """ 测试processTTL函数,使用一个有效的IP数据包。 """ test_pkt = IP(src="192.168.1.1", dst="8.8.8.8") / ICMP() processTTL(test_pkt) def test_checkTTL(): """ 测试checkTTL函数,使用一个有效的IP源地址和TTL值。 """ test_pkt = IP(src="192.168.1.1", dst="8.8.8.8") / ICMP() test_ttl = 64 checkTTL(test_pkt[IP].src, str(test_pkt[IP].ttl)) @patch('网络安全护盾.sr1') def test_checkTTL_with_mock_sr1(mock_sr1): """ 测试checkTTL函数,使用模拟的sr1响应。 """ test_pkt = IP(src="192.168.1.1", dst="8.8.8.8") / ICMP() mock_pkt = IP(src="192.168.1.1", dst="8.8.8.8") / ICMP() mock_pkt.ttl = 64 mock_sr1.return_value = mock_pkt checkTTL(test_pkt[IP].src, 128) # 使用一个不同的TTL值进行测试 def test_processTTL_exception(): """ 测试processTTL函数,使用一个Raw数据包以确保它能够处理异常。 """ test_pkt = Raw(load=b"Invalid packet") capturedOutput = StringIO() sys.stdout = capturedOutput with pytest.raises(ValueError) as excinfo: processTTL(test_pkt) assert "数据包不包含IP层" in str(excinfo.value) sys.stdout = sys.__stdout__ def test_private_IP(): """ 测试checkTTL函数,使用一个私有IP地址。 """ test_pkt = IP(src="192.168.1.1", dst="8.8.8.8") / ICMP() assert checkTTL(test_pkt[IP].src, str(test_pkt[IP].ttl)) is None def test_non_IP_packet(): """ 测试processTTL函数,使用一个非IP数据包。 """ test_pkt = Raw(load=b"Invalid packet") capturedOutput = StringIO() sys.stdout = capturedOutput with pytest.raises(ValueError) as excinfo: processTTL(test_pkt) assert "数据包不包含IP层" in str(excinfo.value) sys.stdout = sys.__stdout__ def test_different_TTL(): """ 测试checkTTL函数,使用不同的TTL值。 """ test_pkt = IP(src="192.168.1.1", dst="8.8.8.8") / ICMP() test_ttl = 128 # 假设实际的TTL值是128 checkTTL(test_pkt[IP].src, str(test_pkt[IP].ttl))
运行命令:pytest 网络安全护盾test_1.py 返回结果: