原文网址: http://www.cnblogs.com/csdev

Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是:Apache License v2

开源地址是:https://github.com/MarcFletcher/NetworkComms.Net

DOSProtection用于放置Dos攻击,可以封IP,默认没有启用
namespace NetworkCommsDotNet.Tools
{
    /// <summary>
    /// NetworkComms.Net class used for providing Denial Of Service (DOS) protection features.
    /// If enabled, malformed data events and connection initialises are tracked. If above
    /// set thresholds IPAddresses are banned.
    /// 用于DOS攻击防御的类
    /// 如果启用  则格式不正确的数据和连接请求将会被跟踪  并对相应的IP进行查封
    /// </summary>
    public class DOSProtection
    {
        /// <summary>
        /// A local thread safety locker
        /// 同步锁
        /// </summary>
        object _syncRoot = new object();

        /// <summary>
        /// Addresses that are currently banned. Key is remote IPAddress, value is time banned.
        /// 被查封的IP
        /// </summary>
        Dictionary<IPAddress, DateTime> _bannedAddresses = new Dictionary<IPAddress, DateTime>();

        /// <summary>
        /// First key is remote IPAddress, second key is DateTime.Ticks, value is the malformed count for that DateTime.ticks
        /// 格式不正确的数据的相关信息    IP  发生的时间  次数
        /// </summary>
        Dictionary<IPAddress, Dictionary<long, int>> _malformedCountDict = new Dictionary<IPAddress, Dictionary<long, int>>();

        /// <summary>
        /// First key is remote IPAddress, second key is DateTime.Ticks, value is the connection initialisation count for that DateTime.ticks
        /// 格式不正确的连接请求    IP  发生的时间  次数
        /// </summary>
        Dictionary<IPAddress, Dictionary<long, int>> _connectionInitialiseCountDict = new Dictionary<IPAddress, Dictionary<long, int>>();

        /// <summary>
        /// The current state of DOS protection
        /// 是否启用DOS攻击防御
        /// </summary>
        public bool Enabled { get; set; }

        /// <summary>
        /// The timeout after which time a banned IPAddress may have access again. Default is 10 minutes.
        /// 相关IP查封的时间
        /// </summary>
        public TimeSpan BanTimeout { get; set; }

        /// <summary>
        /// The time within which if MalformedCountInIntervalBeforeBan or ConnectionInitialiseCountInIntervalBeforeBan
        /// is reached a peer will be banned. Default is 5 minutes.
        /// 查封相关的一个时间段
        /// 默认5分钟
        /// 比如说5分钟内收到2个不规则数据,启用查封
        /// </summary>
        public TimeSpan LogInterval { get; set; }

        /// <summary>
        /// The number of malformed data counts to log within LogInterval before an IPAddress is banned. Default is 2.
        /// LogInterval时间内收到不规则数据将会被查封  默认为2个
        /// </summary>
        public int MalformedCountInIntervalBeforeBan { get; set; }

        /// <summary>
        /// The number of connection initialises to log within LogInterval before an IPAddress is banned. Default is 100
        /// LogInterval时间内收到不规则连接请求  默认为100个  启用查封
        /// </summary>
        public int ConnectionInitialiseCountInIntervalBeforeBan { get; set; }

