FreeBSD 的基本系统内建了三种不同的防火墙软件包。 它们是 IPFILTER (也被称作 IPF)、 IPFIREWALL (也被称作 ipfw), 以及 OpenBSD 的 PacketFilter (也被称为 PF)。 freebsd 也提供了两个内建的、 用于流量整形 (基本上是控制带宽占用) 的软件包: altq(4) 和 dummynet(4)。 Dummynet 在过去一直和 IPFW 紧密集成, 而 ALTQ 则需要配合 IPF/PF 使用。
花了两天时间琢磨一下防火墙限速的配置方法,目前配置过的防火墙主要是IPF和IPF,限速的软件包配置的是Dummynet(配合IPFW使用)和ALTQ(配合IPF使用)。
一、配置IPFW+Dummynet
IPFIREWALL (IPFW) 是一个由 FreeBSD 发起的防火墙应用软件, 它由 FreeBSD 的志愿者成员编写和维护。标准的 FreeBSD 安装中, IPFW 所给出的规则集例子 (可以在 /etc/rc.firewall 中找到) 非常简单,以至于没有办法不加修改地加以使用。IPFW 由几部分组成, 其主要组件是内核的防火墙过滤规则处理器,及其集成的数据包记帐工具、 日志工具、 用以触发 NAT 工具的 'divert' (转发) 规则、 高级特殊用途工具、 dummynet 流量整形机制, 'fwd rule' 转发工具, 桥接工具, 以及 ipstealth 工具。IPFW 是基本的 FreeBSD 安装的一部分, 以单独的可加载内核模块的形式提供。 如果在 rc.conf 中加入 firewall_enable="YES" 语句, 就会自动地加载对应的内核模块。 除非您打算使用由它提供的 NAT 功能, 一般情况下并不需要把 IPFW 编进 FreeBSD 的内核。不过我刚开始安装防火墙时没有注意到这句话,所以选择的是编译内核的方式。
# cd /usr/src/sys/i386/conf
# cp GENERIC ipfw //备份原有内核的配置文件
#ee ipfw
在ipfw中做以下修改:
ident ipfw
添加以下选项:
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMITS=5
options IPFIREWALL_DEFAULT_TO_ACCEPT
options DUMMYNET
#diff GENERIC ipfw //查看原有的内核文件与ipfw的区别
25c25
< ident GENERIC
---
> ident ipfw
59a60,66
>
> options IPFIREWALL
> options IPFIREWALL_VERBOSE
> options IPFIREWALL_VERBOSE_LIMIT=5
> options IPFIREWALL_DEFAULT_TO_ACCEPT
> options IPDIVERT
> options DUMMYNET
#/usr/sbin/config ipfw
#cd ../compile/ipfw //根据配置文件生成/usr/src/sys/i386/ipfw下的内核源程序文件
# make depend
# make
#make install //编译安装新内核
修改/etc/rc.conf,添加以下选项:
firewall_enable="YES" //启用防火墙
firewall_script="/etc/ipfw.rules" //读取防火墙规则
firewall_logging="YES" //记录日志
firewall_type="open" //选择防火墙使用open模式
################################################################################### open -允许任何人进入
# client -只保护这台机器
# simple -保护整个网络
# closed -除了lo0接口上的服务,禁用其它任何IP服务
# UNKNOWN -不加载防火墙规则
# filename -加载给定文件中的规则(要指定完全路径)
##################################################################################
编写防火墙规则:
#ee /etc/ipfw.rules
/sbin/ipfw add 100 pipe 1 ip from any to any out //设定流出的流量
/sbin/ipfw add 200 pipe 2 ip from any to any in //设定流入的流量
/sbin/ipfw pipe 1 config bw 1Mbit/s //设定流出流量的带宽为1Mbit/s
/sbin/ipfw pipe 2 config bw 1Mbit/s //设定流入流量的带宽为1Mbit/s
最后重启机器:
# reboot
现在防火墙已经启动起来了。可以用ipfw show查看当前的防火墙规则:
# ipfw show
00100 69 7973 pipe 1 ip from any to any out
00200 91 15534 pipe 2 ip from any to any in
65535 0 0 allow ip from any to any
此时可以做一个小实验来测试限速是否有效。从另一台机器向安装了ipfw的机器发送流量, 测试发出的流量和收到的流量之间是否有差距;然后再反过来,从安装ipfw的机器向其他机器发送流量,在两台机器上监控发送和接收的流量,比较流量的变化情况。此处发送流量的程序是预先调试好的,不同的程序分别可发送的流量是不同的。经过测试证明,防火墙的限速还是有效果的。
注:防火墙加载有两种方式,可以在/etc/rc.conf中写入启用防火墙的选项,也可以将防火墙选项写入内核的配置文件,重新编译安装内核。编译内核的方式一般是需要要用到防火墙的NAT功能是采用。但是如果要使用防火墙的限速功能,需要在内核中加载带宽整形模块。IPFW相对应的模块是Dummynet,这个模块需要在内核中写入,并且编译。有一种办法未尝试,即将防火墙写入/etc/rc.conf。将内核配置文件中只加入Dummynet,然后编译,安装内核。有时间可以尝试一下。