Linux+Layer7+Iptables+Squid

案例配置:


公司有三个部门

工程部门 192.168.30.10--192.168.30.20

软件部门 192.168.30.21--192.168.30.30

经理办 192.168.30.31--192.168.30.40

DMZ  192.168.40.0/24

上班时间 (周一---周五 08:00--20:00)

环境要求:

1、工程部门上班时间ftp 【192.168.1.166】 允许, qq http 迅雷不允许使用,下班后无限制

2、软件部门上班时间运行http但是不允许非法站点sina ,不允许使用迅雷 ,连接数 最多3个 不允

许聊天,不允许使用pplive ,不允许看图片 下班后无限制。

3、经理办公室 http qq 都可以,下班后无限制

4、dmz区域rdp server 服务器进行发布

200109576.jpg

试验环境说明:

1、服务器操作系统:RedHat Enterprise Linux 5(内核:2.6.18)

2、防火墙:Linux+Layer7+Iptables+Squid

3、DMZ

软件环境:

http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.19.tar.bz2

http://www.netfilter.org/projects/iptables/files/iptables-1.4.2.tar.bz2

http://ie.archive.ubuntu.com/sourceforge/l/l7/l7-filter/netfilter-layer7-v2.20.tar.gz

http://ie.archive.ubuntu.com/sourceforge/l/l7/l7-filter/l7-protocols-2008-10-04.tar.gz

200210585.jpg

因为Linux系统中的Iptables工具无法对应用层的应用来进行过滤,如:qq,迅雷,电驴等等,所以需要结合额外的工具。Layer7是在Linux上面的一个防火墙模块,它可以在Iptables上实现七层过滤,但遗憾的是Layer7这个项目在2009年时就停止了。在Linux上面firewall是基于内核模块实现的,所以我们要想起用layer7模块就必须编译内核。

一、升级Linux内核

由于防火墙采用的是RedHat Enterprise Linux 5,系统内核是2.6.18,要将其升级到2.6.25,并且打

上Layer7层的协议补丁。

1、合并kernel+layer7补丁

#tar jxvf linux-2.6.25.19.tar.gz2 -C /usr/src/

#tar zxvf netfilter-layer7-v2.20.tar.gz -C /usr/src/

#cd /usr/src/linux-2.6.25.19/

#patch-p1 < /usr/src/netfilter-layer7-v2.20/kernel-2.6.25-layer7-2.20.patch

200529790.jpg

2、配置新内核

#cp /boot/config-2.6.18-164.el5 .config //使用旧的内核配置

#make menuconfig

200747267.jpg

//配置内核时,在“Networking ---> Networking Options---> Network Packet filtering framework (Netfilter) ”处主要注意两个地方:

 1) ---> Core Netfilter Configuration

   //将“Netfilter connection tracking suport (NEW)”选择编译为模块(M),需选取此项才能看到layer7支持的配置。

   //将layer7、string、state、time、IPsec、iprange、connlimit……等编译成模块,根据需要自己可以自由选择。

 2) ---> IP: Netfilter Configuration

   //将“IPv4 connection tracking support (requirefor NAT)”编译成模块。

   //将“Full NAT”下的“MASQUERADEtarget support”和“REDIRECT target support”编译成模块。


 3、编译及安装模块、新内核

#make && make modules_install && make install

//编译安装成后后,重启选择使用新的内核(2.6.25.19)引导系统

注意:由于是在2.6.18的内核中进行编译的,所以在重启的GRUB菜单中重新选择到新的系统2.6.25中。

120453467.jpg

二、重新编译iptables

1、卸载系统自带的iptables

首先将系统自带的iptables的服务控制脚本备份一下,留给源码安装的iptables

#cp /etc/init.d/iptables /etc/init.d/iptables.bak

#rpm -e iptables --nodeps


2、源码安装iptables+layer7补丁

#tar jxvf iptables-1.4.2.tar.bz2 -C/usr/src/

#cd /usr/src/netfilter-layer7-v2.20/iptables-1.4.1.1-for-kernel-2.6.20forward/

# cplibxt_layer7.c libxt_layer7.man /usr/src/iptables-1.4.2/extensions/


3、编译安装

#cd /usr/src/iptables-1.4.2/

#./configure --prefix=/ --with-ksource=/usr/src/linux-2.6.25.19

#make && make install


4、安装l7-protocols模式包

