介绍开源的.net通信框架NetworkComms框架 源码分析(十)DOSProtection
原文网址: 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的更多相关文章
- DotNetty网络通信框架学习之源码分析
DotNetty网络通信框架学习之源码分析 有关DotNetty框架,网上的详细资料不是很多,有不多的几个博友做了简单的介绍,也没有做深入的探究,我也根据源码中提供的demo做一下记录,方便后期查阅. ...
- 深入理解分布式调度框架TBSchedule及源码分析
简介 由于最近工作比较忙,前前后后花了两个月的时间把TBSchedule的源码翻了个底朝天.关于TBSchedule的使用,网上也有很多参考资料,这里不做过多的阐述.本文着重介绍TBSchedule的 ...
- 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)
1 智能生活项目需求 看一个具体的需求 1) 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 2) 这些智能家电来自不同的厂家,我们不想针 ...
- 设计模式(二十一)——解释器模式(Spring 框架中SpelExpressionParser源码分析)
1 四则运算问题 通过解释器模式来实现四则运算,如计算 a+b-c 的值,具体要求 1) 先输入表达式的形式,比如 a+b+c-d+e, 要求表达式的字母不能重复 2) 在分别输入 a ,b, c, ...
- $Django cbv源码分析 djangorestframework框架之APIView源码分析
1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...
- ④NuPlayer播放框架之Renderer源码分析
[时间:2016-11] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,渲染器,render] 0 导读 之前我们分析了NuPlayer的实现代码,本文将重点聚 ...
- ⑤NuPlayer播放框架之GenericSource源码分析
[时间:2017-01] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,GenericSource] 0 导读 GenericSource是NuPlayer:: ...
- ③NuPlayer播放框架之类NuPlayer源码分析
[时间:2016-10] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架] 0 引言 差不多一个月了,继续分析AOSP的播放框架的源码.这次我们需要深入分析的是N ...
- Laravel开发:Laravel框架门面Facade源码分析
前言 这篇文章我们开始讲 laravel 框架中的门面 Facade,什么是门面呢?官方文档: Facades(读音:/fəˈsäd/ )为应用程序的服务容器中可用的类提供了一个「静态」接口.Lara ...
- Android 应用框架层 SQLite 源码分析
概述 Android 在应用框架层为开发者提供了 SQLite 相关操作接口,其归属于android.database.sqlite包底下,主要包含SQLiteProgram, SQLiteDat ...
随机推荐
- [体感游戏] 1、MPU6050数据采集传输与可视化
最近在研究体感游戏,到目前为止实现了基于51单片机的MPU6050数据采集.利用蓝牙模块将数据传输到上位机,并利用C#自制串口数据高速采集软件,并且将数据通过自制的折线图绘制模块可视化地展示出来等功能 ...
- MySQL服务器安装配置-非安装版、windows版
文档以5.6.30版本为例子说明 1. 下载MySQL http://dev.mysql.com/downloads/mysql/5.6.html#downloads 我们可以选择自己所需要的版本.环 ...
- Http Header里的Content-Type
之前一直分不清楚post请求里Content-Type方式,如application/x-www-form-urlencoded.multipart/form-data.本文会介绍Content-Ty ...
- fir.im Weekly - 当技术成为一种 “武器”
最近纷纷扰扰,快播公开庭审,携程事件仍在升级,百度还在继续无底线.我们相信技术本身并不可耻,但是用技术作恶就是可耻.当技术成为一种武器,Do not be evil. 好了,继续本期的 fir.im ...
- YaHoo 前端优化军规
1.Minimize HTTP Requests 减少HTTP请求 图片.css.script.flash等等这些都会增加http请求数,减少这些元素的数量就能减少响应时间.把多个JS.CSS在可能的 ...
- KnockoutJS 3.X API 第四章 表单绑定(12) selectedOptions、uniqueName绑定
selectedOptions绑定目的 selectedOptions绑定控制当前选择多选列表中的哪些元素. 这旨在与<select>元素和选项绑定结合使用. 当用户选择或取消选择多选列表 ...
- XML学习笔记7——XSD实例
在前面的XSD笔记中,基本上是以数据类型为主线来写的,而在我的实际开发过程中,是先设计好了XML的结构(元素.属性),并写好了一份示例,然后再反过来写XSD文件(在工具生成的基础上修改),也就是说,是 ...
- WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要针对WPF项目 ...
- 使用余弦定理制作磁盘形状h5音乐播放器
目录 [1]功能实现 [2]效果展示 [3]原理说明 旋转原理 余弦定理 [4]代码实现 HTML CSS JS [5]源码查看 功能实现 [1]歌曲播放进度转换成视觉的旋转角度 [2]点击磁盘任意位 ...
- java中有关线程的题目
1,看一下下面程序错误发生在哪一行! class Test implements Runnable{ public void run(Thread t){ } } 2,输出结果是什么? class T ...