前文我们了解了GRE over IPSec 相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16601491.html;今天我们来聊一聊mac安全相关话题;
先来回顾下二层交换机的工作原理
我知道对于一台二层交换机来说,它的核心功能就是根据mac地址来转发数据;之所以能够根据mac地址来转发数据,是因为交换机的工作原理;交换机收到一个帧就会记录对应的帧的源mac和对应接口做对应;这样一来,当交换机收到对应目标mac的帧的时候,它就知道该把这个帧从那个接口转发出去;如果交换机收到的目标mac帧,在对应mac地址表里没有,此时交换机就会把对应数据包进行泛洪,如果在某一个接口收到了对应包的回复,此时它就会把对应接口和对应接口回复的源mac记录到mac地址表中;简单讲就是根据mac地址表来转发数据,如果没有就泛洪;
基于MAC的攻击
基于mac的攻击,通常手段有两种,一种是泛洪,一种是欺骗;所谓泛洪就是指攻击者在短时间内伪造很多mac地址帧,直接把交换机的mac地址表给写满;这样做最直接的后果就是,正常的数据包,交换机里没有对应mac,它不知道怎么转发,这个时候它就会泛洪,一泛洪,对应攻击者就能抓到数据包,从而获取数据;所谓欺骗是指攻击者恶意发送arp广播,告诉交换机,网关是我(通常就是欺骗网关,当然中间人攻击,也是类似的过程,两边欺骗);交换机收到攻击者的arp广播,它肯定会记录对应mac地址和接口,同时因为是arp广播,交换机上的其他pc收到对应的包,就会在本地记录对应mac和ip地址;从而在pc和网关通信时,会封装对应的mac地址,将数据发送给攻击者;这样一来攻击者就能够通过抓包等手段获取用户的数据;总之不管是mac泛洪攻击还是欺骗攻击,都是利用交换机的工作原理,通过mac地址表项来转发数据的特性来实行的攻击;

提示:上图为mac泛洪攻击的示意图;攻击者伪造很多mac地址,发送给交换机,以此来占用交换机mac地址表;使得正常的mac地址表项被覆盖;正常的mac地址表项被覆盖,正常用户通信时,交换机就会把对应数据包进行泛洪,使得用户数据被攻击者抓取;
MAC地址表项分类

提示:常见的就这三种表项,动态,静态和黑洞;动态表项是指交换机通过对帧内的源mac进行学习而来,有老化时间;静态和黑洞都是管理员手动配置的,都不会老化;黑洞表项是指收到对应mac地址的帧都会被丢弃,不管是源mac还是目标mac,交换机只要收到对应有黑洞表项的mac就会主动丢弃;
MAC地址表安全功能

MAC地址表特性参数

提示:默认交换机不做任何配置,动态学习mac的功能是开启的,老化时间为5分钟,端口的mac地址的优先级都是0;如果开启了端口安全,默认端口安全mac地址学习限制数量为1,即只能学习到一个mac,多的学习不到;端口安全的保护动作为restrict,即转发合法流量和发送告警;mac地址飘逸表项老化时间为5分钟,丢弃全0非法mac地址,以及收到全0非法mac地址报警功能都是关闭的;mac刷新arp功能也是关闭的;
实验:基于mac的泛洪攻击

实验环境说明:如上实验拓扑,我们使用云来桥接本地lo接口,另一端开一个kali来模拟攻击者
没有攻击,对应交换机mac地址表

提示:正常情况下,如果交换机没有收到帧,对应是mac地址表是空的才对,上面的mac地址是我们本地lo接口的mac,这是我们使用云桥接lo接口,默认lo接口会每隔一段时间发送一个ssdp包来发现局域网里的设备,所以我们在交换机上能够看到对应lo接口的mac地址;如下抓包

使用kali ping pc1和pc2

在交换机上查看mac地址表项

提示:可以看到对应的mac和接口一一对应;正是因为这个mac表项,对应交换机就能正常的将数据包转发到对应接口发送出去;
查看交换机mac地址表项汇总

提示:这里是模拟器bug,它的统计数据显示不出来;从上图可以看到该交换机最大容纳32768条mac地址和接口对应的记录,一旦超过这个记录就会覆盖最老的记录(覆盖只针对动态学习到的mac,静态是覆盖不了的);
使用kali攻击sw1

提示:使用macof工具来伪装mac地址,该工具能在一瞬间伪造大量mac地址帧,然后从网卡发送出去;-i选项是用来指定从那个网卡发送;

提示:可以看到我们只把macof工具开来不到5秒,对应交换机就收到了大量的mac地址帧,瞬间交换机的mac地址表也多了许多mac地址条目;
以上就是mac泛洪攻击的现象,我们总结一下,出现mac泛洪攻击时,查看交换机的mac地址表项就会发现,在某一个接口下会存在大量的mac地址条目,很显然这不正常;
MAC安全特性配置
1、添加静态mac地址表项