#tar zxvf l7-protocols-2008-10-04.tar.gz-C /etc/

#mv /etc/l7-protocols-2008-10-04/etc/l7-protocols

#mv /etc/init.d/iptables.bak /etc/init.d/iptables

120744378.jpg

要想知道Layer7到底支持哪些协议,可以在Layer7的解压目录中的Protocols中查看。

120825930.jpg

三、配置防火墙的网络环境

1、添加三块网卡,分别连接到LAN 、DMZ、WAN

eth0网卡连接到LAN,eth1网卡连接到DMZ,eth2连接到WAN。在本试验中,eth2是192.168.1.0/24的网络连接到外网。

eth0—》192.168.30.1

eth1—》192.168.40.1

eth2—》192.168.1.138,网关—》192.168.1.1

121236103.jpg

121245353.jpg

2、配置DNS

#vim /etc/resolve.conf

121335668.jpg3、打开防火墙路由转发功能

#vim /etc/sysctl.conf  //修改第七行

#sysclt -p  //重新加载配置文件

121411852.jpg

或者

#echo “1” >/proc/sys/net/ipv4/ip_forward

3、测试网络连通性。

121456837.jpg

四、添加Iptables访问策略

#iptables –t nat –A POSTROUTING –o eth2 –j MASQUERADE

//使LAN内的用户可以通过NAT访问外网

#iptables -t filter -P  INPUT   DROP

#iptables -t filter -P  OUTPUT  DROP

#iptables -t filter -P  FORWARD  DROP

//以上三条命令,是将filter表中的三个控制链设为拒绝。

121605998.jpg1、工程部策略控制:

a、ftp访问控制:

① # iptables -t filter –A FORWARD –m iprange --src-range 192.168.30.10-192.168.30.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport21 –d 192.168.1.166 -j ACCEPT

//允许工程部主机访问192.168.1.166的ftp站点的请求出去

② # iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

//允许返回的状态是:ESTABLISHED,RELATED的包通过,以后添加的策略最好在该策略之前。

121719578.jpg121748799.jpg

因为ftp的连接通信分为:主动模式和被动模式。所以以上的两条命令,只是能够允许ftp的21号连接控制的数据通过,但是数据控制无法通过。

121914382.jpg

③ # modprobe  ip_nat_ftp

//调用系统中的模块,来允许ftp之间的通信。为了使用方便可以将该命令写入开机脚本中,# echo “modprobe ip_nat_ftp” >> /etc/rc.local。如果没有这个模块,你就不得不多写几条控制语句了。

④ # iptables -t filter - I FORWARD -2 -m iprange --src-range 192.168.30.10-192.168.30.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 20 -j ACCEPT

//允许连接ftp服务器的20号端口

⑤ # iptables -t filter - I FORWARD -2 -m iprange --dst-range 192.168.30.10-192.168.30.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --sport 20 -j ACCEPT

//允许ftp服务器通过20号端口向客户端返回信息

⑥ ftp测试

首先要确保外网内有一个ftp服务器,本实验中的ftp是192.168.1.166,是通过软件Server-U软件,在Windows平台上实现的,关于ftp的搭建可以参考本人的相关博客。

122011211.jpg

b、QQ策略控制

④ #iptables -t filter -I FORWARD 2 -m iprange --src-range 192.168.30.10-192.168.30.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto qq -j  DROP

//在第二条规则前面添加一条策略,用来控制工程部使用QQ,只能使用l7中的定义的七层协议。

c、迅雷策略控制

⑤ #iptables -t filter -I FORWARD 2 -m iprange --src-range 192.168.30.10-192.168.30.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto xunlei -j  DROP

//在第二条规则前面添加一条策略,用来控制工程部使用迅雷。

122233529.jpg

⑥ #iptables–t filter -I FORWARD 2 -s 192.168.2.0/24 -o eth2 -m time --timestart 20:01  --timestop 07:59 -j ACCEPT

//下班后无限制

2、软件部门策略控制

a、非法站点的访问控制策略

因为非法站点一般都是基于域名的,这里可以使用l7中的string模块,也可以使用Squid代理服务器来实现。允许http服务时,要注意DNS服务也要通过。


① # iptables -t filter -I FORWARD 2 -m iprange  --src-range 192.168.30.21-192.168.30.40 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p udp --dport 53 -j ACCEPT

//允许DNS数据包通过。

122459351.jpg

方法一:通过l7模块来实现

