1.go-iptables功能与源码详解
2.Github 源码阅读神器推荐
3.Vue3(四)CDN模式下的桶源“工程化”的开发方式
4.eos全家桶系列eos系统合约介绍—系统操作合约eosio.system(上)
5..cs是什么文件
6.JFinal和Spring Boot对比
go-iptables功能与源码详解
介绍iptables之前我们先搬出他的父亲netfilter,netfilter是码全基于 Linux 2.4.x或更新的内核,提供了一系列报文处理的家桶介绍能力(过滤+改包+连接跟踪),具体来讲可以包含以下几个功能:
其实说白了,软件netfilter就是桶源操作系统实现了网络防火墙的能力(连接跟踪+过滤+改包),而iptables就是码全免费看app源码用户态操作内核中防火墙能力的命令行工具,位于用户空间。家桶介绍快问快答,软件为啥计算机系统需要内核态和用户态(狗头)。桶源
既然netfilter是码全对报文进行处理,那么我们就应该先了解一下内核是家桶介绍如何进行收发包的,发生报文大致流程如下:
netfilter框架就是软件作用于网络层中,在一些关键的桶源报文收发处理路径上,加一些hook点,码全可以认为是家桶介绍一个个检查点,有的在主机外报文进入的位置(PREROUTING ),有的在经过路由发觉要进入本机用户态处理之前(INPUT ),有的在用户态处理完成后发出的地方(OUTPUT ),有的在报文经过路由并且发觉不是本机决定转发走的位置(FOWARD ),有的在路由转发之后出口的位置(POSTROUTING ),每个检查点有不同的规则集合,这些规则会有一定的优先级顺序,如果报文达到匹配条件(五元组之类的)且优先级最高的规则(序号越小优先级越高),内核会执行规则对应的动作,比如说拒绝,放行,记录日志,丢弃。
最后总结如下图所示,里面包含了netfilter框架中,报文在网络层先后经过的一些hook点:
报文转发视角:
iptables命令行工具管理视角:
规则种类:
流入本机路径:
经过本机路径:
流出本机路径:
由上一章节我们已经知道了iptables是用户态的命令行工具,目的就是为了方便我们在各个检查点增删改查不同种类的规则,命令的格式大致如下,简单理解就是针对具体的哪些流(五元组+某些特定协议还会有更细分的匹配条件,比如说只针对tcp syn报文)进行怎样的动作(端口ip转换或者阻拦放行):
2.1 最基本的增删改查
增删改查的命令,我们以最常用的filter规则为例,就是最基本的防火墙过滤功能,实验环境我先准备了一个centos7的docker跑起来(docker好啊,实验完了直接删掉,不伤害本机),精准筹码锁定源码并通过iptables配置一些命令,然后通过主机向该docker发生ping包,测试增删改查的filter规则是否生效。
1.查询
如果有规则会把他的序号显示出来,后面插入或者删除可以用 iptables -nvL -t filter --line
可以看出filter规则可以挂载在INPUT,FORWARD,OUTPUT检查点上,并且兜底的规则都是ACCEPT,也就是没有匹配到其他规则就全部放行,这个兜底规则是可以修改的。 我们通过ifconfig查看出docker的ip,然后主机去ping一波:
然后再去查一下,会发现 packets, bytes ---> 对应规则匹配到的报文的个数/字节数:
2. 新增+删除 新增一条拒绝的报文,我们直接把docker0网关ip给禁了,这样就无法通过主机ping通docker容器了(如果有疑问,下面有解答,会涉及docker的一些小姿势): iptables -I INPUT -s ..0.1 -j DROP (-I不指定序号的话就是头插) iptables -t filter -D INPUT 1
可见已经生效了,拦截了ping包,随后我删除了这条规则,又能够ping通了
3. 修改 通过-R可以进行规则修改,但能修改的部分比较少,只能改action,所以我的建议是先通过编号删除规则,再在原编号位置添加一条规则。
4. 持久化 当我们对规则进行了修改以后,如果想要修改永久生效,必须使用service iptables save保存规则,当然,如果你误操作了规则,但是并没有保存,那么使用service iptables restart命令重启iptables以后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样。
再使用service iptables save命令保存iptables规则
5. 自定义链 我们可以创建自己的规则集,这样统一管理会非常方便,比如说,我现在要创建一系列的web服务相关的规则集,但我查询一波INPUT链一看,妈哎,条规则,全民推客源码这条规则有针对mail服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,我这看一遍下来头都大了,所以就产生了一个非常合理的需求,就是我能不能创建自己的规则集,然后让这些检查点引用,答案是可以的: iptables -t filter -N MY_WEB
iptables -t filter -I INPUT -p tcp --dport -j MY_WEB
这就相当于tcp目的端口的报文会被送入到MY_WEB规则集中进行匹配了,后面有陆续新规则进行增删时,完全可以只针对MY_WEB进行维护。 还有不少命令,详见这位大佬的总结:
回过头来,讲一个关于docker的小知识点,就是容器和如何通过主机通讯的?
这就是veth-pair技术,一端连接彼此,一端连接协议栈,evth—pair 充当一个桥梁,连接各种虚拟网络设备的。
我们在容器内和主机敲一下ifconfig:
看到了吧,容器内的eth0和主机的vetha9就是成对出现的,然后各个主机的虚拟网卡通过docker0互联,也实现了容器间的通信,大致如下:
我们抓个包看一哈:
可以看出都是通过docker0网关转发的:
最后引用一波 朱老板总结的常用套路,作为本章结尾:
1、规则的顺序非常重要。
如果报文已经被前面的规则匹配到,IPTABLES则会对报文执行对应的动作,通常是ACCEPT或者REJECT,报文被放行或拒绝以后,即使后面的规则也能匹配到刚才放行或拒绝的报文,也没有机会再对报文执行相应的动作了(前面规则的动作为LOG时除外),所以,针对相同服务的规则,更严格的规则应该放在前面。
2、当规则中有多个匹配条件时,条件之间默认存在“与”的关系。
如果一条规则中包含了多个匹配条件,知识付费 APP源码那么报文必须同时满足这个规则中的所有匹配条件,报文才能被这条规则匹配到。
3、在不考虑1的情况下,应该将更容易被匹配到的规则放置在前面。
4、当IPTABLES所在主机作为网络防火墙时,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外。
5、在配置IPTABLES白名单时,往往会将链的默认策略设置为ACCEPT,通过在链的最后设置REJECT规则实现白名单机制,而不是将链的默认策略设置为DROP,如果将链的默认策略设置为DROP,当链中的规则被清空时,管理员的请求也将会被DROP掉。
3. go-iptables安装
go-iptables是组件库,直接一波import " github.com/coreos/go-ip...",然后go mod tidy一番,就准备兴致冲冲的跑一波自带的测试用例集,没想到上来就是4个error:
这还了得,我直接去go-iptables的仓库issue上瞅瞅有没有同道中人,果然发现一个类似问题:
虽然都是test failures,但是错的原因是不一样的,但是看他的版本是1.8的,所以我怀疑是我的iptables的版本太老了,一个iptables -v看一眼:
直接用yum update好像不能升级,yum search也没看到最新版本,看来只能下载iptables源码自己编译了,一套连招先打出来:
不出意外的话,那就得出点意外了:
那就继续下载源码安装吧,然后发现libmnl 又依赖libnftnl ,所以直接一波大招,netfilter全家桶全安装:
Finally,再跑一次测试用例就成功了,四连阳源码下面就可以愉快的阅读源码了:
4. 如何使用go-iptables
5. go-iptables源码分析
关键结构体IPTables
初始化函数func New(opts ...option) (*IPTables, error) ,流程如下:
几个重要函数的实现:
其他好像也米有什么,这里面就主要介绍一下,他的命令行执行是怎么实现的:
6. Reference
Github 源码阅读神器推荐
一款高效阅读和学习源码的开源项目,source-code-hunter(doocs.github.io/source-code-hunter),为源码阅读爱好者提供便利。
借助source-code-hunter,用户能够系统化阅读各种框架的源码,包括spring全家桶、Mybatis系列、Netty、dubbo等,以及中间件、JDK源码解析。
该项目为初学者和源码学习者提供了学习心得,帮助他们建立学习模式,避免无用阅读,加速学习进程。
对于没有源码阅读经验的用户,建议先阅读学习心得,了解学习方法和思考。在日常学习中,先通过视频了解源码的大致设计和功能点,再结合source-code-hunter阅读源码,同时使用本地调试跟踪实现,提升学习效率。
source-code-hunter涵盖了常见框架的源码解析,为用户提供了丰富的学习资源,帮助用户深入理解源码逻辑,提高编程技能。
Vue3(四)CDN模式下的“工程化”的开发方式
本文探索在CDN模式下实现“工程化”开发方式的一种简化方法。对于初学者来说,了解如何通过“工程化”进行Vue开发可能有些困惑,本文尝试提供一个较为直接且简便的解决方案。通常,学习Vue时会面对webpack、node、npm、cnpm、yarn、脚手架等工具的使用,这些工具虽强大,但对于初学者来说,学习曲线陡峭,容易感到头疼。
在尝试使用CDN模式下的“工程化”开发方式后,发现这种方法在一定程度上简化了项目构建流程。其主要优点在于减少对复杂工具链的学习,同时仍保持了代码的组织性和模块化特性。以下为实现CDN模式下仿工程化开发的主要步骤:
Vue全家桶和UI库的加载方式
传统方式下,Vue全家桶和UI库通过CDN链接加载。浏览器会对JS文件进行缓存,首次加载时可能稍慢,但后续加载速度会显著提升。这种方式对于资源优化和减少首次加载时间有良好效果。
JS代码的加载方式
Vite也采用类似方式加载JS代码,通过引入`type="module"`,确保代码模块化加载,提升性能和资源管理效率。
文件夹结构和代码编写风格
采用工程化方式组织文件夹结构,保持代码的可读性和可维护性。使用import语句加载JS文件,兼容CDN环境,实现代码的模块化引用。
main.js和app.js的对比
main.js和工程化项目中的主入口文件保持一致,但在CDN模式下,简化了版本管理,通过异步加载方式动态拼接版本号,确保每次加载时获取最新代码。
动态路由和异步组件
采用动态路由管理页面导航,同时使用自定义函数加载HTML和JS文件,转换为动态组件,实现了组件的动态加载。此方式兼容了CDN环境的特性,提供了与工程化项目类似的组件加载机制。
组件内部加载组件
通过Vue的异步组件特性,简化了组件间依赖的加载方式。在CDN环境下,通过静态函数挂载到全局窗口对象,并利用import异步加载JS文件,实现组件的加载和模板的动态设置,提升了开发效率。
代码示例和调试
提供直观的代码示例,清晰展示JS代码和模板的编写方式。在CDN环境下,通过可视化工具查看加载状态,便于开发者快速定位和解决潜在问题。同时,通过源码在线演示,直观展示项目运行效果,帮助开发者更好地理解实现过程。
通过上述方法,可以在CDN模式下实现接近于工程化开发的体验,简化了资源加载和管理的复杂性,同时保留了Vue开发的核心优势。这种方法为初学者提供了一条更加直接的学习路径,同时对于已有经验的开发者来说,也提供了一种灵活的项目构建方案,兼顾了高效开发和资源优化。
eos全家桶系列eos系统合约介绍—系统操作合约eosio.system(上)
本篇文章旨在详细介绍EOS系统中至关重要的系统操作合约——eosio.system。该合约负责处理包括账户创建、投票选举超级节点、资源质押和域名竞拍等多种功能。本文将重点阐述eosio.system合约在资源质押和超级节点投票方面的具体实现。
EOS网络中的超级节点选举和投票机制均以账户为中心展开。eosio.system合约中的投票功能可通过cleos system命令行工具便捷地执行。投票过程涉及两个主要角色:投票账户和候选超级节点账户。它们必须遵循特定的步骤才能完成投票或当选:
**步骤一:抵押EOS资源
**抵押EOS资源以换取cpu和net资源是投票前的必要条件。使用delegatebw命令,指定抵押EOS的账户和接收抵押资源的账户。
**步骤二:注册为超级节点候选账户
**注册为超级节点候选账户需要提供公钥,该公钥用于当选后产块时的签名验证。
**步骤三:投票给超级节点候选账户
**通过voteproducer命令,投票账户可以为多个超级节点候选账户投票。投票账户可以取消投票通过赎回质押的EOS,赎回期为3天。
下面将演示赎回质押EOS的步骤:
**步骤一:取消质押
**使用undelegatebw命令取消质押,该命令与delegatebw命令相似。在某些情况下,例如本机私链,赎回期可被调整,质押的EOS将在指定时间后赎回到账。
**步骤二:源码解析
**delegatebw和undelegatebw命令最终都会调用changebw方法。changebw根据操作类型进行相应的资源转移或赎回操作。
**步骤三:投票权重衰减与更新
**为了鼓励用户定期投票,EOS引入了投票权重衰减机制。用户需定期重新投票以维持其投票权重,确保投票效力不受影响。
本文简要介绍了eosio.system合约在资源质押和超级节点投票方面的核心功能及其背后的源码实现。接下来,我们将探讨eosio.system合约在域名竞拍方面的功能,敬请期待。
.cs是什么文件
.cs是C Sharp程序设计语言的源代码文件。它是一种微软主推的面向对象的高级编程语言,拥有同Java类似的语法和使用方式,但是主要是在微软全家桶上开发并编译的,依赖的环境也主要是微软的.net。C Sharp编写的程序,其源文件拓展名就是.cs,可以用它来编译可执行程序。其旨在设计成为一种“简单、现代、通用”,以及面向对象的程序设计语言。软件必须做到强大、持久,并具有较强的编程生产力。
C#是由C和C++衍生出来的一种安全的、稳定的、简单的、优雅的面向对象编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
C#是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT .NET平台的应用程序,MICROSOFT .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。
C#使得C++程序员可以高效的开发程序,且因可调用由 C/C++ 编写的本机原生函数,而绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。
JFinal和Spring Boot对比
轻量级MVC框架:JFinal与Spring Boot的较量 JFinal,作为一款轻量级的MVC+ORM集成框架,它的设计理念就像简化版的SSH,旨在提供快速开发和简单易学的体验。它强调代码量少、学习简单,同时拥有Java语言的高效性和动态语言的开发效率。与之相比,Spring Boot则更像一个自动化配置神器,以Spring全家桶的集成和配置简化为核心,几行代码就能启动应用,无需繁冗的XML配置。 Spring Boot:简化Spring开发的革命 Spring Boot以其一键式创建Spring应用的能力脱颖而出,它内嵌Servlet容器,提供了Starter简化Maven配置,通过自动配置尽可能减少开发者的工作量。它的特性包括快速开发、健康检查和外部化配置,无需代码生成,直接上手。 对比:高效与易用的较量 尽管两者都旨在简化开发,但JFinal在上手速度和学习成本上更具优势,其文档简洁明了,一天内就能创建项目。而Spring Boot虽然功能强大,但文档量大且英语依赖性高,对新手而言可能稍显复杂。 JFinal的MVC架构设计精巧,使用简单,使开发者能深入理解框架,降低调试成本。而Spring Boot虽然也支持约定优于配置,但在源码阅读和问题定位上,JFinal的精简设计可能更胜一筹。 JFinal的Db + Record模式让数据库操作更灵活,无需繁琐的JavaBean映射。ActiveRecord的全面支持使得数据库开发高效快捷,相比之下,Spring Boot需额外集成SpringDataJPA或MyBatis来实现这些功能。 在插件扩展性上,JFinal的Plugin体系结构简洁易用,自定义插件过程简单,而Spring Boot虽有丰富的插件生态,但使用和维护可能较为复杂。 最后,JFinal的体积小巧且无第三方依赖,这反映了其对简洁和可扩展性的追求。而Spring Boot虽功能全面,但其自身重量级的特性可能成为初学者和小型项目的负担。 国内支持:社区力量的差异 JFinal在国内拥有稳定的用户群体,作者直接支持,遇到问题能得到及时解答,而Spring Boot虽然全球范围内应用广泛,但在国内的特定支持可能不如JFinal直接。 总的来说,JFinal凭借其精简的设计和易用性,以及对国内用户的贴心支持,在与Spring Boot的竞争中展现出了独特的优势。然而,Spring Boot的全面集成和强大的生态系统,使其在大型项目和复杂需求场景下仍然占据一席之地。开发者应根据项目需求和个人偏好,选择最适合自己的框架。