我正在尝试学习数据包排队的绳索,所以我想我已经设置了从已知Tor Exit节点进入端口80的流量限制。这是在FreeBSD 9上,因此特定于OpenBSD的解决方案可能不适用(语法/等)。
# Snipped to mainly the relevant parts
table <torlist> persist file "/var/db/torlist"
# ...
set block-policy return
scrub in all
scrub out on $ext_if all
# What I *want* to do is create a cue for known tor exit nodes
# no single one IP should be able to do more than 56k/sec
# but the combined bandwidth of all tor visitors should not
# exceed 512k/sec, basically limiting Tor visitors to something
# like dialup
altq on $ext_if cbq bandwidth 512k queue { qin-tor }
queue qin-tor bandwidth 56Kb cbq ( default rio )
# ...
block in log all
antispoof for { $ext_if, $tun_if }
antispoof quick for $int_if inet
### inbound web rules
# Main Jail ($IP4_PUB3 is my webserver IP)
pass in on $ext_if inet proto tcp from <torlist> to $IP4_PUB3 port www synproxy state queue qin-tor
pass in on $ext_if inet proto tcp to $IP4_PUB3 port www synproxy state
问题是,当启用了特定于torlist的altq,队列和传递线时,所有连接都非常慢。我甚至在pfctl -t torlist -T测试中测试了我自己的IP,并得到了“0/1地址匹配”,如果我从列表中测试一个,那就是“1/1地址匹配”
所以我并没有真正了解我究竟做错了什么,我假设传票符合其中仅适用于该表中列出的IP,因此我自己的IP不会不对该规则进行验证,并将传递给下一个规则。
让它工作并不紧急,但是在理解我失败的地方有任何帮助将不胜感激。
答案 0 :(得分:0)
原来我不太明白altq是如何工作的。当我在只有一个队列的外部接口上创建队列时,我为所有连接创建了一个默认值。因此,我必须定义我的最高速度,并为其他所有内容创建一个默认队列。
例如,如果我的系统有100Mb顶部
altq on $ext_if cbq bandwidth 100Mb queue { qin-www, qin-tor }
queue qin-www bandwidth 98Mb priority 1 cbq ( default borrow )
queue qin-tor bandwidth 56Kb priority 7 cbq ( rio )
...
pass in on $ext_if inet proto tcp to $IP4_PUB3 port www synproxy state
pass in on $ext_if inet proto tcp from <torlist> to $IP4_PUB3 port www synproxy state queue qin-tor
(不需要在顶部,因为pf会解析所有规则,除非你使用'quick')
通过这种方式,只有那些匹配的IP被限制到qin-tor队列,其他未定义的内容默认为qin-www队列。
OpenBSD的pf上的常见问题解答似乎没有让我清楚,直到我想到为什么会出现“默认”错误,然后我想也许它适用于整个界面,所以需要定义一个未标记为特定队列的规则的默认值。
所以它是......我'简单'问题的解决方案。希望有这个问题的其他任何人都能解决这个问题。
这是我要进行数据包排队的常见问题解答:http://www.openbsd.org/faq/pf/queueing.html