这是我最爱的姚老师给我们上的实验课,学到的干货多多,写篇博客记录一下,记录信息安全学习道路上迈进的重要的一步!
其实本来今天是想继续学永恒之蓝漏洞的,但是由于我防火墙实践还没做完,做到一半,就是那个现在kali不能上网了,所以要先完成这个实验,才能继续实践永恒之蓝。
本次实验的内容是:用kali作为交换机,连接两个网络(其实一个网络只有一台机器),通过实践去明白防火墙的原理。非常重要且困难的一步就是环境搭建,这个后面会详细记录操作。实验工具是kali集成的iptables
介绍一下iptables的理论(这里很长且是复制粘贴,不理解也没关系,实践中会慢慢明白,但是我觉得这个理论介绍得非常好,所以记录一下):
iptables只是一个内核包过滤的工具,iptables可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正来执行这些过滤规则的是netfilter(Linux内核中一个通用架构)及其相关模块(如iptables模块和nat模块)。
netfilter提供了一系列的“表(tables)”,每个表由若干“链(chains)”组成,而每条链中有一条或数条规则(rule)组成。我们可以这样来理解,netfilter是表的容器,表是链的容器,链又是规则的容器。
netfilter系统缺省的表为“filter”,该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件:如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据预先定义的策略(policy)来处理该数据包。
数据包在filter表中的流程:有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况:
(1) 如果数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
(2) 如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
(3) 如果数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
当我们在使用iptables NAT功能的时候,我们所使用的表不再是“filter”表,而是“nat”表,所以我们必须使用“-t nat”选项来显式地指明。因为系统缺省的表是“filter”,所以在使用filter功能时,我们没有必要显式的指明“-t filter”。
同“filter”表一样,nat表也有三条缺省的链,这三条链也是规则的容器,它们分别是:
(1) PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的IP地址,为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT。
(2) POSTROUTING:可以在这里定义进行源NAT的规则,在路由器进行路由之后才进行源NAT。
(3) OUTPUT:定义对本地产生的数据包的目的NAT规则。
iptables常用操作语法
功能 命令 语法 说明
添加规则 -A iptables -A INPUT -p tcp -j ACCEPT 在所选择的规则链末尾添加规则,当源地址或目的地址是以名字而不是IP地址的形式出现时,这些名字将被解析为多个地址,这条规则将和所有可用的地址结合。
删除规则 -D iptables -D INPUT -p tcp -j ACCEPT 从所选链中删除规则。有两种方法指定要删除的规则:一种方法是把规则完整定出,另一种方法是指定规则在所选链中的序号(每条链的规则都各自从1被编号)。
自定义链重命名 -E iptables -E customlist userlist 对自定义的链重命名,原来的名字在前,新名字在后。
清空规则 -F iptables -F INPUT 清空所选的链,如果没有指定链,则清空指定表中的所有链。默认情况下清空默认表所有的链。
插入规则 -I iptables -I INPUT 1 -p tcp -j ACCEPT 在指定链内的某个位置插入规则,如果序号为1或没有序号,规则会被插入到的头部。
显示规则 -L iptables -L INPUT 显示所选链的所有规则,如果没有指定链,则显示指定表中的所有链。默认情况下显示默认表所有的链。精确输出受其它参数影响,如-n和-v等参数。
用户自定义链 -N iptables -N customlist 根据用户指定的名字建立新的链。所用的名字不能和已有的链、target同名。
默认策略 -P iptables -P INPUT DROP 为链设置默认的target(ACCEPT、DROP、REJECT、REDIRECT、)。target称作策略,所有不符合规则的包都被强制使用这个策略。只有内建的链才可以使用策略,但内建的链和用户自定义链都不能被作为策略使用。
替换规则 -R iptables -R INPUT 1 -p udp -j ACCETP 在所选中的链里指定的行上(每条链的规则都各自从1被编号)替换规则。它主要用于试验不同的规则。当源地址或目的地址是以名字而不是IP地址的形式出现时,如果这此名字可以被解析为多个地址,则这条命令会失败。
删除用户自定义链 -X iptables -X customlist 删除指定的用户自定义链。这条链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将会删除默认表所有非内建的链。
计数器归零 -Z iptables -Z 把指定链(如未指定则认为所有链)的所有计数器归零。
二、常用通用匹配语法
对于任何协议及协议的扩展,通用匹配都可以直接使用。
(1) 匹配指定协议。
匹配-p,--protocol/使用iptables -A INPUT -p tcp -j ACCEPT/说明匹配指定的协议,指定协议的形式有以下几种:①名字不分大小写,但必须是在/etc/protocols中定义的;②可以使用协议相应的整数值。例如,ICMP的值是1,TCP是6,UDP是17;③缺少设置ALL,相应数值是0,要注意这只代表匹配TCP、UDP、ICMP,而不是/etc/protocols中定义的所有协议;④可以是协议列表,以英文逗号为分隔符,如:udp,tcp;⑤可以在协议前加英文的感叹号表示取反,注意有空格,如:--protocol !tcp表示非TCP协议,也就是UDP和ICMP。可以看出这个取反的范围只是TCP、UDP和ICMP。
(2) 以IP源地址匹配包。
匹配-s,--src,--source/使用iptables -A INPUT -s 192.168.0.1 -j ACCEPT/说明以IP源地址匹配包。地址的形式如下:①单个地址,如192.168.0.1,也可写成192.168.0.1/255.255.255.255或192.168.0.1/32;②网络,如192.168.0.0/24,或192.168.0.0/255.255.255.0;③在地址前加英文感叹号表示取反,注意空格,如--source !192.168.0.0/24表示除此地址外的所有地址;④缺省是所有地址。
(3) 以IP目的地址匹配包。
匹配-d,--dst,--destination/使用iptables -A INPUT -d 192.168.0.1 -j ACCEPT/说明以IP目的地址匹配包。地址的形式和--source完全一样。
(4) 以包进入本地使用的网络接口匹配包。
匹配-i/使用iptables -A INPUT -i eth0 -j ACCEPT/说明以包进入本地所使用的网络接口来匹配包。要注意这个匹配操作只能用于INPUT,FORWARD和PREROUTING这三个链,用在其他任何地方会提示错误信息。指定接口有以下方法:①指定接口名称,如:eth0、ppp0等;②使用通配符,即英文加号,它代表字符数字串。若直接用一个加号,即iptables -A INPUT -i +表示匹配所有的包,而不考虑使用哪个接口。通配符还可以放在某一类接口的后面,如:eth+表示匹配所有从Ethernet接口进入的包;③在接口前加英文感叹号表示取反,如:-i ! eth0意思是匹配来自除eth0外的所有包。
(5) 以包离开本地所使用的网络接口来匹配包。
匹配-o/使用iptables -A OUTPUT -o eth1 -j ACCEPT/说明以包离开本地所使用的网络接口来匹配包。要注意这个匹配操作只能用于OUTPUT,FORWARD和POSTROUTING这三个链,用在其他任何地方会提示错误信息。
(6) 匹配通信源端口。
匹配--source-port,--sport/使用iptables -A INPUT -p tcp --sport 1111/说明当通信协议为TCP或UDP时,可以指定匹配的源端口,但必须与匹配协议相结合使用。
(7) 匹配通信目的端口。
匹配-- destination-port,--dport/使用iptables -A INPUT -p tcp --dport 80/说明当通信协议为TCP或UDP时,可以指定匹配的目的端口,但必须与匹配协议相结合使用。
iptables功能扩展
TCP扩展
iptables可以扩展,扩展分为两种:一种是标准的;另一种是用户派生的。如果指定了“-p tcp”,那么TCP扩展将自动加载,通过--tcp-flags扩展,我们指定TCP报文的哪些Flags位被设置,在其后跟随两个参数:第一个参数代表Mask,指定想要测验的标志位;第二个参数指定哪些位被设置。
例:设置iptables防火墙禁止来自外部的任何tcp主动请求,并对此请求行为进行事件记录。
iptables -A INPUT -p tcp --tcp-flags ALL SYN -j ULOG --ulog-prefix "SYN request"
iptables -A INPUT -p tcp --tcp-flags ALL SYN ¬-j DROP
其中ULOG指定对匹配的数据包进行记录,由日志生成工具ULOG生成iptables防火日志,--log-prefix选项为记录前缀。
ICMP扩展
例:设置iptables防火墙允许来自外部的某种类型/代码的ICMP数据包。
iptables -A INPUT -p icmp --icmp-type X/Y -j ACCEPT
其中--icmp-type为扩展命令选项,其后参数可以是三种模式:
(1) ICMP类型名称(例如,host-unreachable)。
(2) ICMP类型值(例如3)。
(3) ICMP类型及代码值(8/0)。
四、状态检测
“状态”的意思是指如果一个数据包是对先前从防火墙发出去的包的回复,则防火墙自动不用检查任何规则就立即允许该数据包进入并返回给请求者,这样就不用设置许多规则定义就可实现应用的功能。
我们可以把请求端与应答端之间建立的网络通信连接称为网络会话,每个网络会话都包括以下信息——源IP地址、目标IP地址、源端口、目的端口,称为套接字对;协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些信息称为状态(stateful)。状态包过滤防火墙能在内存中维护一个跟踪状态的表,比简单的包过滤防火墙具有更大的安全性,而iptables就是一种基于状态的防火墙。命令格式如下:
iptables -m state --state [!] state [,state,state,state]
其中,state表是一个由逗号分割的列表,用来指定连接状态,状态分为4种:
(1) NEW:该包想要建立一个新的连接(重新连接或连接重定向)。
(2) RELATED:该包是属于某个已经建立的连接所建立的新连接。举例:FTP的数据传输连接和控制连接之间就是RELATED关系。
(3) ESTABLISHED:该包属于某个已经建立的连接。
(4) INVALID:该包不匹配于任何连接,通常这些包被DROP。
View Code然后介绍一下这次实验的网络拓扑:

