iptables与layer7协议的分析与应用
本次对iptabbles+l7的介绍分为两部分:
第一部分对系统升级打l7补丁
第二部分对iptables+l7的应用
第一部分:对系统升级打补丁
为了使用l7层协议进行控制,我们要在内核中打补丁文件,需要重新编译内核文件,下面的每一步都需要小心谨慎,不然就要重头开始了~需要软件的朋友可以Q395061796
软件需求:
1、 拆解内核文件与layer7文件:
[root@zhangc ~]# tar jxvf linux-2.6.25.19.tar.bz2 -C /usr/src/
[root@zhangc ~]# tar zxvf netfilter-layer7-v2.20.tar.gz -C /usr/src/
2、 将补丁文件放入内核文件夹内
[root@zhangc ~]# cd /usr/src/linux-2.6.25.19/
[root@zhangc linux-2.6.25.19]# patch -p1 < /usr/src/netfilter-layer7-v2.20/kernel-2.6.25-layer7-2.20.patch
3、 使用内核文件配置新内核
[root@zhangc linux-2.6.25.19]# cp /boot/config-2.6.18-164.el5 .config
[root@zhangc linux-2.6.25.19]#make menuconfig
将一些需要的服务选项选为M,编译为模块。
第一部分选项:
编译以下3个模块
第二部分选项:
编译以下4个模块
4.编译内核、安装模块、安装内核
[root@zhangc linux-2.6.25.19]# make
[root@zhangc linux-2.6.25.19]# make modules_install
[root@zhangc linux-2.6.25.19]# make install
5.卸载老版本iptables
[root@zhangc ~]# rpm -e iptables –nodeps
6.拆解并合并iptables+layer7补丁
[root@zhangc ~]# tar jxvf iptables-1.4.2.tar.bz2 -C /usr/src/
[root@zhangc ~]# cd /usr/src/netfilter-layer7-v2.20/iptables-1.4.1.1-for-kernel-2.6.20forward/
[root@zhangc iptables-1.4.1.1-for-kernel-2.6.20forward]# cp * /usr/src/iptables-1.4.2/extensions/
7.编译并安装
[root@zhangc iptables-1.4.1.1-for-kernel-2.6.20forward]# cd /usr/src/iptables-1.4.2/
[root@zhangc iptables-1.4.2]# ./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.25.19/
[root@zhangc iptables-1.4.2]# make
[root@zhangc iptables-1.4.2]# make install
8.安装l7-prorocols模式包
[root@zhangc ~]# tar zxvf l7-protocols-2008-10-04.tar.gz -C /etc/
[root@zhangc ~]# mv /etc/l7-protocols-2008-10-04/ /etc/l7-protocols
9.修改文件ip6tables,能正常启用service
[root@zhangc ~]# vim /etc/init.d/ip6tables /etc/init.d/iptables
[root@zhangc ~]# service iptables save【这条命令进行测试】
[root@zhangc ~]# service iptables restart
10.系统的修补已经完成,可以正常使用iptables+l7.
第二部分:iptables+l7的应用
l7规则的格式:
通过向防火墙提供有关对来自某个源地址、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用iptables系统提供的特殊命令iptables建立这些规则,并将其添加到内核空间特定信息包过滤表内的链中。关于添加、去除、编辑规则的命令,一般语法如下:
iptables [-t table] command [match] [target]
1.表(table)
[-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三个可用的表选项:filter、nat和mangle。该选项不是必需的,如果未指定,则filter作为缺省表。
Filter用于一般的信息包过滤,包含INPUT,OUTPUT,FORWARD链
Nat 用于要转发的信息包,包含PREROUTING,OUTPUT,POSTROUTING链
2.命令(command)
command部分是iptables命令最重要的部分。它告诉iptables命令要做什么,例如插入规则、将规则添加到链的末尾或删除规则。
-A或append:将一条规则附加到链的末尾
-D或delete:删除一条规则
-P或policy : 设置链的缺省目标
-R或replace:替换指定链的相应规则
-L 或list : 列出指定链中的所有规则
-F 或flush:默认删除所有链中的规则;如果指定链名,该命令删除链中的所有规则
-N或new-chain:创建新的链(名称为命令中的指定名称)
-X:删除用户的空链
-i指的是数据流入的那个入口网卡
-o指的是出口网卡
-t指的是表格
-p则是指协议
-m表示调用模块
-j代表执行的动作
--sport代表源端口
--dport代表目的端口
--syn则表示带有syn标识设置的TCP数据包。SYN用于初始化一个TCP连接,如果自己机器上没有运行任何服务器,别人也就不会向你发送SYN数据包。
3.匹配(match)
iptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源地址、目的地址、协议等)。匹配分为通用匹配和特定于协议的匹配两大类。
-p或–protocol:该通用协议匹配用于检查某些特定协议。其中ALL为缺省值,缺省源于所有IP地址匹配。可以使用!符号表示不与该项匹配。
-s或source:根据数据包的源地址进行匹配。可以使用!表示不与该选项匹配。
-d或destination:根据数据包的目的地址进行匹配。可以使用!表示取反。
4.目标(target)
目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。许多用于建立高级规则的其它目标,如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。在此对常用的3个进行简单介绍。
ACCEPT:当数据包与规则完全匹配时,会允许数据包通过。
DROP:当数据包与规则完全匹配是,会丢弃数据包。
MASQUERADE:当数据包与规则完全匹配时,将数据包的源IP地址伪装为当前接口的IP地址。
5.使用方法:
增加规则:
阻止来自某一特定IP范围内的数据包
#Iptables –t filter –A INPUT –s 192.168.100.0/24 –j DROP
阻止所有流向攻击者IP地址的数据包
#Iptables –t filter –A OUTPUT –d 192.168.100.0/24 –j DROP
删除规则:
#Iptabels –t filter –D OUTPUT –d 192.168.100.0/24 –j DROP
缺省策略
#iptabels –P INPUT DROP
地址伪装
#iptabels –t nat –A POSTROUTING –s 192.168.100.0/24 –o eth1 –j MASQUERADE
6.常用的iptables 模块
(1)string(字符串匹配,可以用做内容过滤)
#iptables -I FORWARD -d 192.168.3.0/24 -p tcp --sport 80 -m string --string "广告" -j DROP
(2)comment (备注匹配,可以支持最多256个字符)
#iptables -I FORWARD -s 192.168.3.159 -m string --string "qq.com" -j DROP -m comment --comment "denny go to qq.com"
(3)connlimit(同时连接个数限制匹配) --connlimit-above n 限制为多少个。--connlimit-mask n 这组主机的掩码,默认是connlimit-mask 32 ,即每个ip.
#iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
(4)time(时间匹配)timestart开始时间。--timestop结束时间。
#iptables -t filter-A INPUT -m time --timestart 8:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri
(5) iprange (ip范围匹配)
#iptables -A FORWARD -m iprange --src-range 192.168.1.5-192.168.1.124 -j ACCEPT
(6)state模块 –-state 分文三种状态:NEW、ESTABLISHED、RELATED
#iptables -t filter -A -m state --state ESTABLISHED,RELATED -j ACCEPT
7.案例:
试验目的:100.21-30网段上班时间能够能够访问FTP服务器,禁止上班时间访问sina网站,禁止使用迅雷、qq软件。
第一、 打开转发功能拒绝所有通过
[root@zhangc ~]# vim /etc/sysctl.conf
[root@zhangc ~]# sysctl –p
第二、实现对FTP服务器的访问
允许http通过
[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.100.21-192.168.100.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tun,Wed,Thu,Fri -p tcp --dport 80 -j ACCEPT
允许DNS通过
[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.100.21-192.168.100.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tun,Wed,Thu,Fri -p udp --dport 53 -j ACCEPT
标准包过滤:每禁用一个服务,都要过滤掉流出的数据包和流入的数据包,相对比较稍微有些繁琐。
[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.100.10-192.168.100.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 21 -j ACCEPT
[root@zhangc ~]# iptbales -t filter -A FORWARD -p tcp --sport 21 -j ACCEPT【服务器端请求的接收21端口】
[root@zhangc ~]# iptables -t filter -A FORWARD -p tcp --sport 20 -j ACCEPT【服务器回应】
[root@zhangc ~]# iptables -t filter -A FORWARD -p tcp --dport 20 -j ACCEPT【客户端接收20端口】
状态包过滤:记录一个会话的状态,从防火墙出去的数据包回应的时候默认允许通过。
[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.100.10-192.168.100.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 21 -j ACCEPT
[root@zhangc ~]# iptables -t filter -A -m state --state ESTABLISHED,RELATED -j ACCEPT
以上两种方法都有可以使用进行FTP的访问
第三、禁止上班时间访问sina、迅雷、qq
[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.145.21-192.168.145.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 80 -j ACCEPT
[root@zhangc ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.220.21-192.168.220.30 -m time --timestart 08:00 --timestop 20:00 –weekdays Mon,Tun,Wed,Thu,Fri -m string --string "sina" --algo bm -j DROP
[root@zhangc ~]# iptables -A FORWARD -m iprange --src-range 192.168.145.21-192.168.145.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Fri -m layer7 --l7proto qq -j DROP
[root@zhangc ~]# iptables -A FORWARD -m iprange --src-range 192.168.145.21-192.168.145.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Fri -m layer7 --l7proto xunlei -j DROP