网络安全护盾

# 网络安全护盾.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
返回结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luky!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值