0

我正在尝试学习数据包排队的技巧,所以我想我已经对从已知 Tor 出口节点进入端口 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、queue 和 pass 行时,所有连接都非常慢。我什至针对 pfctl -t torlist -T test 测试了我自己的 IP,并返回“0/1 地址匹配”,如果我从列表中测试一个,它是“1/1 地址匹配”

所以我并没有真正了解我到底做错了什么,我假设符合它的通行证只会应用于该表中列出的 IP,因此我自己的 IP 不会验证根据该规则,并将传递到下一个规则。

让它工作并不紧急,但任何有助于理解我失败的地方将不胜感激。

4

1 回答 1

1

原来我不太明白 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 会解析所有规则,除非您使用“快速”)

这样,只有那些匹配的 IP 会被限制到 qin-tor 队列,其他所有未定义的都默认到 qin-www 队列。

OpenBSD的pf上的FAQ似乎并没有让我明白这一点,直到我想到为什么“默认”会出现错误,然后我想它可能适用于整个界面,所以需要为规则定义一个默认值未标记到特定队列。

所以它是......我的“简单”问题的解决方案。希望有这个问题的其他人能遇到这个问题。

这是我用于数据包排队的常见问题解答:http ://www.openbsd.org/faq/pf/queueing.html

于 2012-12-01T05:43:04.593 回答