一、实验内容
- iptables基础知识点
- iptables基本配置
- iptables配置实操
- snort安装
- snort嗅探模式
- snort数据包记录模式
- snort网络入侵检测模式
二、实验方法
1、使用工具
- Kali
- Ubuntu
- Metasploitable2
- iptables
- snort
2、实验目标
- iptables基本配置与使用
- snort三种模式配置与使用
3、实验方法
- 配置iptables并模拟数据包交互,检查iptables配置是否生效
- 使用三种方式配置snort,写snort规则配置文件,开始入侵检测并记录日志和报警
三、实验过程
iptables基础知识点
iptables是Linux系统自带的一个包过滤防火墙的管理工具,他可以实现很多专业的数据包过滤,重定向,NAT功能
iptables管理着四个规则表(Tables)以及五个链(Chains),规则表是用来设定网络管理相关的规则,链是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则
规则表(Table)
-
Filter表:用来过滤数据包
- INPUT
- FORWARD
- OUTPUT
-
Nat表:用于网络地址转换
- PREROUTING
- POSTROUTING
- OUTPUT
-
Mangle表:对指定的数据包进行修改,例如更改TTL,很少使用
- PREROUTING
- POSTROUTING
- INPUT
- OUTPUT
- FORWARD
-
Raw表:决定数据包是否被状态跟踪机制处理,很少使用
- OUTPUT
- PREROUTING
规则链(CHAIN)
- INPUT:进来的数据包应用此规则链中的策略
- OUTPUT:外出的数据包应用此规则链中的策略
- FORWARD:转发数据包时应用此规则链中的策略
- PREROUTING:对数据包作路由选择前应用此链中的规则(所有的数据包都最先由这个链处理)
- POSTROUTING:对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
iptables基本配置
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作]
iptables的配置命令确实比较复杂,这里我分五个部分
表名(table)
-t
后加的可指定的规则表名,不是必选项,如果没有这个参数则默认为Filter表,这里的参数上面已经说过了,filter表、Nat表、Mangle表和Raw表
命令选项(command)
对链的命令:
- -N:新建一条用户自己定义的规则链
- -X:删除指定表中用户自定义的规则链
- -F:清空一条链,默认清空表中所有链
- -Z: 清空计数器,每条规则默认有两个计数器,用于记录本条规则所匹配到的数据包的个数和本条规则所匹配到的数据包的总大小
- -P:设置指定链的默认策略
- -E:重命名用户定义的链,不改变链本身
对规则的命令:
- -A:在指定链的末尾添加(append)一条新的规则
- -I:在指定链中插入(insert)一条新的规则,默认在第一行添加,一般使用
-I CHAIN NUM
给规则加一个编号 - -R:修改、替换(replace)某条规则,规则被替换并不会改变顺序,需要指定替换的规则编号:
-R CHAIN NUM
- -D:删除(delete)一条规则,可以输入完整规则,或者直接指定标号加以删除:
-D CHAIN NUM
查看的命令:
- -L:列出(list)指定链中所有的规则进行查看
- -n:使用数字形式(numeric)显示输出结果,不加这个默认显示主机名称
- -v:查看规则表详细信息(verbose)的信息,v越多越详细
- -x:显示原有信息,不要做单位换算
- –line-number:显示规则的行号
链名(CHAIN)
必选项,参数上面也说过了,INPUT、OUTPUT、FORWARD、PREROUTING和POSTROUTING
条件匹配参数(parameter)
- -s,–src,–source:匹配数据包的源地址
- -d,–dst,–destination 匹配数据包的目标地址
- -i:指定数据包的流入接口(逻辑接口)
- -o:指定数据包的流出接口
- -p:做协议匹配,参数可以是TCP、UDP、ICMP
- -m:匹配一些特定的规则
- –sport:指定源端口
- –dport:指定目的端口
- –tcp-flags:指定TCP的标志位(SYN,ACK,FIN,PSH,URG,RST,ALL,NONE)
- !:对规则的条件取反
目标动作(target)
-j
后可以加上对目标的动作,一般分为七种,前四种就是对数据包最常见的动作
- ACCEPT 允许数据包通过
- DROP 直接丢弃数据包,不给任何回应信息
- REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息
- LOG 在
/var/log/messages
文件中记录日志信息,然后将数据包传递给下一条规则 - SNAT 源地址转换
- DNAT 目标地址转换
- REDIRECT 端口重定向
iptables配置实操
我们这次实验用到了Ubuntu,Metasploitable,Kali三台机子,我们先把三台机子的IP地址,端口和mac地址之类的信息查清楚
#Kali
192.168.85.128 //IP
00:0c:29:79:29:c1 //MAC
eth0 //网卡接口
#Ubuntu
192.168.85.131 //IP
00:0c:29:17:f4:8c //MAC
ens33 //网卡接口
#Metasploitable
192.168.85.132 //IP
00:0c:29:3a:d3:2f //网卡接口
查看iptables规则
首先我们先用 iptables -L
默认查看filter里面三个链里面的规则
刚开始啥也没有很正常
添加ICMP过滤
我们添加最简单的一个过滤规则,我们在INPUT链里面对所有的ICMP包都做了REJECT处理
iptables -I INPUT -p icmp -j REJECT
此时我们在Kali上ping一下Ubuntu,发现ping不通,而且有明确的unreachable提示
我们用命令 iptables -F INPUT
把规则清空,然后再在INPUT里面加一个DROP动作的规则
iptables -I INPUT -p icmp -j DROP
我们继续用Kali来ping一下,发现这次没任何回显,而是所有的包全丢了,没有任何回应
添加白名单过滤
我们转到Metasploitable网站服务器上进行iptables的配置,加一个只允许Kali访问的白名单
iptables -A INPUT -s 192.168.85.128 -j ACCEPT
iptables -A INPUT -j DROP
我们用Kali访问,正常可以访问
我们用Ubuntu访问,结果页面打不开了
添加扫描器过滤
在开始之前我们用Kali扫一下靶机,一切正常
我们为了防止nmap这类扫描器的扫描,可以加上这么一条规则,这里的 --tcp-flags
是用于配置我们要匹配的标志位的,我们可以把这串字符拆成两部分去理解,第一部分为SYN,ACK,FIN,RST,第二部分为RST
第一部分表示:我们需要匹配报文tcp头中的哪些标志位,那么上例的配置表示,我们需要匹配报文tcp头中的3个标志位,这3个标志位分别为为SYN、ACK、FIN,我们可以把这一部分理解成需要匹配的标志位列表
第二部分表示:第一部分的标志位列表中,哪些标志位必须为1,上例中,第二部分为SYN,则表示,第一部分需要匹配的标志位列表中,SYN标志位的值必须为1,其他标志位必须为0
有的时候防止扫描器还有一种办法,后面的参数匹配用到
-m
,后面match的规则是--limit 1/s
也就是一秒只允许一个包,在某些情况下这样也可以有效组织扫描器
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN SYN -j REJECT
nmap默认是用 -sS
模式进行扫描,而SYN这种扫描方式已经被我们给REJECT了
这个时候我们去Kali用nmap扫描一下靶机,发现已经无法出结果了,而且显示的是很明确的unreach
保存iptables配置
我们配置完规则之后,想要保存配置,怎么办呢?
//保存配置
iptables-save > /etc/network/iptables.rules
//载入配置
iptables-restore < /etc/network/iptables.rules
实际上我们还有另外一种更常用的办法
service iptables save
,当我们使用这个命令之后,他会把规则自动保存在/etc/sysconfig/iptables
中,当重新启动时,会有脚本用命令iptables-restore
调用这个文件,自动恢复了规则配置,但是Ubuntu因为版本的原因,在iptables服务上有些不兼容,所以不能用
我们先在Ubuntu上写几条规则
然后保存
重新启动之后,再看看规则,发现已经没有了
没事,我们从保存的地方重新载入,再看已经全部恢复了
snort安装
由于我是在自己的虚拟机Ubuntu上做的实验,需要重新下载snort,我的Ubuntu是v20.04版本,安装的snort版本是v2.9.20,其对应的daq版本是daq_v2.0.7
下面贴出安装总共用到的命令,只要版本一致应该能百分比安装成功
sudo apt-get update
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install aptitude
sudo aptitude install libpcap-dev
sudo apt-get install automake
sudo /sbin/ldconfig -v
aptitude install libpcre3-dev
aptitude install libdumbnet-dev
aptitude install zlib1g-dev
wget https://www.snort.org/downloads/snort/daq-2.0.7.tar.gz
tar xvzf daq-2.0.7.tar.gz
cd daq-2.0.7
./configure && make && sudo make install
wget https://www.snort.org/downloads/snort/snort-2.9.16.tar.gz
tar xvzf snort-2.9.16.tar.gz
cd snort-2.9.16
./configure --disable-open-appid --enable-sourcefire && make && sudo make install
sudo /sbin/ldconfig -v
snort嗅探模式
嗅探模式其实有点像是tcpdump的一般模式,是把嗅探到的包信息直接打印在屏幕上
我们在Kali上ping靶机的IP
与此同时,snort -v
这个命令可以让snort在屏幕上只输出IP和TCP/UDP/ICMP的包头信息
如果我们还想要显示包的数据信息,可以加一个 -d
比如我们使用 snort -vd
,此时就可以在屏幕上看到数据包的内容
如果我们还想看数据链路层的信息,可以使用 snort -dev
snort数据包记录模式
纯嗅探模式说实话,只是在某些特定情况下快速测试用的,正常情况下,我们更实用的场景是把嗅探的数据全记录下来
我们可以用 -l
命令来把日志存到一个目录下,比如 -l ./log
注意,这个 ./log
目录必须存在,不然snort会报错
我们去设定的目录下面看看,看到日志已经写进去了
想要重新阅读日志也很方便,我们使用 -r
指定日志就可以重新用snort再看一遍当时的数据包了,而且如果你可以指定看的内容,比如你只想看包头,你可以这样
snort -v -r /home/cyc1ops/log/snort.log.1655521077
有的时候你想区分一下本地主机的网络,可以用 -h
指定一下本地网络,当然,我这里不管是靶机还是扫描机,全是局域网内的,所以这个命令基本没用
snort -l /home/cyc1ops/log -b
我们还可以换一种格式进行记录 -b
即使用二进制模式记录数据包,这种格式也就是tcpdump所采用的格式
因此我们可以用tcpdump来打开这个日志文件
snort网络入侵检测模式
我们可以使用 -c
指定特定的配置文件比如 snort.conf
来启动snort的入侵检测系统(Network Intrusion Detection Mode)即NID mode,snort.conf
里面大概长这样
当然,这里我们自己写一个 test.conf
alert icmp any any -> 192.168.85.0/24 any (content:"|11 12 13 14|"; msg: "someone ping cyc1ops!"; sid:1000000900)
下面逐一解释
规则头
就比如第一个alert,表示出现了后面匹配的包之后,要采取什么动作
- Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包。
- Log-记录这个包。
- Pass-丢弃(忽略)这个包。
- activate-报警并且激活另一条dynamic规则。
- dynamic-保持空闲直到被一条activate规则激活,被激活后就作为一条log规则执行。
协议
我这里的icmp就是一种数据包协议,响应的还有tcp 、udp、icmp和ip
IP地址
any any -> 192.168.85.0/24 any
这部分分成前面和后面两部分,中间用 ->
连接
前面一部分的 any any
指的就是任何来源的ip地址的任何端口
中间的 ->
表示数据流的方向,规则文件其实还可以用 <>
来表示双向流
最后一部分和第一部分其实是一个道理,目的地址是 192.168.85.0/24
的 any
端口
规则选项
括号内的就是规则选项了,规则选项部分中冒号前的单词称为选项关键字,比如这里的content和msg,规则选项并不是必选项
我这里的意思就是如果数据内容匹配到符合 |11 12 13 14|
的时候就alert一条报警,发送的消息就是 someone ping cyc1ops!
后面的sid是新版本必须要加的东西,表示规则的序号,听说老版本就不用加这个,一般sid<100的不能乱用,是保留用的
那我们开始实验
snort -d -l /home/cyc1ops/log/ -c /home/cyc1ops/test/rules/test.conf
与此同时我们用Kali开始ping靶机
在关闭入侵检测系统之后,我们看到日志目录里面已经多了一个alert文件
点进去看看,发现我们设置的规则成功执行了,alert发送的信息就是 someone ping cyc1ops!
四、实验小结
iptables和snort都是非常经典的运维工具,熟悉掌握对包过滤防火墙的配置,以及如何去看懂报警,设置报警,都是运维技术的基本功