我想问一下是否可以同时使用 pf 进行所有数据包过滤(包括使用 altq 进行流量整形)和使用 ipfw 的 dummynet 来限制某些 IP 或子网的带宽。
我正在使用 FreeBSD 10,但找不到明确的答案。谷歌搜索返回以下结果:
- 有用
- 它不起作用
- 可能有效,但不稳定,不推荐
- 只要你按照正确的顺序加载内核模块,它就可以工作
- 它曾经可以工作,但在最近的 FreeBSD 版本中却不行
- 只要你使用 pfsense 的补丁,它就可以正常工作
然后有提到这个补丁可能已经合并回 FreeBSD,但我找不到它。
可以确定的是,pfSense 同时使用两个防火墙,所以问题是,是否可以使用原装 FreeBSD 10(如果仍然需要,在哪里可以获得补丁)。
以下是我目前拥有的以及我如何加载内容的示例,以供参考
/etc/rc.conf
ifconfig_vtnet0="inet 80.224.45.100 netmask 255.255.255.0 -rxcsum -txcsum"
ifconfig_vtnet1="inet 10.20.20.1 netmask 255.255.255.0 -rxcsum -txcsum"
defaultrouter="80.224.45.1"
gateway_enable="YES"
firewall_enable="YES"
firewall_script="/etc/ipfw.rules"
pf_enable="YES"
pf_rules="/etc/pf.conf"
/etc/pf.conf
WAN1="vtnet0"
LAN1="vtnet1"
set skip on lo0
set block-policy return
scrub on $WAN1 all fragment reassemble
scrub on $LAN1 all fragment reassemble
altq on $WAN1 hfsc bandwidth 30Mb queue { q_ssh, q_default }
queue q_ssh bandwidth 10% priority 2 hfsc (upperlimit 99%)
queue q_default bandwidth 90% priority 1 hfsc (default upperlimit 99%)
nat on $WAN1 from $LAN1:network to any -> ($WAN1)
block in all
block out all
antispoof quick for $WAN1
antispoof quick for $LAN1
pass in on $WAN1 inet proto icmp from any to $WAN1 keep state
pass in on $WAN1 proto tcp from any to $WAN1 port www
pass in on $WAN1 proto tcp from any to $WAN1 port ssh
pass out quick on $WAN1 proto tcp from $WAN1 to any port ssh queue q_ssh keep state
pass out on $WAN1 keep state
pass in on $LAN1 from $LAN1:network to any keep state
/etc/ipfw.rules
ipfw -q -f flush
ipfw -q add 65534 allow all from any to any
ipfw -q pipe 1 config bw 2048KBit/s
ipfw -q pipe 2 config bw 2048KBit/s
ipfw -q add pipe 1 ip from 10.20.20.4 to any via vtnet1 in
ipfw -q add pipe 2 ip from any to 10.20.20.4 via vtnet1 out
答案1
官方规定不能混合使用它们。非官方规定,各种咒语和祭祀可能会导致一种有效但不稳定的配置。无论如何,这都是不推荐的。
另外,为什么不只使用其中一个呢?我假设您希望 dummynet 对每个端点进行一些带宽限制,如果不是,PF 可能就是您所需要的。同样,IPFW 可以完成 PF 可以做的几乎所有事情,但有一些明显不同的调度算法和较少的动态规则空间。