分页: 1 / 1

《The BOOK Of PF》中文版 —— 4. 首个规则集,单个独立主机

发表于 : 2010-07-13 8:39
whoami

首个规则集—单个独立主机
这可能是最简单的设置了: 一台没有运行任何服务的主机仅与一个网络(可能是Internet)连接。现在, 我们使用如下的规则集:

代码: 全选

block in all
pass out all keep state
这个规则集拒绝任何进站通讯, 放行我们自己建立的通讯,并且为我们的连接保持状态信息。PF执行配置文件原则是: 读取规则时自上而下, 仅应用规则集当中最后一条匹配(数据包或连接相)的规则。现阶段你知道这个原则就可以了。后面碰上更复杂的规则集时我们将看一下执行顺序。规则里面的keep state部分告诉PF当一个连接匹配这条规则时, 我们也想让出站通讯的返回信息进站。为了实现这个目的, 我们将这个连接的有关信息保存为state table(状态表)里的一个子项。这个信息包含了各种很有用的计数器和序号。我们可以用不同的方式让PF保持状态信息, 但像这样的简单环境, 我们主要的目的是让这些本地发起连接的返回信息可以反馈回来。
这里值得一提的是,从OpenBSD 4.1开始, 默认的pass规则默认情况下会保持状态信息,读者请详说明2,所以目前新格式的规则更简单:

代码: 全选

# minimal rule set, OpenBSD 4.1 onward keeps state by default
block in all
pass out all
事实上, 如果你喜欢,在这里你甚至可以省略关键字all。其它的BSD也将会采用新的格式, 而在本书的余下部分我们也将使用新的格式, 但偶尔也会提醒你一下当怎样使用旧格式。
不言而喻,PF放行的这台主机产生的所有通讯是必须是很可信的,你这样做时意味着你对这台主机是绝对信任的。
使用下列命令应用此规则集:

代码: 全选

$ sudo pfctl -ef /etc/pf.conf
这个规则集导入时应该没有错误及警告信息。除了非常慢的计算机你应该马上可以看到 $ 提示符。(whoami提示:如果你和我一样,看到的是#,:D)
测试规则集
即便像这样只有两行的简单规则集, 先测试一下该规则集是否符合你的设想也是有很用处的。测试一下你的规则是否与你的设想一致永远是个不错的主意, 一旦你的规则集趋于更复杂时,正确的测试就显得尤为重要了。对规则集的每一个变动进行测试并确认它完全是你希望的那样是一个非常好的做法, 这个习惯你越早养成越好。
对我们这里的给出的这个规则集, 你可以通过像检查域名解析做一个基本的测试。这样:

代码: 全选

$ host gobsd.org
它应该返回诸如gobsd.org这台主机的IP地址以及该域名下邮件交换机的主机名。
如果你能ssh到其它系统, 看一下是否你可以在远程主机上login并运行命令。你也可以浏览互联网 (在OpenBSD上基本系统自带了lynx)。
你(对外)测试的任何服务都应该没有问题, 但想从其它别的什么地方访问你的主机上的任何服务都会产生一个Connection refused(拒绝连接)信息。
说明2
事实上, 默认的新规则相当于keep state flags S/SA, 确保了设置连接时只有最初的SYN数据包产生状态, 消除了一些令人迷惑的状况。
如果你想无状态地过滤, 你可以将不想记录或保持状态信息的规则指定为no state。
在FreeBSD 7.0里整合的PF代码等同于OpenBSD 4.1的PF代码。