        /// <summary>
        /// Initialise a new instance of DOS protection.
        /// 初始化
        /// </summary>
        public DOSProtection()
        {
            Enabled = false;
            BanTimeout = , , );
            LogInterval = , , );
            MalformedCountInIntervalBeforeBan = ;
            ConnectionInitialiseCountInIntervalBeforeBan = ;
        }

        /// <summary>
        /// Log a malformed data event for the provided remote IPAddress.
        /// 记录不规则数据时间 根据指定的IP
        /// </summary>
        /// <param name="remoteIPAddress"></param>
        /// <returns>如果指定IP已经查封 返回True *** True if the remote IPAddress is now banned, otherwise false.</returns>
        public bool LogMalformedData(IPAddress remoteIPAddress)
        {
            bool ipAddressNowBanned = false;

            lock (_syncRoot)
            {
                //Record the malformed data count
                //记录不规则数据数量
                long tick = DateTime.Now.Ticks;
                if (_malformedCountDict.ContainsKey(remoteIPAddress))
                {
                    if (_malformedCountDict[remoteIPAddress].ContainsKey(tick))
                        _malformedCountDict[remoteIPAddress][tick]++;
                    else
                        _malformedCountDict[remoteIPAddress].Add(tick, );
                }
                else
                    _malformedCountDict.Add(remoteIPAddress,  } });

                //Delete any tick keys which are greater than LogInterval
                //删除超过LogInterval时间段的数据
                List<long> existingIPAddressTickKeys = new List<long>(_malformedCountDict[remoteIPAddress].Keys);

                //Sort from oldest to newest
                //排序
                existingIPAddressTickKeys.Sort();

                //Keep removing tick keys until we are within LogInterval
                //删除超过指定时间段的数据
                ; i < existingIPAddressTickKeys.Count; i++)
                {
                    if (DateTime.Now - new DateTime(existingIPAddressTickKeys[i]) > LogInterval)
                        _malformedCountDict[remoteIPAddress].Remove(existingIPAddressTickKeys[i]);
                    else
                        break;
                }

                //Add up the remaining counts and see if we need to ban this peer
                //查看是否需要查封此IP
                ;
                foreach(int count in _malformedCountDict[remoteIPAddress].Values)
                    currentMalformedCount += count;

                if (currentMalformedCount >= MalformedCountInIntervalBeforeBan)
                {
                    ipAddressNowBanned = true;
                    _bannedAddresses[remoteIPAddress] = new DateTime(tick);
                }
                else
                {
                    ipAddressNowBanned = false;
                    _bannedAddresses.Remove(remoteIPAddress);
                }

                //Remove the remote IPAddress key if no events are left
                //如果没有响应的时间 删除相应的IP
                )
                    _malformedCountDict.Remove(remoteIPAddress);
            }

            return ipAddressNowBanned;
        }

        /// <summary>
        /// Log a connection initialisation for the provided remote IPAddress.
        /// 记录一个格式错误的连接初始化 根据指定IP
        /// </summary>
        /// <param name="remoteIPAddress"></param>
        /// <returns>True if the remote IPAddress is now banned, otherwise false.</returns>
        public bool LogConnectionInitialise(IPAddress remoteIPAddress)
        {
            bool ipAddressNowBanned = false;

            lock (_syncRoot)
            {
                //Record the malformed data count
                //记录格式错误的数据的次数
                long tick = DateTime.Now.Ticks;
                if (_connectionInitialiseCountDict.ContainsKey(remoteIPAddress))
                {
                    if (_connectionInitialiseCountDict[remoteIPAddress].ContainsKey(tick))
                        _connectionInitialiseCountDict[remoteIPAddress][tick]++;
                    else
                        _connectionInitialiseCountDict[remoteIPAddress].Add(tick, );
                }
                else
                    _connectionInitialiseCountDict.Add(remoteIPAddress,  } });

                //Delete any tick keys which are greater than LogInterval
                //删除超过LogInterval时间段的数据
                List<long> existingIPAddressTickKeys = new List<long>(_connectionInitialiseCountDict[remoteIPAddress].Keys);

                //Sort from oldest to newest
                //排序
                existingIPAddressTickKeys.Sort();

                //Keep removing tick keys until we are within LogInterval
                //删除超过LogInterval时间段的数据
                ; i < existingIPAddressTickKeys.Count; i++)
                {
                    if (DateTime.Now - new DateTime(existingIPAddressTickKeys[i]) > LogInterval)
                        _connectionInitialiseCountDict[remoteIPAddress].Remove(existingIPAddressTickKeys[i]);
                    else
                        break;
                }

                //Add up the remaining counts and see if we need to ban this peer
                //查看是否需要查封相关的数据
                ;
                foreach (int count in _connectionInitialiseCountDict[remoteIPAddress].Values)
                    currentConnectionInitialisationCount += count;

                //Make a decision based on currentConnectionInitialisationCount
                //是否查封
                if (currentConnectionInitialisationCount >= ConnectionInitialiseCountInIntervalBeforeBan)
                {
                    ipAddressNowBanned = true;
                    _bannedAddresses[remoteIPAddress] = new DateTime(tick);
                }
                else
                {
                    ipAddressNowBanned = false;
                    _bannedAddresses.Remove(remoteIPAddress);
                }

                //Remove the remote IPAddress key if no events are left
                //如果事件不存在 删除相关IP
                )
                    _connectionInitialiseCountDict.Remove(remoteIPAddress);
            }

            return ipAddressNowBanned;
        }

        /// <summary>
        /// Returns true if the provided IPAddress has been banned due to DOSProtection.
        /// 如果参数中IP已经被查封  返回True
        /// </summary>
        /// <param name="remoteIPAddress">The IPAddress to check</param>
        /// <returns></returns>
        public bool RemoteIPAddressBanned(IPAddress remoteIPAddress)
        {
            lock(_syncRoot)
            {
                if (_bannedAddresses.ContainsKey(remoteIPAddress))
                {
                    //If the ban time is longer than the timeout we can allow it again
                    //如果过了封杀的时间  从查封列表中删除
                    if (DateTime.Now - _bannedAddresses[remoteIPAddress] > BanTimeout)
                    {
                        _bannedAddresses.Remove(remoteIPAddress);
                        return false;
                    }
                    else
                        return true;
                }
                else
                    return false;
            }
        }
    }
}

