本文档为该子系统设计与实现人员提供参考。
本文简单介绍在Linux下如何构建和实现网桥式防火墙,以及如何扩展该网桥式防火墙。
构建企业网关的一个重要前提是在企业网关上实现一个防火墙。该防火墙除了对进出包进行包过滤外,还应能够选择性地将特定的包投递给特定的目的主机(保持企业的网络架构不变)。这就要求该防火墙还具备网桥功能,因此网桥式防火墙是构建企业网关的重要基础。
在Linux构建和实现网桥式防火墙首先应该了解怎么构建简单的网桥式防火墙,然后了解如何扩展基本的网桥式防火墙以满足特定的需求。
本文正是基于上述理由而撰写的。
写作指导者:范兵;
写作执笔者:彭令鹏;
本文档结构组织如下。
第一章:文档说明,简要介绍本文档;
第二章:构建简单的网桥式防火墙,介绍在Linux 下构建一个简单的网桥式防火墙的基本流程;
第三章:网桥式防火墙的内核实现,介绍Linux内核是怎么实现网桥式防火墙的,这是扩展网桥式防火墙的重要基础;
第四章:扩展网桥式防火墙,扩展简单的网桥式防火墙以满足特定的需求。
因为水平有限,并且学习的深度不够,本文档的错误一定很多,所以仅供参考。当然,本文档的更新与校正会一直进行。
网桥是一个链路层转发设备,它根据源MAC地址将数据包从特定的端口转发给目的主机。透明式网桥是本文的研究对象,它可以不影响原网络架构地插入网络中。对终端用户来说,在插入透明式网桥前后,所有网络功能都是一样的,因此透明式网桥对终端用户透明。
现在的防火墙虽然有包过滤、透明转发和记录攻击等多种功能,但包过滤仍是其最基本且最有用的功能。通过包过滤,防火墙可以部分地将攻击阻挡在防火墙之外,从而为防火墙内部用户提供一个较安全的网络环境。
网桥式防火墙简单地来说就是网桥+防火墙,我们所研究的是透明网桥式防火墙。传统的商用防火墙一般需要更改待保护的网络的架构,而透明网桥式防火墙则不需要。更为重要的是,有时候我们需要将进出包投递到特定的主机(如将数据包投递经监控服务器,以实现对网络内容的监控),这样透明网桥式则是一种不错的选择。
2.2 Netfilter和Iptables
为支持网桥式防火墙,Linux2.4及以上内核提供了Netfilter和Iptables。
Netfilter是Linux内核中实现网桥式防火墙的模块,它通过在TCP/IP协议栈中插入钩子点的办法来尽量减小对TCP/IP协议栈的影响。需要网桥式防火墙功能时,应将Netfilter模块编译进内核,这个时候Netfilter在协议栈中提供钩子点,钩取数据包内容供钩子函数处理。而钩子点处的钩子函数的配置则可由Iptalbes等工具来实现。
Iptables 则利用内核中Netfilter的功能,提供了一个配置使用Netfilter的用户态接口。通过这个接口,用户可以在Netfilter各钩子点处放置钩子函数,来实现对网络数据的处理。需要注意的是Iptables也同Netfilter一样整合在内核里。
收发的数据流经钩子点时,将被钩子函数截取并处理,然后根据处理结果来决定数据的走向(是丢弃,是拒绝,还是继续往上走正常的协议栈)。
更为详细的介绍请参考3.2.2Linux防火墙的工作流程。
考虑如图 1所示的一个网络。中间的192.168.0.1为一台装有4个网卡的Linux服务器。我们需要其为另外4台机器转发数据包,并且能够选择性地拒绝某些转发请求(如拒绝ping请求)。
2.3.1 创建网桥
Linux中配置网桥的工具是bridge-utils,2.6及以上的内核已自带了这个工具。具体步骤如下。
brctl addbr br_192 /* 为网桥建立一个逻辑网段,命名为br_192 */
brctl addif br_192 eth0 /* 绑定eth0为br_192网桥的一个端口 */
brctl addif br_192 eth1 /* 绑定eth1为br_192网桥的一个端口 */
brctl addif br_192 e th2 /* 绑定eth2为br_192网桥的一个端口 */
brctl addif br_192 eth3 /* 绑定eth3为br_192网桥的一个端口 */
ifconfig eth0 0.0.0 .0 /* eth0作为网桥的一个端口,已不需要IP */
ifconfig eth1 0.0.0 .0 /* eth1作为网桥的一个端口,已不需要IP */
ifconfig eth2 0.0.0 .0 /* eth2作为网桥的一个端口,已不需要IP */
ifconfig eth3 0.0.0 .0 /* eth3作为网桥的一个端口,已不需要IP */
ifconfig eth0 promisc up /* 网桥端口需要接收转发所有数据,因此开启混杂模式*/
ifconfig eth1 promisc up /* 网桥端口需要接收转发所有数据,因此开启混杂模式*/
ifconfig eth2 promisc up /* 网桥端口需要接收转发所有数据,因此开启混杂模式*/
ifconfig eth3 promisc up /* 网桥端口需要接收转发所有数据,因此开启混杂模式*/
ifconfig br_192 192.168.1.1 /* 为网桥指定一个IP,以方便远程管理等 */
以上步骤需要重点指出如下几点。
作为网桥端口的各物理网卡的工作任务是接收转发所有链路层数据包,因此已经不需要IP,并且要工作在混杂模式。
Linux网桥可以为网桥配置一个IP和外部通信,因此网桥br_192也常被称为虚拟网络设备,这个配置的IP不是附着在某个特定的物理网卡上,而是可以附在每个网桥端口网卡上(网卡eth0接收到目的IP为192.168.1.1的数据包,会将该数据包传递给网桥本机处理,eth1、eth2和eth3也如此)。
更详细的相关内容请参考2.3.1Linux下网桥的工作原理。