一、透明模式防火墙与透明代理的概念
一般而言,防火墙的两个网络接口应分属两个不同的网络,根据系统管理员定义的访问规则在两个接口之间转发数据包,或者拒绝、丢弃数据包。实际上,防火墙不 单单是访问控制的功能,而且还充当了路由器的角色。当然,这并非有什么不妥当的地方,但是当你企图把你配置好的防火墙放入运行网络,来保护现有系统安全的 时候,你不得不重新考虑和更改你的网络架构。另外一个可能的麻烦是,当防火墙发生意外时,如果没有防火墙的硬件备份的话,那么你将面临巨大的心理压力,因 为防火墙的故障,整个网络瘫痪了。
假如你把防火墙配置成透明模式(可称为伪网桥),就无需更改网络架构,即使是防火墙不能工作了,要做的仅仅是拔出网线, 把网线直接插在路由器的内部接口就可以让网络正常工作,然后你就有时间慢慢恢复发生故障的防火墙。在防火墙厂商推荐产品的过程中,很多厂商往往会介绍自己的产品实现了透明模式和透明代理。那么究竟什么是透明模式和透明代理呢?他们之间又有何关系呢?下面我们将做具体分析。
透明模式,顾名思义,首要的特点就是对用户是透明的(Transparent),即用户意识不到防火墙的存在。要想实现透明模式,防火墙必须在没有IP地址的情况下工作,不需要对其设置IP地址,用户也不知道防火墙的IP地址。防火墙作为实际存在的物理设备,其本身也起到路由的作用,所以在为用户安装防火墙时,就需要考虑如何改动其原有的网络拓扑结构或修改连接防火墙的路由表, 以适应用户的实际需要,这样就增加了工作的复杂程度和难度。但如果防火墙采用了透明模式,即采用无IP方式运行,用户将不必重新设定和修改路由,防火墙就 可以直接安装和放置到网络中使用,如交换机一样不需要设置IP地址。透明模式的防火墙就好象是一台网桥(非透明的防火墙好象一台路由器),网络设备(包括主机、路由器、工作站等)和所有计算机的设置(包括IP地址和网关) 无须改变,同时解析所有通过它的数据包,既增加了网络的安全性,又降低了用户管理的复杂程度。而与透明模式在称呼上相似的透明代理,和传统代理一样,可以 比包过滤更深层次地检查数据信息,比如FTP包的port命令等。同时它也是一个非常快的代理,从物理上分离了连接,这可以提供更复杂的协议需要,例如带 动态端口分配的H.323,或者一个带有不同命令端口和数据端口的连接。这样的通信是包过滤所无法完成的。
防火墙使用透明代理技术,这些代理服务对用户也是透明的,用户意识不到防火墙的存在,便可完成内外网络的通讯。当内部用户需要使用透明代理访问外部资源 时,用户不需要进行设置,代理服务器会建立透明的通道,让用户直接与外界通信,这样极大地方便了用户的使用。
一般使用代理服务器时,每个用户需要在客户端 程序中指明要使用代理,自行设置Proxy参数(如在浏览器中有专门的设置来指明HTTP或FTP等的代理)。而透明代理服务,用户不需要任何设置就可以 使用代理服务器,简化了网络的设置过程。
透明代理的原理如下:假设A为内部网络客户机,B为外部网络服务器,C为防火墙。当A对B有连接请求时,TCP连接请求被防火墙截取并加以监控。截取后当发现连接需要使用代理服务器时,A和C之间首先建立连接,然后防火墙建立相应的代 理服务通道与目标B建立连接,由此通过代理服务器建立A 和目标地址B的数据传输途径。从用户的角度看,A和B的连接是直接的,而实际上A 是通过代理服务器C和B建立连接的。反之,当B对A有连接请求时原理相同。由于这些连接过程是自动的,不需要客户端手工配置代理服务器,甚至用户根本不知 道代理服务器的存在,因而对用户来说是透明的。
代理服务器可以做到内外地址的转换,屏蔽内部网的细节,使非法分子无法探知内部结构。代理服务器提供特殊的筛选命令,可以禁止用户使用容易造成攻击的不安全的命令,从根本上抵御攻击。防火墙使用透明代理技术,还可以使防火墙的服务端口无法探测到,也就无法对防火墙进行攻击,大大提高了防火墙的安全性与抗攻击性。
透明代理避免了设置或使用中可能出现的错误,降低了防火墙使用时固有的安全风险和出错概率,方便用户使用。因此,透明代理与透明模式都可以简化防火墙的设置,提高系统安全性。
但两者之间也有本质的区别:工作于透明模式的防火墙使用了透明代理的技术,但透明代理并不是透明模式的全部,防火墙在非透明模式中也可以使用透明代理。
二、环境搭建
2.1.1硬件配置
为了实现高效的防火墙和网络检测,系统CPU必须足够的强大和快速。系统需要三块网卡,其中两块网卡支持网桥的实现,另外一块用来实现对防火墙的管 理。(至少2块网卡,可以把管理IP配置在桥接设备上)。磁盘容量并不是很重要,但是所有的log信息应该被保存下来。若希望维护某些本地 logging(用于某些配置和检测工具),则需要确保拥有足够的免费空间-防火墙和入侵检测记录往往非常庞大。
2.1.2安装Linux
当系统安装完毕并重新启动时,编辑/etc/hosts.allow来只允许管理机通过SSH来连接进入系统,然后重新启动按照正常模式引导进入系统。然后再将主以太接口连接到内部网络中。
2.1.3创建支持网桥方式的内核
按照基本的内核编译步骤进行,只不过需要关闭大多数的选项开关,而仅仅打开一些必须的内核编译开关。下载最新的内核,2.4可能需要下载在网桥模式下的时 候让内核能正常支持netfilter的补丁bridge-nf,这个很重要,不打这个patch , iptables 将无法对通过你网桥包做过滤,2.6就已经自带了,地址:
http://ebtables.sourceforge.net/download.html,bridge- nf只支持最新版本的原始内核,所以如果你不是对内核很熟悉,请不要试图在老版本内核上安装这个patch,因为你可能根本找不到适合你内核版本的补丁, 也不要试图在发行版自带的内核上打这个patch,因为几乎所有Linux发行版都打了很多发行商认为对用户有益的patch,所以你可能根本没办法把 bridgenf成功打到这些内核的源码中。
# cd /usr/src/linux-2.4.21
# patch –p1 < /path/to/ebtables-brnf-9_vs_2.4.30.diff.gz
如果没有报任何错误,接下来就可以开始编译内核了,这里对如何编译内核不多做介绍,我们只介绍和我们工作需要相关的选项。
执行make meunconfig 或者make xconfig 进入Networking options 选项,选中Network packet filtering (replaces ipchains),只要选择支持了Network packet filtering 就会自动支持bridge-nf。另外还得选择支持802.1d Ethernet Bridging,这样我们的Linux才能作为网桥服务器,如果你想试试ebtables你可以根据自己的需要把802.1d Ethernet Bridging下面的ebt开头的选项编译成模块。
执行make dep;make bzImage;make modules;make modules_install来编译新内核,复制编译好的内核到/boot/vmlinuz-2.4.31,执行mkinitrd命令生成新的initrd文件:
# mkinitrd /boot/initrd-2.4.31.img 2.4.31
修改grub.conf加入对新内核的引导记入,重新启动用新编译的内核引导系统,如果没有意外,支持bridge-nf的内核就编译成功了
==========================
对于2.6内核只需要make meunconfig, 选择选项后make,make modules_install, make install 即可,其他系统自动搞定,省去很多麻烦。
2.1.4编译bridge-utils
要让Linux实现网桥功能除了编译支持网桥的内核之外(802.1d Ethernet Bridging),还需要应用软件的支持, 这个软件就是bridge-utils ,我们可以到
http://sourceforge.net/project/showfiles.php?group_id=26089 下载最新的版本,很多发行版已经捆绑了这个软件,如果你系统里有brctl这个命令的话,就是已经安装过这个软件了。假设没有安装这个软件,可以按照下面步骤进行:
1.下载最新的bridge-utils,本例中用的版本是1.0.6
2.tar zxvf bridge-utils-1.0.6.tar.gz
3.cd bridge-utils-1.0.6
4../configure --prefix=/usr(这一步可不需要,默认的,可以看自带的说明文档)
5.Make;make install
对于RPM用户建议用包里的spec文件将bridge-utils编译打包成RPM包,以方便维护升级管理:
1.tar zxvf bridge-utils-1.0.6.tar.gz
2.cd bridge-utils-1.0.6
3.cp bridge-utils.spec /usr/src/redhat/SPECS
4.cp bridge-utils-1.0.6.tar.gz /usr/src/redhat/SOURCE
5.rpmbuild –ba /usr/src/redhat/SPECS/ bridge-utils.spec
6.cd /usr/src/redhat/RPMS/i386
7.rpm –Uvh bridge-utils-1.0.6-1.i386.rpm bridge-utils-devel-1.0.6-1.i386.rpm
安装bridge-utils结束
三、配置Linux为网桥服务器
装好bridge-utils后就可以使用brctl命令来创建网桥设备了,首先交待一下测试的网络环境,下面是测试环境的网络拓扑图,其中图一是原始的 网络拓扑,一共有三台服务器,分别是Web 服务器172.16.78.194,NTP 服务器72.16.78.88 和MySQL 数据库服务器172.16.78.99。三台服务通过交换机连接到路由器设备上,网关地址为72.16.76.1。现在我们要做的是在不改变原来网络结构 的情况,在路由器和交换机之间接入一台Linux服务器作为网桥设备,并在这台服务器上实现对以上三台服务器的防火墙保护。图二是加入网桥服务器后的拓 扑。
网关:
172.16.76.1
交换机
Web服务器
172.16.78.194
NTP服务器
172.16.78.88
MySQL服务器
172.16.78.99
互联网
图一 原始网络结构
图二 接入网桥后的网络结构
下面我们来看看如何在linux上配置网桥,使用的命令是brctl,在命令行下输入brctl可以得到该命令的帮助,也可以用man brctl来获得更详细的命令使用帮助,我的例子中只需要知道几个常用的参数:1如何创建网桥设备,2如何将网卡设备添加到网桥中,3如何从网桥中删除网 卡,4如何删除网桥设备。
1.创建网桥设备:
brctl addbr br0 (创建一个叫br0的网桥设备)
2.向br0中添加网卡eth0和eth1
brctl addif eth0
brctl addif eth1
3.从网桥中删除网卡eth0 和eth1
brctl delif eth0
brctl delif eth1
4.删除网桥br0
brctl delbr br0
在多数情况下,我们做网桥防火墙需要的是一台三网卡的服务,2个网卡做桥接,另外一个配置好ip地址作为管理接口,以便远程登陆网桥服务器对防火墙进行管 理。但是还有可选的选择,比如只在网桥防火墙上配置串口,需要维护的时候通过串口线连接服务器,这种方式让网桥服务器更加安全,因为服务器根本没有IP地 址,攻击者对它根本无从下手。另外一种是直接把管理端口配置在br0设备上,这样可以节约一块网卡的费用(虽然网卡根本不值钱,但是对于我这样的穷人来说 也是不小的费用*^_^*),这种方式带来的问题包括有安全隐患,因为服务器实际有了ip地址,以及性能上的影互联网响,尽管影响可能不大。
网关:
172.16.76.1
交换机
Web服务器
172.16.78.194
NTP服务器
172.16.78.88
MySQL服务器
172.16.78.99
Linux网桥服务器
在网桥上设置ip地址的命令如下:
ifconfig br0 172.16.78.171 netmask 255.255.252.0 broadcast 172.16.79.255
至此,网桥就配置好了,现在只要像上面图二那样把原来连接到交换机的网线连接到网桥服务器的eth0,把网桥服务器的eth1连接到交换机就ok了,测试 一下把,现在无论是从外面还是从那三台服务器本身访问都是互通的,如果不能访问,请检查网线连接是否正确。
四、配置防火墙策略
上面的网络拓扑显示三台服务器分别对外提供web和ntp服务,MySQL服务器只需要和web服务器连接,因此我们只需要对外开放TCP 80 TCP123 UDP123端口,而对三台服务器而,它们应该可以无限制的访问外网。本文不讨论iptables的具体配置,大家可以在互联网上查阅免费的手册和文档资 源。下面是针对图二网络结构编写的iptables脚本,不是很完善,仅供参考:
# Create the interface br0
/usr/sbin/brctl addbr br0
# Add the Ethernet interface to use with the bridge
/usr/sbin/brctl addif br0 eth0
/usr/sbin/brctl addif br0 eth1
# Start up the Ethernet interface
/sbin/ifconfig eth0 0.0.0.0
/sbin/ifconfig eth1 0.0.0.0
# Configure the bridge ethernet
# The bridge will be correct and invisible ( transparent firewall ).
# It's hidden in a traceroute and you keep your real gateway on the
# other computers. Now if you want you can config a gateway on your
# bridge and choose it as your new gateway for the other computers.
/sbin/ifconfig br0 172.16.78.171 netmask 255.255.252.0 broadcast 172.16.79.255
# I have added this internal IP to create my NAT
# ip addr add 192.168.0.1/24 dev br0
/sbin/route add default gw 172.16.76.1
iptables -F FORWARD
iptables -P FORWARD DROP
iptables -A FORWARD -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 -m state --state INVALID
-j DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Some funny rules but not in a classic Iptables sorry ...
# Limit ICMP
iptables -A FORWARD -p icmp -m limit --limit 4/s -j ACCEPT
# Match string, a good simple method to block some VIRUS very quickly
#iptables -I FORWARD -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"
# Block all MySQL connection just to be sure
iptables -A FORWARD -p tcp -s 0/0 -d 172.16.78.99 --dport 3306 -j DROP
# Linux Mail Server Rules
# Allow FTP-DATA (20), FTP (21), SSH (22)
# iptables -A FORWARD -p tcp -s 0.0.0.0/0 -d 62.3.3.27/32 --dport 20:22 -j
ACCEPT
# Allow the Mail Server to connect to the outside
# Note: This is *not* needed for the previous connections
# (remember: stateful filtering) and could be removed.
#iptables -A FORWARD -p tcp -s 62.3.3.27/32 -d 0/0 -j ACCEPT
# WWW Server Rules
# Allow HTTP ( 80 ) connections with the WWW server
iptables -A FORWARD -p tcp -s 172.16.78.160 -d 172.16.78.194 --dport 80 -j
DROP
iptables -A FORWARD -p tcp -s 172.16.78.60 -d 172.16.78.194 --dport 80 -j DROP
iptables -A FORWARD -p tcp -s 0.0.0.0/0 -d 172.16.78.194 --dport 80 -j ACCEPT
# Allow HTTPS ( 443 ) connections with the WWW server
# iptables -A FORWARD -p tcp -s 0.0.0.0/0 -d 172.16.78.194 --dport 443 -j
ACCEPT
# Allow the WWW server to go out
# Note: This is *not* needed for the previous connections
# (remember: stateful filtering) and could be removed.
iptables -A FORWARD -s 172.16.78.194 -d 0/0 -j ACCEPT
# NTP Server Rules
iptables -A FORWARD -p udp -s 0/0 -d 172.16.78.88 --dport 123 -j ACCEPT
# Allow the NTP server to go out
iptables -A FORWARD -s 172.16.78.88 -d 0/0 -j ACCEPT
五、关于内核2.6