Bitcoin Core源码剖析之Banman模块
2020-02-02 11:38
1351 查看
Banman模块介绍
功能:检测、阻止Dos攻击。
原理:检测行为异常的用户、断开其连接。(即使代码发生错误也不会破坏整个网络。)
注意事项:
1、向恶意节点的同伴节点(node’s peer)发送某个东西,使得同伴节点丢弃它,这种方式是不被允许的。因为会被攻击者利用从而隔离一个节点或者分割整个网络。
2、通过发送东西、丢弃节点的方式,只对当前节版本有效、对上版本无效,这种方式是非常危险的,因为它在运行新代码的节点与运行老代码的节点之间产生网络分割。
历史改动/前世今生
2017年10月6日,重构,从src/net.cpp中抽离、封装成独立的模块。
2017年10月6日,重构,一群好(wu)玩(liao)的人把banman成员变量的命名风格由“小驼峰式”改为“匈牙利式”。
2018年10月31日,重构,将函数内部变量的命名风格由“小驼峰式”改为“匈牙利式”。
2018年10月31日,重构,为了避免对参数进行二次赋值,做了小小的重构。
2018年12月12日,新功能,允许“行为异常”的peer连接。
2019年1月3日,重构,为了使代码简洁,新增CBanEntry的构造函数。
结构
class BanMan { public: ~BanMan(); BanMan(fs::path ban_file, CClientUIInterface* client_interface, int64_t default_ban_time); void Ban(const CNetAddr& net_addr, const BanReason& ban_reason, int64_t ban_time_offset = 0, bool since_unix_epoch = false); void Ban(const CSubNet& sub_net, const BanReason& ban_reason, int64_t ban_time_offset = 0, bool since_unix_epoch = false); void ClearBanned(); int IsBannedLevel(CNetAddr net_addr); bool IsBanned(CNetAddr net_addr); bool IsBanned(CSubNet sub_net); bool Unban(const CNetAddr& net_addr); bool Unban(const CSubNet& sub_net); void GetBanned(banmap_t& banmap); void DumpBanlist(); private: void SetBanned(const banmap_t& banmap); bool BannedSetIsDirty(); //!set the "dirty" flag for the banlist void SetBannedSetDirty(bool dirty = true); //!clean unused entries (if bantime has expired) void SweepBanned(); CCriticalSection m_cs_banned; banmap_t m_banned GUARDED_BY(m_cs_banned); bool m_is_dirty GUARDED_BY(m_cs_banned); CClientUIInterface* m_client_interface = nullptr; CBanDB m_ban_db; const int64_t m_default_ban_time; };
其它小模块
CBanDB //banman.dat的读取、写入 CSubNet //节点的ip CBanEntry //节点被ban的原因、时间 typedef std::map<CSubNet, CBanEntry> banmap_t; //map
本质
通过该类的结构的观察,我们可以判断该类主要做了以下事情:
1、在
Ban函数、
unban函数和
IsBanned函数中对banmap_t进行增、删、查等操作。
2、在
DumpBanlist函数中,通过CBanDB模块对banman.dat文件进行读取和写入。
那么banman.dat里存储了什么?按照怎样的方式进行存储的?有兴趣的读者可以自行研读bitcoin core的代码。
(本文点赞数达到99+后,我会写相关文章来聊聊CBanDB模块通过怎样的方式把数据存入banman.dat、banman.dat里存了哪些数据、我是怎么追踪整个存储过程的。)
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Nginx源码剖析--模块配置信息初始化
- Nginx源码剖析--event类型模块
- [置顶] nginx源码阅读(十).ngx_event_core_module模块
- express源码剖析--Router模块和Layer模块
- jQuery 1.8源码分析 core.js核心模块 jQuery对象的构造分析
- Nginx源码分析-核心模块剖析及常见问题
- 【nodejs原理&源码赏析(6)】深度剖析cluster模块源码与node.js多进程(下)
- 源代码阅读方法 jQuery源码解析 核心模块core.js
- 《易道客》源码剖析之二:模块的定义和使用
- Nginx 模块自主开发七:源码剖析整个Nginx框架
- nginx源码分析—core模块callback
- 《易道客》源码剖析之二:模块的定义和使用
- Nginx 模块自主开发六:源码剖析配置文件解析过程
- Nginx源码分析:核心模块剖析及常见问题
- frp源码剖析-frp中的mux模块
- Mongoose源码剖析:核心处理模块
- MooTools 1.4 源码分析 - (关于Core、Type等模块分析)
- nginx module配置模块源码剖析
- Nginx源码剖析--HTTP模块配置信息的merge
- Mongoose源码剖析:核心处理模块