我刚刚读了一本关于PF的书(《 PF的书》,没有淀粉),但是有一个问题没有解决。
如果我有一台使用两个接口$ int_if和$ ext_if的网关计算机,并且我将NAT从$ int_if:net(即10.0.0.0/24)到$ ext_if的包使用match
NAT转换为NAT,则应用NAT ?过滤规则之前还是之后?
例:
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
pass out on $ext_if from 10.0.0.0/24
block drop out on $ext_if from 10.0.0.23
那样有用吗?还是获取来自10.0.0.23的数据包的源IP NAT到$ ext_if的地址,然后检查其是否来自10.0.0.23?
我认为,此图对回答这个问题没有帮助,但是仍然很有趣:[ http://www.benzedrine.cx/pf_flow.png ]
如果您阅读PF NAT FAQ [ http://www.openbsd.org/faq/pf/nat.html ],尤其是“配置NAT”部分,则会遇到以下句子:
当通过匹配规则选择数据包时,该规则中的参数(例如nat-to)会被记住,并在达到与数据包匹配的通过规则时将其应用于数据包。这允许通过单个匹配规则来处理整个数据包类别,然后可以使用阻止和通过规则来做出是否允许流量的特定决定。
我认为这听起来不像我在上一段中所说的那样,因此源IP被“记住”,直到对要对该数据包执行的操作做出决定为止。如果做出决定,将应用NATting。
你怎么看?
PS:这是一个非常理论上的问题。如果您有点务实,可以按照以下方式进行:
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop from 10.0.0.23
# or, explicitly,
# block drop in on $int_if from 10.0.0.23
因此,block
当数据包进入$ int_if时,该规则已被应用。
编辑:当然,另一种可能性是在NAT之前进行决定:
pass from 10.0.0.0/24
block drop from 10.0.0.23
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
如果来自.23的数据包到达,它首先匹配第一个规则,然后匹配第二个规则和第三个“规则”。但是,由于第二条规则是最后决定通过/阻塞的规则,因此数据包被阻塞了。对?
quick
关键字,但是我不太喜欢它-我总是尝试使用pf的评估顺序;)顺便说一句,我在OpenBSD FAQ页面上找到了答案:“ NAT被指定为可选的nat-to参数,通常,不是直接在通过规则上设置而是使用匹配规则。当通过匹配规则选择数据包时,该规则中的参数(例如nat-to)会被记住并应用于当达到与数据包匹配的通过规则时,该数据包。因此,我的规则集不会造成任何问题,并且可以正确阻止.23