① # iptables -t filter -I FORWARD 2 -m iprange --src-range 192.168.30.21-192.168.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m string“sina” –algo bm -j DROP

//工作时间内,不允许访问sina站点

② # iptables -t filter -I FORWARD 2 -m iprange  --src-range 192.168.30.21-192.168.30.30 -m time --timestart 08:00 --timestop 20:00 --weekdaysMon,Tue,Wed,Thu,Fri -p tcp --dport 80 -j ACCEPT

//允许http服务可以通过

方法二:通过Squid代理服务器来控制

#rpm -ivh  squid-2.6.STABLE21-3.el5.i386.rpm

//使用rpm包安装Squid服务器

#chkconfig  squid start  //启动Squid服务

#chkconfig  squid on   //将squid服务添加到开机启动

① # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport80 -j REDIRECT --to-ports 3128

//将内网中访问80端口的请求重定向到3128端口

② 由于Squid的默认规则是拒绝所有,所以手动设置策略

# vim/etc/squid/squid.conf

122539953.jpg

acl soft src 192.168.30.21-192.168.30.30/255.255.255.255

//定义软件部的IP地址

acl worktime time MTWHF 08:00-20:00

//定义工作时间

http_accessallow soft worktime

//允许软件部在工作时间内的请求通过

122617364.jpg

http_port3128 transparent

//实现squid的透明代理

② # iptables -t filter -A INPUT -i eth0 -p tcp --dport 3128 -j ACCEPT

//允许3128端口的请求从eth0端口进入

③ # iptables -t filter -A OUTPUT –o eth0 -p tcp --sport 3128 -j ACCEPT

//允许3128端口的回应信息从eth0端口出去

④ # iptables -t filter -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

//允许回应信息通过

⑤ # iptables -t filter -A OUTPUT -o eth2 -p tcp –dport 80 -j ACCEPT

//当Squid缓存中没有用户所要的信息时,squid就自己去向外网中的web服务器请求信息,所以应该允许代理服务器的http请求。

⑥ # iptables -t filter -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT

//当Squid缓存中没有用户所要的信息时,squid就自己去向外网中的web服务器请求信息,所以应该允许代理服务器的DNS请求。

⑦ # iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT

//允许返回的回应信息的进入

122836181.jpg//定义一个acl,控制软件部访问sina

123232892.jpg

//关于squid的访问控制策略使用,请参考本人的相关博客。

b、QQ策略控制

⑨ #iptables -t filter -I FORWARD 2 -m iprange --src-range 192.168.30.21-192.168.30.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto qq -j  DROP

//在第二条规则前面添加一条策略,用来控制工程部使用QQ,只能使用l7中的定义的七层协议。

c、迅雷策略控制

⑩ #iptables -t filter -I FORWARD 2 -m iprange --src-range 192.168.30.21-192.168.30.30 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto xunlei -j  DROP

//在第二条规则前面添加一条策略,用来控制工程部使用迅雷。

d、最大连接数的控制

iptables-I FORWARD 2 -m iprange --src-range 192.168.30.21-192.168.30.30 -mtime--timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --syn--dport 80 -m connlimit --connlimit-above 3 -j DROP

//也可以使用squid来现在最大连接数

1、经理办公室访问策略控制

1、允许http

a

# iptables-A FORWARD -m iprange --src-range 192.168.30.31-192.168.30.40 -mtime--timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p udp--dport 53 -j ACCEPT

//允许DNS

b

#iptables -A FORWARD -m iprange --src-range 192.168.30.31-192.168.30.40 -mtime--timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp--dport 80 -j ACCEPT

2、允许QQ

#iptables -A FORWARD -m iprange --src-range 192.168.30.31-192.168.30.40 -mtime--timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7--l7proto qq -j ACCEPT

2、DMZ区域内的rdp服务器发布到外网中

说明:DMZ区域内的服务器中要安装rdp服务,可以使用Redhat,本实验使用的是Windows7。

1、# iptables -t nat -A PREROUTING -d 192.168.1.138 -p tcp --dport 3389 -j DNAT --to 192.168.40.10

2、# ipables -t filter -I FORWARD 1 -i eth1 -d 192.168.40.10 -p tcp --dport 3389 -j ACCEPT

123755736.jpg

123848835.jpg

123922365.jpg

说明:以上使用的软件包下载地址--》http://yunpan.cn/QbQdBXIkkIujH