提示:添加静态mac时,我们需要写清楚对应mac 对应的接口和vlan即可;
验证:查看静态mac是否添加成功?

提示:可以看到对应mac地址表里就多了一条我们刚才添加的记录;汇总里也统计出有一条静态条目;
2、添加黑洞mac地址表项

验证:用kali ping pc2的地址,看看是否能够ping通呢?

提示:可以看到现在kali就不能正常ping通pc2,原因是kali拿不到pc2的mac,因为pc2的mac是一个黑洞mac,对应pc2收到kali的arp请求,在发送自己的mac时,交换机会丢弃对应pc2发送到任何包;


提示:第二张截图是在pc2上抓取的,可以看到pc2的确回复了kali的arp请求,但是kali却没有收到,原因就是交换机丢弃了pc2的包,因为pc2发送的包,源mac被设置成黑洞mac了;
3、配置老化时间

提示:默认mac地址表项的老化时间为300秒;
4、禁止mac地址学习功能

提示:以上命令可以在vlan模式和接口模式下使用,在接口模式下使用作用范围为当前接口,在vlan模式下使用作用范围是对应vlan;该命令后面还有两个参数,一个是forward,一个是discard;默认是不写后面的动作就是forward,表示转发;即对应端口或vlan所有接口,只是关闭动态学习mac的功能,但收到arp回复包进行转发;discard则表示根据目标mac地址,如果目标mac地址在mac地址表项存在,则转发,如果目标mac地址不存在mac地址表则丢弃;
实验:把g0/0/4接口的学习mac功能关闭,并配置默认动作为discard

查看mac地址表,看看对应g0/0/4口是否学习到mac?

提示:可以看到现在mac表,对应g0/0/4口没有学习到任何mac;
用pc1 ping pc3,看看对应接口是否会学习到mac?通信是否会通呢 ?

提示:可以看到对应pc1pingpc3并没有ping通;
查看mac地址表项

提示:可以看到4口也没有学习到mac;
抓包查看过程

提示:在pc3上抓包,可以看到对应pc3收到pc1的arp广播,并做了回复;
在pc1上抓包

提示:在pc1上抓包,对应pc3的arp回复包并没有收到,说明g0/0/4口丢弃了arp回复包,导致pc1拿不到pc3的mac,也就无法正常通信;
删除g0/0/4的禁止动态学习mac地址,先让g0/0/4学习到mac,然后再禁用学习功能呢

pc3发包,让交换机学习到mac


禁用4口学习mac功能

提示:可以看到现在4口已经学习到mac;
现在pc1 ping pc3 看看是否能通?

提示:可以看到现在pc1pingpc3是能够正常ping通的,这是因为交换机的mac地址表项里对应通信的目标mac,对应数据包会转发,如果没有则丢弃;当然,如果mac地址表老化,对应条目被删除,那么通信也无法正常进行;
把动作改为forward,看看对应接口是否能够学习到mac呢?通信是否正常呢?

pc1 ping pc3看看g0/0/4是否学习到mac?对应通信是否能够正常通行呢?


提示:可以看到通信是可以正常通讯,但是对应接口是不能够学习到mac条目的;
5、限制端口学习mac地址的数量

提示:该命令可以在接口模式和vlan模式下使用,在接口模式下作用范围当前接口,在vlan模式下作用范围是对应vlan;
验证:用macof工具攻击,看看对应3口是否只能学习到10条mac地址条目呢?

提示:可以看到对应交换机的终端在报警,对应3口也只能学习到10条mac地址条目;这里需要注意,这个学习到的mac是先学满10条,后面的就不学习了,并不是重复覆盖;
6、配置告警

提示:开启或关闭报警,必须配置前边的最大学习限制才可以,否则它会提示Error: Failed to change the configurations of the action or alarm because the MAC-limit rule does not exist.;
7、开启丢弃全0非法mac地址报文的功能

提示:以上两条命令在全局模式下使用;第一条作用是开启因收到全0非法mac报警;第二条表示开启丢弃全0非法mac;
8、配置mac刷新arp功能

提示:arp表是ip地址和mac地址以及出接口的对应表,mac地址表是mac地址和出接口的对应表;两者老化时间不一样,就导致当mac地址表是g0/0/1接口更新到g0/0/2口,对应arp里的信息还在g0/0/1口,这会导致通信中断;为了避免这样的问题,上述命令就表示当mac表项发生变化,通知arp表项对应条目更新,从而避免通信中断的问题;
官方文档示意图

我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A