《The BOOK Of PF》中文版 —— 20. 网桥式防火墙
发表于 : 2010-07-13 12:05
网桥式防火墙
一个以太桥由两个或更多个被配置为透明转发以太帧的网络接口构成,它并不对上一层(例如,TCP/IP堆栈)直接可见。 在过滤方面, 网桥配置也很诱人,这是因为可以在一台没有任何IP地址的机器上进行过滤。如果这台机器运行的是OpenBSD或其它有类似能力的操作系统, 它仍然可以过滤和重定向通讯。
这样设置的一个认定优势就是对这个防火墙的攻击更困难。缺点是所有管理任务必须在这个防火墙的控制台操作, 除非你配置了一个可通过某些加密网络或者串口控制台访问的接口。由此可以推论出没有配置IP地址的网桥不能被设置为一个网络的网关和不能在桥接接口上运行任何服务。 在一定程度上, 你可以认为一个网桥就是一个网线上的智能过滤分离器,它具有过滤和重定向的功能。
应用防火墙作为桥时的通用警告:
在OpenBSD上设置基本的网桥
除非你自己编译了一个不带网桥代码的内核,OpenBSD的GENERIC内核已经包含了所有配置网桥和在网桥上过滤所需的代码,配置过程很简单明了。
要在命令行创建一个带有两个接口的网桥, 首选你需要创建这个桥设备。OpenBSD里通常某类设备的第一台编号为0, 所以我们用下面的命令创建网桥bridge0:
在运行下一个ifconfig命令前, 确认一下预设的成员接口 (在我们的例子中是 ep0 和 ep1) 可用但没有分配IP地址。
然后配置这个网桥
OpenBSD的brconfig本身命令包含了不少的过滤代码, 在本例中我们为每个接口选择一个blocknonip选项,目的是阻止所有的non-IP通讯。
对于另一个接口, 你需要在文件 /etc/hostname.ep1 里包含
最后, 在文件 /etc/bridgename.bridge0 里输入桥设置:
到这里你的桥已经可用了。接下来你就可以创建PF规则了。
在FreeBSD上设置基本的网桥
在FreeBSD中的过程稍微复杂一点。要使用网桥, 你运行的内核需要包含或可以导入if_bridge模块。 默认的内核配置已经编译了此模块, 所以一般情况下你可以直接创建这个接口。
如果你想将桥设备编译进内核里, 将这行
加入到内核配置文件里。如果你想在启动时导入这个设备,将下面这行
加入到文件 /etc/loader.conf 内。
创建网桥设备,你需要运行如下的命令来创建bridge0接口:
还需要建立一系列与桥相关的sysctls:
有必要检查一下这些sysctl值都可用。 如果确实可用, 则确认了这个桥已经被启用了。反之, 你需要回去查看一下什么地方错了和为什么。不过, 这些值用于桥接口本身的过滤, 所以我们无需修改这些值, 因为默认情况下已经在成员接口(管道的重点)上启用了IP层的过滤。
在运行下一个ifconfig命令前, 确认一下预设的成员接口 (在我们的例子中是 ep0 和 ep1) 可用但没有分配IP地址。
然后输入下面的命令配置网桥
要让配置永久生效, 将这面这行加入/etc/rc.conf:
到这里你的网桥已经可用并且你可以到这里你的网络已经可以正常工作了,你现在可以去配置PF规则了。请参阅用户手册if_bridge(4)以获取更详尽在FreeBSD的相关网桥的信息。
在NetBSD上设置基本的网桥
在NetBSD上, 默认的内核配置没有包含网桥的过滤支持。你需要编译一个定制的内核,你需要将
添加到内核配置文件里。一旦你有了包含桥代码的新内核, 剩下的设置也很简单。
要创建一个带有两个接口的桥, 首先创建桥设备bridge0:
在运行下一个ifconfig命令前, 确认一下预设的成员接口 (在我们的例子中是 ep0 和 ep1) 可用但没有分配IP地址。
接下来通过如下的命令配置桥
然后在设备bridge0上启用过滤:
要是配置永久生效, 创建或编辑文件 /etc/ifconfig.ep0 并输入下行:
而另一块接口, 你需要编辑 /etc/ifconfig.ep1 并输入下行:
最后, 在文件 /etc/ifconfig.bridge0 里进行桥设置:
到这里你的桥已经可用了。接下来你就可以创建PF规则了。详说明5
这里的桥规则集是我们在这章前面所说的PF为ulge-in-the-wire类型网桥准备的基本规则集。网络又有了一些变化,请参看图f5-3。
一个以太桥由两个或更多个被配置为透明转发以太帧的网络接口构成,它并不对上一层(例如,TCP/IP堆栈)直接可见。 在过滤方面, 网桥配置也很诱人,这是因为可以在一台没有任何IP地址的机器上进行过滤。如果这台机器运行的是OpenBSD或其它有类似能力的操作系统, 它仍然可以过滤和重定向通讯。
这样设置的一个认定优势就是对这个防火墙的攻击更困难。缺点是所有管理任务必须在这个防火墙的控制台操作, 除非你配置了一个可通过某些加密网络或者串口控制台访问的接口。由此可以推论出没有配置IP地址的网桥不能被设置为一个网络的网关和不能在桥接接口上运行任何服务。 在一定程度上, 你可以认为一个网桥就是一个网线上的智能过滤分离器,它具有过滤和重定向的功能。
应用防火墙作为桥时的通用警告:
- 接口处于混杂模式, 这意味着它们可以接收网络上的任何数据包。
- 桥运行在以太层而且默认情况下, 它会转发所有类型的数据包, 并非仅限于TCP/IP。
- 因为接口上没有IP地址,所以一些更有效的冗余特性是在网桥上无法实施的,例如carp。
在OpenBSD上设置基本的网桥
除非你自己编译了一个不带网桥代码的内核,OpenBSD的GENERIC内核已经包含了所有配置网桥和在网桥上过滤所需的代码,配置过程很简单明了。
要在命令行创建一个带有两个接口的网桥, 首选你需要创建这个桥设备。OpenBSD里通常某类设备的第一台编号为0, 所以我们用下面的命令创建网桥bridge0:
代码: 全选
$ sudo ifconfig bridge0 create
然后配置这个网桥
代码: 全选
$ sudo brconfig bridge0 add ep0 add ep1 blocknonip ep0 blocknonip ep1 up
要是配置永远生效, 创建或编辑文件 /etc/hostname.ep0,然后再输入如下命令:说明
OpenBSD的brconfig命令除了提供其它的配置选项外,还提供了自带的过滤选项。你可以参阅用户手册bridge(4)和brconfig(8)以获取更多的信息。这里值得一提的是,因为brconfig运行在以太层, 所以它可以过滤MAC地址。brconfig还可以通过tagged关键字给数据包打标记以便PF进行进一步的处理工作。
代码: 全选
up
代码: 全选
up
代码: 全选
add ep0 add ep1 blocknonip ep0 blocknonip ep1 up
在FreeBSD上设置基本的网桥
在FreeBSD中的过程稍微复杂一点。要使用网桥, 你运行的内核需要包含或可以导入if_bridge模块。 默认的内核配置已经编译了此模块, 所以一般情况下你可以直接创建这个接口。
如果你想将桥设备编译进内核里, 将这行
代码: 全选
device if_bridge
代码: 全选
if_bridge_load="YES"
创建网桥设备,你需要运行如下的命令来创建bridge0接口:
代码: 全选
$ sudo ifconfig bridge0 create
还需要建立一系列与桥相关的sysctls:
代码: 全选
$ sudo sysctl net.link.bridge
net.link.bridge.ipfw: 0
net.link.bridge.pfil_member: 1
net.link.bridge.pfil_bridge: 1
net.link.bridge.ipfw_arp: 0
net.link.bridge.pfil_onlyip: 1
有必要检查一下这些sysctl值都可用。 如果确实可用, 则确认了这个桥已经被启用了。反之, 你需要回去查看一下什么地方错了和为什么。不过, 这些值用于桥接口本身的过滤, 所以我们无需修改这些值, 因为默认情况下已经在成员接口(管道的重点)上启用了IP层的过滤。
在运行下一个ifconfig命令前, 确认一下预设的成员接口 (在我们的例子中是 ep0 和 ep1) 可用但没有分配IP地址。
然后输入下面的命令配置网桥
代码: 全选
$ sudo ifconfig bridge0 addm ep0 addm ep1 up
代码: 全选
ifconfig_ep0="up"
ifconfig_ep1="up"
cloned_interfaces="bridge0"
ifconfig_bridge0="addm ep0 addm ep1 up"
在NetBSD上设置基本的网桥
在NetBSD上, 默认的内核配置没有包含网桥的过滤支持。你需要编译一个定制的内核,你需要将
代码: 全选
options BRIDGE_IPF # bridge uses IP/IPv6 pfil hooks too
要创建一个带有两个接口的桥, 首先创建桥设备bridge0:
代码: 全选
$ sudo ifconfig bridge0 create
接下来通过如下的命令配置桥
代码: 全选
$ sudo brconfig bridge0 add ep0 add ep1 up
然后在设备bridge0上启用过滤:
代码: 全选
$ sudo brconfig bridge0 ipf
要是配置永久生效, 创建或编辑文件 /etc/ifconfig.ep0 并输入下行:
代码: 全选
up
代码: 全选
up
代码: 全选
create
!add ep0 add ep1 up
这里的桥规则集是我们在这章前面所说的PF为ulge-in-the-wire类型网桥准备的基本规则集。网络又有了一些变化,请参看图f5-3。
说明5
要了解更多的知识, 请参阅the PF on NetBSD documentation