这是我最爱的姚老师给我们上的实验课,学到的干货多多,写篇博客记录一下,记录信息安全学习道路上迈进的重要的一步!

其实本来今天是想继续学永恒之蓝漏洞的,但是由于我防火墙实践还没做完,做到一半,就是那个现在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://kaliIP,这里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

用101ping100,wireshark抓包分析,结果如下:

 

圈起来的两个报文,都是echo request,源mac地址都是101的地址,从ttl的值可以判断,在到达eth1之前,src192.168.3.101dst192.168.2.100,但是经过网关eth1出去以后,src变成了192.168.2.1dst还是192.168.2.100

下面是nat实现端口重定向。外网主机访问内网网关的web服务,定向到内网主机的80端口。规则实现的语句如下和结果如下:

 

 

 

 本次实验真的学习到了非常多关于iptables的设置,也明白了防火墙过滤的规则设置,也是信息安全上前进的一小步。

首先清空filter链表所有规则,然后查看INPUTFORWARDOUTPUT链默认策略

默认策略都是ACCEPT

然后设置INPUT链默认策略设置为DROP

 

192.168.3.101ping eth0(192.168.3.1),没有ping

 

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

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

 

OUTPUT链默认策略设置为ACCEPT,访问http://kaliIP,是否成功?

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/hhhhhxian/p/16206261.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!