左边那台机器我用的是Windows server2008(ip设置为静态ip192.168.3.101)
中间的机器为kali,申请的两块网卡,原本有一块eth0,再添加一个eth1,然后这两个网卡的地址分别设置为192.168.3.1,192.168.2.1(其实设啥都行,只要两个IP不在一个网段就行,咋判断是不是一个网段上网查一下)
右边那台机器我用的是Windows 7(ip设置为静态ip192.168.2.100)
然后实验网络环境就搭好了。
下面是记录步骤:
1.kali进入下面这个页面,点击网络适配器,如果目前只有一个网卡的话,可以点那个添加。但是我已经有两个了,所以我就不能添加了。网络适配器2就是我添加的。

2.kali在终端输入 vi /etc/network/interfaces 这个是为了修改网络配置,修改两块网卡均为静态IP并且指定ip。static就是静态ip,然后如果不想要的话,就设置为dhcp


3.设置Windows机器的网关为网卡的ip,然后设置Windows机器的ip在网络中。
这里简单记录一下,刚开始我还不是很会,实验室电脑用多了就会了。
首先是打开控制面板->网络和。。。->共享中心,然后点本地连接,点属性

然后双击ipv4

然后设置成这样子

另一台机器设置另一个网关哈,操作都是一样的。
4.关掉这两台Windows的防火墙,咋关防火墙就不介绍了,网上有很多。
5.开启包转发的功能,这个功能在kali里面默认是关闭的,不开启转发两个网络无法通信。执行语句是这个后面那个是ip_forward,不是ip forward,如果输出1则开启成功了

