- 具体的应用层过滤应用程序,例如
qq xunlei
这些影响网络性能的应用程序,iptables + netfilter
本身是不提供这种过滤机制的,如果需要实现上面的功能,就需要通过第三方的补丁软件来提供上述功能,并且需要注意的是netfilter
实现的是规则的执行,iptables
实现的是规则的制定,所以需要向两个都打补; - 尝试编译
linux.26.29
内核,并且向内核提供补丁文件
[root@server14 src]# xz -d linux-2.6.28.1.tar.xz
[root@server14 src]# tar -xf netfilter-layer7-v2.22.tar.gz
[root@server14 src]# ln -sv linux-2.6.28.1 linux
- 然后对内核打补丁
[root@server14 linux]# patch -p1 < ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch
- 复制一个内核配置文件的样本,来进行修改
[root@server14 linux]# cp /boot/config-2.6.18-308.el5 .config
- 执行修改版本信息
make menuconfig
General setup ---> () Local version - append to kernel release
- 找到关于网络服务的选项
- 通过下面的链接进入
Networking support ---> Networking options --->
[*] Network packet filtering framework (Netfilter) --->
Core Netfilter Configuration --->
<M> Netfilter connection tracking support
启用上面的以及相关的子选项
继续找到并且启动这几个选项
<M> "state" match support
<M> "layer7" match support
<M> "iprange" address range match support
<M> "conntrack" connection tracking match support
<M> "connlimit" match support"
<M> "connbytes" per-connection counter match support
- 这里面可以按照需要启动
iptables
相应的扩展模块
- 关键的还需要打开关于
ftp
支持的模块
<M> FTP protocol support
- 这个模块里面的内容可以根据实际需要进行添加,更改关于
netfilter
的信息
Networking support ---> Networking options --->
[*] Network packet filtering framework (Netfilter) --->
IP: Netfilter Configuration --->
- 添加进去之后的第一个选项
<M> IPv4 connection tracking support (required for NAT)
- 因为这个是
nat
服务器需要的
- 同时还需要添加
<M> Full NAT
<M> MASQUERADE target support
<M> NETMAP target support
<M> REDIRECT target support
- 说明一下,
M
表示作为模块,进行编译,*
:表示作为内核核心的一部分; - 如果后期没有实际的需求,可以去掉一下不需要的模块,例如驱动的相关模块,因为这里使用的是虚拟机进行编译,对于不需要的驱动可以直接去掉
- 编辑完成之后,保存修改后的配置文件,然后开始进行编译
- 如果是使用
ssh
链接的虚拟机或者服务器,建议使用screen
命令,然后执行make
,防止链接中断,编译停止
[root@server14 linux]# make
HOSTLD scripts/kconfig/conf
scripts/kconfig/conf -s arch/x86/Kconfig
........这个过程需要好久,好久
- 因为是使用虚拟机进行编译,所以,需要保证内存在
2048MB
以上,并且虚拟机里面不建议使用make -j #
,这个选项,几次使用的经历都出现了虚拟机自动关机的情况; - 这是编译完成之后的截图
- 执行
make
之后,执行
[root@server14 linux]# make modules_install
这个过程大约几分钟
- 然后执行
[root@server14 linux]# make install
- 修改默认使用第一个进行启动
[root@server14 linux]# vim /etc/grub.conf
- 使用命令重新启动,并且使用新的内核
[root@server14 ~]# shutdown -r now
启动完成之后,查看内核信息
接下来编译IPtabls
- 如果需要使用
RPM
软件包提供管理和配置文件,可以将这些文件进行备份
[root@server14 ~]# cp /etc/init.d/iptables /mnt/
[root@server14 ~]# cp /etc/sysconfig/iptables-config /mnt/
[root@server14 ~]# cp /etc/sysconfig/iptables /mnt/iptablesRules
- 首先停止服务,并且禁止开机自启动操作
[root@server14 ~]# /etc/init.d/iptables stop
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
[root@server14 ~]# chkconfig iptables off
- 然后卸载使用
iptables
相关的软件包
[root@server14 ~]# rpm -e iptables-ipv6 iptables iptstate --nodeps
warning: /etc/sysconfig/iptables-config saved as /etc/sysconfig/iptables-config.rpmsave //这个信息表示保存了一份之前安装的配置文件
- 解压
iptables
的软件包
[root@server14 src]# tar xf iptables-1.4.6.tar.bz2
- 软件包里面的常见的扩展在
[root@server14 extensions]# pwd
/usr/src/iptables-1.4.6/extensions
- 接下来需要复制补丁里面的扩展信息到上面的这个目录里面
[root@server14 extensions]# cp ../../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.* .
其实只有两个文件
- 接下来提供选项进行编译安装
[root@server14 iptables-1.4.6]# ./configure --prefix=/usr --with-ksource=/usr/src/linux
- 因为
iptables
脚本里面的环境变量和使用make
安装的脚本路径不一致,所以这样进行安装,需要修改iptables
里面的路径
[root@server14 iptables-1.4.6]# vim /mnt/iptables
if [ ! -x /usr/sbin/$IPTABLES ]; then
echo -n $"/usr/sbin/$IPTABLES does not exist."; warning; echo
exit 0
fi
- 复制启动脚本,并且配置开机自动启动
[root@server14 iptables-1.4.6]# cp /mnt/iptables /etc/init.d/
[root@server14 iptables-1.4.6]# chkconfig --add iptables
[root@server14 iptables-1.4.6]# chkconfig --list | grep iptables
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
- 复制配置脚本
[root@server14 iptables-1.4.6]# cp /mnt/iptables-config /etc/sysconfig/
- 接下来启动
iptables
服务
[root@server14 ~]# /etc/init.d/iptables start
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: nat filter [ OK ]
Unloading iptables modules: [ OK ]
Applying iptables firewall rules: [ OK ]
Loading additional iptables modules: ip_conntrack_netbios_n[ OK ]
- 如果没有加载
nf_nat_ftp
修改配置文件添加
[root@server14 ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_nat_ftp ip_conntrack_netbios_ns"
查看使用的模块信息
提供协议特征包
- 对于
layer7
的过滤需要使用只idng特定的协议特征,协议特征包使用软件l7-protocols-2009-05-28.tar.gz
软件包来提供; - 对于这个软件包只需要解压,并且执行
make install
[root@server14 src]# tar -xf l7-protocols-2009-05-28.tar.gz
[root@server14 src]# cd l7-protocols-2009-05-28
[root@server14 l7-protocols-2009-05-28]# make install
mkdir -p /etc/l7-protocols
cp -R * /etc/l7-protocols
- 建议重新启动一下
iptables
[root@server14 l7-protocols-2009-05-28]# service iptables restart
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
Applying iptables firewall rules: [ OK ]
Loading additional iptables modules: nf_nat_ftp ip_conntrac[ OK ]s_ns
- 这个软件包支持的大量的协议在软件目录
[root@server14 l7-protocols-2009-05-28]# ll /etc/l7-protocols/protocols/
支持的常见协议有:
关于需要
layer7
的基础环境配置已经完成了,接下来需要三台主机来模拟进行实验server12.com: 192.169.10.20/24表示内网主机
server14.com:两个地址172.25.23.14/24虚拟为互联网地址; 192.168.10.100/24:表示内网主机,并且作为网关地址;
server20.com:172.25.23.30/24表示为互联网地址
这里添加一个windows xp professional 的主机,用来安装qq,等软件,IP地址为192.168.10.40/24首先配置
windows xp
的网络,并且测试网络是否正常- 找到右下角的网络按钮,选择属性,现在显示网络是不正常的;
- 选择
TCP/IP
点击属性
- 按照规划配置下面的地址
* 使用配置的地址尝试ping
网关
- 接下来需要添加一个
SNAT
规则用于将内网地址转换层虚拟的外网地址
[root@server14 ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.25.23.14
- 上面的规则用于虚拟内部主机
192.168.10.0/24
网段的主机访问172.25.23.14
,接下来需要添加规则,配置真机允许172.25.23.14/25
能够连上互联网
[root@my Desktop]# iptables -t nat -I POSTROUTING -s 172.25.23.14 -j MASQUERADE
[root@my Desktop]# iptables -I FORWARD -s 172.25.23.14 -j ACCEPT
使用
172.25.23.14/24
来ping
互联网主机
使用
Windows Xp
来安装QQ
,同时也可以验证网络访问是否正常
下载并且安装
QQ
,这里已经安装接下来指定规则,拒绝
QQ
的访问
[root@server14 ~]# iptables -A FORWARD -s 192.168.10.0/24 -m layer7 --l7proto qq -j REJECT
这里在访问网络的过程中已经得到了一些匹配到的报文信息
这里查看
QQ
规则是否匹配到报文,这里关心FORWARD
链,这里还没有报文匹配
- 尝试登陆
QQ
,这里显示由于防火墙的设置,导致登陆失败
- 查看是否匹配到
QQ
对应的报文
- 这里可以看到已经得到对应的报文,说明规则已经生效
- 接下来删除这个规则,来允许
QQ
访问
- 这里显示的是需要手机
QQ
进行确认,说明登陆已经是成功的了,截一张小图,说明QQ
已经登陆成功,在QQ
已经登陆的情况下,添加上述规则,查看QQ
是否会被强制下线; - 规则已经重新添加
- 虽然添加了规则,但是对于已经登陆的的
QQ
并不能够强制进行下线,所以状态仍然为在线
- 还需要注意的是,一旦在报文已经生效的情况下,将状态切换为隐身,那么再切换为在线,这个切换是不能够成功的;
这个
QQ
版本使用的是最新的版本,上面的规则是可以进行生效的;因为上面重新编译了
kernel iptables
并且在指定模块时将time
模块加入了,所以这里是可以使用iptables
的time
扩展模块的
time
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
- 通常来说
start
和stop
必须是结合起来使用的 - 可以通过结合
time
模块来实现对于QQ
的访问限制
[root@server14 ~]# iptables -R FORWARD 1 -m time --timestart 08:10:00 --timestop 12:00:00 -j DROP
[root@server14 ~]# iptables -A FORWARD -m time --timestart 14:10:00 --timestop 18:00:00 -j DROP