介绍开源的.net通信框架NetworkComms框架 源码分析(十)DOSProtection的更多相关文章

  1. DotNetty网络通信框架学习之源码分析

    DotNetty网络通信框架学习之源码分析 有关DotNetty框架,网上的详细资料不是很多,有不多的几个博友做了简单的介绍,也没有做深入的探究,我也根据源码中提供的demo做一下记录,方便后期查阅. ...

  2. 深入理解分布式调度框架TBSchedule及源码分析

    简介 由于最近工作比较忙,前前后后花了两个月的时间把TBSchedule的源码翻了个底朝天.关于TBSchedule的使用,网上也有很多参考资料,这里不做过多的阐述.本文着重介绍TBSchedule的 ...

  3. 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

    1 智能生活项目需求 看一个具体的需求 1) 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 2) 这些智能家电来自不同的厂家,我们不想针 ...

  4. 设计模式(二十一)——解释器模式(Spring 框架中SpelExpressionParser源码分析)

    1 四则运算问题 通过解释器模式来实现四则运算,如计算 a+b-c 的值,具体要求 1) 先输入表达式的形式,比如 a+b+c-d+e,  要求表达式的字母不能重复 2) 在分别输入 a ,b, c, ...

  5. $Django cbv源码分析 djangorestframework框架之APIView源码分析

    1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...

  6. ④NuPlayer播放框架之Renderer源码分析

    [时间:2016-11] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,渲染器,render] 0 导读 之前我们分析了NuPlayer的实现代码,本文将重点聚 ...

  7. ⑤NuPlayer播放框架之GenericSource源码分析

    [时间:2017-01] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,GenericSource] 0 导读 GenericSource是NuPlayer:: ...

  8. ③NuPlayer播放框架之类NuPlayer源码分析

    [时间:2016-10] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架] 0 引言 差不多一个月了,继续分析AOSP的播放框架的源码.这次我们需要深入分析的是N ...

  9. Laravel开发:Laravel框架门面Facade源码分析

    前言 这篇文章我们开始讲 laravel 框架中的门面 Facade,什么是门面呢?官方文档: Facades(读音:/fəˈsäd/ )为应用程序的服务容器中可用的类提供了一个「静态」接口.Lara ...

  10. Android 应用框架层 SQLite 源码分析

    概述   Android 在应用框架层为开发者提供了 SQLite 相关操作接口,其归属于android.database.sqlite包底下,主要包含SQLiteProgram, SQLiteDat ...

随机推荐

  1. java线程与并发(二)

    一般而言,线程通常有以下的这么几个状态: 创建状态:准备好了一个多线程操作对象 就绪状态:调用了start()方法,等待CPU调度 运行状态:执行run()方法,正在运行 阻塞状态:暂时停止执行,把资 ...

  2. 一个线上运营着3000+人的游戏,因为我不小心一个DROP DATABASE,全没了。 怎么办??跟我HOLD住!!!

    前言 今天下午3点,我按照惯例,打开游戏服务器,开新服部署嘛,游戏在腾讯开放平台,简单.闭着眼睛都OK.于是一轮子的复制黏贴拷贝,把服务器加起来,然后启动查看日志. ....突然发现不断的有Excep ...

  3. jQuery疑惑记录

    不断更新 1.项目中有一句 this.$html = $('<div/>').html(html).attr('sspa-mod-id', this.modName).hide();不知道 ...

  4. Atitit 异常机制与异常处理的原理与概论

    Atitit 异常机制与异常处理的原理与概论 1. 异常vs 返回码1 1.1. 返回码模式的处理 (瀑布if 跳到失败1 1.2. 终止模式  vs 恢复模式(asp2 1.3. 异常机制的设计原理 ...

  5. rabbitmq消息队列——"topic型交换器"

    在之前的章节中我们改进了我们的日志系统,我们使用direct型交换器代替了只能盲目广播消息的fanout型交换器,这使得我们可以有选择性地接收日志. 尽管使用direct型交换器改进了我们的日志系统, ...

  6. -bash: /usr/local/bin/react-native: No such file or directory

    执行react-native run-android/run-ios的时候出现 -bash: /usr/local/bin/react-native: No such file or director ...

  7. js中如果省略分号那么它是如何运行的

    在javascript工作中,我们几乎不会去省略分号:为了不必要的麻烦以及代码的规范,那么如果我们省略:会发生呢?预知详情请听下回分解. 看代码! 片段一: 1 var a 2 = 3 8 4 con ...

  8. 自引用指针this

    C++为成员函数提供了一个名字为this的指针,这个指针称为自引用指针,每当创建一个对象时,系统就把this指针初始化为指向该对象,即this指针的值是当前调用成员函数的对象的起始地址.每当调用一个成 ...

  9. android NDK 生成so 文件流程-ecplice

    1:生成jni目录 首先说一句网上,大部分博客这么写的:打开控制台,进入项目目录,运行javah -classpath bin/classes -d jni com.example.hellojni. ...

  10. 基于Metronic的Bootstrap开发框架经验总结(6)--对话框及提示框的处理和优化

    在各种Web开发过程中,对话框和提示框的处理是很常见的一种界面处理技术,用得好,可以给用户很好的页面体验,Bootstrap开发也一样,我们往往在页面新增.编辑.查看详细等界面使用弹出对话框层的方式进 ...