6.验证网络是否连通,先ping一下网关,再ping一下对方的机器。这里是192.168.2.100 ping 192.168.3.101ping通了,则实验环境就搭好了。

进行实践之前理解iptables的功能和使用非常重要,这里贴一下写得比较不错得博客。
https://www.cnblogs.com/zrxuexi/p/14919517.html iptables https://blog.51cto.com/u_13959738/2986367
然后实践一下iptables的配置指令(以下操作是学习iptables配置,可以根据自己的情况增多或减少指令的测试)
首先清空filter链表所有规则,然后查看INPUT、FORWARD和OUTPUT链默认策略

看到iptables的filter表的默认策略全都是ACCEPT,然后设置INPUT链默认策略设置为DROP

用192.168.3.101ping eth0(192.168.3.1),没有ping通

于是我再把input设为accept,再ping一次,结果这次ping网关通了

再把output设置为drop看看能不能ping通,结果也没ping通


将OUTPUT链默认策略设置为ACCEPT,访问http://kali的IP,这里kali要开启apache服务,没开启的话就在shell输入,service apache start。结果是可以访问的。

接下来的操作是通过iptables实现包过滤的操作。目的:设置策略允许内部主机ping 防火墙eth0。首先我们要清空filter链表规则链,然后设置filter表的全部默认策略为drop。
iptables -t filter -F #清空链表规则 iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
然后内部主机就无法ping通eth0了,我们可以设置INPUT允许icmp request报文进入防火墙。
icmp报文有很多类型,正常通信下用wireshark抓包就会发现request报文的icmptype是8,code是0。reply的icmptype是0,code是0
贴几个icmp报文常见的类型

设置允许imcp请求报文进入:
iptables -I INPUT -p icmp --icmp-type 8/0 -j ACCEPT(8/0看下图)

看wireshark中的icmp request报文的type和code

再看看reply报文:

如果这个时候就去ping网关是无法ping通的,还需要设置OUTPUT的策略,我们已经知道了reply报文的type和code是0/0.所以.
iptables -I OUTPUT -p icmp --icmp-type 0/0 -j ACCEPT
然后就能内网ping网关并且网关能回复了。
然后我们设置一下允许访问kali的http服务,我们通过查阅资料得到,http服务通信的协议是tcp,目标端口是80.。语句如下。

然后开启192.168.3.101的web服务,先把forward的策略设置为drop,然后想办法添加规则让外网主机访问内网。我添加的规则如下:
iptables -I FORWARD -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -p tcp --sport 80 -j ACCEPT
允许转发目标或源端口为80端口的报文。

访问内网主机web服务成功了

然后我们再学习一下iptables的nat屏蔽内部网络结构,内网192.168.3.1/24,外网192.168.3.1/24,设置使我们的数据包经过网关进去外网后源地址转换为eth1的地址。
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.3.0/24 -d any/0 -j SNAT --to-source 192.168.2.1(这里转换也可以设置成自动转换,但是我这里固定转换为eth1的地址了)
iptables -t nat -A POSTROUTING -m state --state ESTABLISHED,RELATED –j ACCEPT
圈起来的两个报文,都是echo request,源mac地址都是101的地址,从ttl的值可以判断,在到达eth1之前,src是192.168.3.101,dst是192.168.2.100,但是经过网关eth1出去以后,src变成了192.168.2.1,dst还是192.168.2.100
下面是nat实现端口重定向。外网主机访问内网网关的web服务,定向到内网主机的80端口。规则实现的语句如下和结果如下:


本次实验真的学习到了非常多关于iptables的设置,也明白了防火墙过滤的规则设置,也是信息安全上前进的一小步。
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来