Iptables+L7+squid实现完善的软件防火墙
Iptables+L7+squid实现完善的软件防火墙
Iptables是用linux操作系统作为一个软件防火墙做到宏观上的保护,数据包要经过防火墙首先来到tcp/ip协议栈,防火墙通过内核的一些机制来做到对数据的过滤,内核里有这样五个函数INPUT、OUTPUT、FORWARD、POSTROUTING、PREROUTING,内核没办法直接修改我们通过使用iptables用户空间工具来对这五个函数下发规则,从而达到对流量的过滤,五个函数的架构称为netfilter,根据函数的功能可以分为下面三类:
nat:postrouting路由判断之后也就是snat,prerouting路由判断之前也就是dnat
filter:实现流量过滤,input流量目标位防火墙,output流量从防火墙出,forward流量经过防火墙
mangle:TOS、QOS
下面是五个函数对流量过滤的方式:
Input过滤进入防火墙的流量
OUTput过滤来自防火墙的流量
Forward过滤从防火墙经过的流量
Postrouting过滤从某接口出去的流量
Prerouting过滤从某接口进去的流量
为增加iptables防火墙(网络层过滤)的功能可以增加L7(七层协议模块化)补丁来加强对流量的过滤,另外增加squid(应用层过滤)可以使防火墙更加灵活,这样结合起来可以使防火墙更加完善
案例:
要求:
公司有三个部门:
工程部门192.168.20.10-192.168.20.20
软件部门192.168.20.21-192.168.20.30
经理办192.168.20.31-192.168.20.40
上班时间(周一---周五 08:20:00)
工程部门:上班时间只能访问192.168.102.10的ftp,不允许登录qq不允许上网,下班后无限制。
软件部门:通过squid可以上网,但不允许访问非法站点sina ,连接数最多3个,不允许看图片,下班后无限制。
经理办公室:可以上网可以登录qq,下班后无限制
dmz区域:开启远程控制用于外部人员控制访问。
配置步骤:
为iptables增加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
2、配置新内核
cp /boot/config-2.6.18-8.el5 .config//沿用旧的内核配置
make menuconfig
//配置内核时,在"Networking ---> Networking Options ---> Network Packet filtering framework (Netfilter) "处主要注意两个地方:---> Core Netfilter Configuration将"Netfilter connection tracking suport (NEW)"选择编译为模块(M),需选取此项才能看到layer7支持的配置。
//将layer7、string、state、time、IPsec、iprange、connlimit……等编译成模块,根据需要看着办。---> IP: Netfilter Configuration将"IPv4 connection tracking support (require for NAT)"编译成模块。将"Full NAT"下的"MASQUERADE target support"和"REDIRECT target support"编译成模块。
3、编译及安装模块、新内核
make && make modules_install && make install
编译安装成后后,重启选择使用新的内核(2.6.25.19)引导系统
重新编译iptables
1、卸载现有iptables
rpm -e iptables iptstat --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/
cp libxt_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
接下来去配置防火墙:
安装squid
[root@localhost Server]# rpm -ivh squid-2.6.STABLE21-3.el5.i386.rpm
查看规则
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
targetprot opt sourcedestination
Chain FORWARD (policy ACCEPT)
targetprot opt sourcedestination
Chain OUTPUT (policy ACCEPT)
targetprot opt sourcedestination
保证自己能够正常连接到防火墙
[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.20.129 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -t filter -A OUTPUT -d 192.168.20.129 -p tcp --sport 22 -j ACCEPT
拒绝所有过防火墙的流量
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -P OUTPUT DROP
[root@localhost ~]# iptables -P FORWARD DROP
允许内网用户流量通过POSTROUTING从eth3网卡出去
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o eth3 -j MASQUERADE
允许工程部的人员在上班时间能够访问ftp
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.20.10-192.168.20.20 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 21 -j ACCEPT
接收进入内网的所有流量
[root@localhost ~]# iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
只允许工程部人员在上班时间访问192.168.102.10的ftp
[root@localhost ~]# iptables -t filter -R FORWARD 1 -m iprange --src-range 192.168.20.10-192.168.20.20 -m time --timestart 08:00 --timestop 20:00 -d 192.168.102.10 -o eth3 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 21 -j ACCEPT
验证
[root@localhost ~]# date
Thu May 16 10:00:04 CST 2013
不允许工程部人员在上班时间登录qq
[root@localhost ~]# iptables -t filter -A FORWARD-m iprange --src-range 192.168.20.10-192.168.20.20 -m time --timestart 08:00 --timestop 20:00-o eth3 --weekdays Mon,Tue,Wed,Thu,Fri -m layer7 --l7proto qq-j DROP
[root@localhost ~]# date
Thu May 16 10:06:47 CST 2013
下班时间无限制
[root@localhost ~]# iptables -t filter -A FORWARD -s 192.168.20.0/24 -m time --timestart 20:01 --timestop 07:59 -o eth3 -j ACCEPT
[root@localhost ~]# date -s 21:00:00
Thu May 16 21:00:00 CST 2013
软件部访问外网时使用squid代理
[root@localhost ~]# iptables -t nat -A PREROUTING -m iprange --src-range 192.168.20.21-192.168.20.30 -p tcp --dport 80 -j REDIRECT --to-port 3128
编辑squid配置文件
允许流量通过squid端口进入防火墙查看缓存
[root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 3128 -j ACCEPT
[root@localhost ~]# iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT
允许squid使用自己的地址去访问外部网络
[root@localhost ~]# iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -t filter -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
允许软件部和经理办通过eth3的流量能够使用外部dns
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.20.21-192.168.20.40 -p udp --dport 53 -o eth3 -j ACCEPT
[root@localhost ~]# vim /etc/resolv.conf
[root@localhost ~]# vim /etc/squid/squid.conf
[root@localhost ~]# iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
[root@localhost ~]# vim /etc/squid/squid.conf
[root@localhost ~]# vim /etc/squid/squid.conf
[root@localhost ~]# vim /etc/squid/squid.conf
经理办上班时间不受限制
[root@localhost ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.20.31-192.168.20.40 -m time --timestart 08:00 --timestop 20:00 --weekdays Mon,Tue,Wed,Thu,Fri -p tcp --dport 80 -o eth3 -j ACCEPT
DMZ
允许来自eth3端口的访问能够访问到dmz区域的192.168.3.200的3389端口
[root@localhost ~]# iptables -t nat -A PREROUTING -i eth3 -d 192.168.102.200 -p tcp --dport 3389 -j DNAT --to 192.168.3.200
[root@localhost ~]# iptables -t filter -A FORWARD -d 192.168.3.200 -p tcp --dport 3389 -j ACCEPT