《The BOOK Of PF》中文版 —— 3. 开始使用PF
发表于 : 2010-07-13 8:21
本小节我们将为PF创建一个简单的规则。首先, 我们考虑一个尽可能最简单的情况: 单台主机与一个网络连接。 这个网络很可能是Internet。
你可以用两种方法配置PF,它们是你喜欢的文字编辑器和pfctl命令行管理工具。一般日常管理你需要在/etc/pfctl.conf里编辑你的规则,然后使用pfctl重新载入你的新规则。 pfctl程序还可以实现一些目的,它有很多的选项,我们将在后面的章节讨论这些选项。
你可能很想知道是否可以通过web接口实现对PF的管理工作, 但是它们并不属于基本系统的组件。PF的开发人员并非对这些选择存有敌意, 只不过他们尚未见过可以合理地配置PF的pf.conf以及pfctl命令行的一个可用图形化接口程序。
在OpenBSD上最简单的PF设定
如果你想在系统启动时启用PF, 你需要告诉rc系统启动这个服务。在OpenBSD里, 你只要编辑 /etc/rc.conf.local 这个文件并加上下面这行就可以了(很简单吧):
此外, 你可以指定PF到哪里去找它的配置文件:
在下一次系统启动时, PF将被启用。你可以通过在终端上有无PF enable这条信息来确认其是否已经被启用了。
在正常安装的OpenBSD里都有一个 /etc/pf.conf 文件,
在FreeBSD, NetBSD, 或其它可运行PF的系统上,也包含了一些有用的建议设定, 但是它们全被注释掉了。
事实上,要启用PF你无需重新启动你的计算机, 你只需简单地使用pfctl。而且没有人愿意无缘无故地重新启动自己的机器,键入下列命令可以启用PF:
但是,这个时候我们还没有一个规则集, 也就是说PF什么也没有做。但是,在这里值得一提的是,如果你重新启动你的计算机后, OpenBSD的rc脚本将启用默认的规则集, 事实上,在任何网络接口被启用之前系统先导入这个规则集。默认的规则被设计为当你的网关以一个无效的配置启动时的一个安全保护办法。它允许你的登录并清除那些导致规则集无法加载的语法错误。默认的规则集允许很少一部分基本的服务: 从任何地方ssh登录, 基本的域名解析, 以及NFS挂载。
------------------------------------------------------
注释:
一些PF早期版本的ports启动时并不加载默认的规则集,这也在其它项目的邮件列表上引起过一些争议, 但是在本书出版时它们在启动时已经加载了合适的默认规则集。
在FreeBSD上设置最简单的设定
高质量的代码可以运行在很多平台上, FreeBSD用户也会告诉你任何好的代码迟早会进入FreeBSD, 从FreeBSD 5.2.1以及后期的4.x系列开始, PF以及一些相关工具陆续出现在FreeBSD里。
看起来在FreeBSD的 /etc/rc.conf 里PF的设置要复杂一些, 但也是一些简单的命令。 在FreeBSD 4.x 和 5.x 以及更新的PF版本里这个文件的设置略有不同。请参考FreeBSD的 Handbook, 特别是有关PF的章节 http://www.freebsd.org/doc/
en_US.ISO8859-1/books/handbook/firewalls-pf.html , 这样你可以了解在你的环境中需要进行哪些设置。 在FreeBSD 7.0中的PF版本与OpenBSD 4.1里的版本, 通过查看文件 /etc/defaults/rc.conf , 你将知道默认的PF相关变量如下:
实际上你只需将下面这些设定加入配置文件:
在FreeBSD里, PF被默认编译为一个内核可引导模块。
也就是说你可以在
后通过下面的命令启用PF
pfctl -e命令会产生下面的输出:
假设你已经在/etc/rc.conf里加上了相关的设定, 那么你也可以使用PF的rc脚本来运行它:
将启用PF, 或者用
来禁用PF。PF的rc脚本还支持一些其它的选项。但是这里需要说明的是此时我们还没有加载任何规则集。再强调一下, 因为我们还没有着手编写一个实际应用的规则集, PF此时什么也没干 — 它会放行所有的通讯。
在NetBSD里的最简单设置
在NetBSD 2.0和更新的版本中, 你可以通过packages (security/pflkm)将PF安装为一个可引导内核模块,或者编辑进一个静态内核配置文件。从NetBSD 3.0开始, PF已经成为基本的系统组建。
如果你想在内核配置里启用PF (这里是指不是每次通过调用内核模块), 将下面这几行加入你的内核配置文件:
在/etc/rc.conf里加入
这将依次启用可加载内核模块, PF, 以及PF日志接口。
如果你已经安装了这个模块, 要调用它,先启用PF:
然后
你也可以通过运行rc脚本:
来启用PF,而命令
启用日志记录。
要在启动时自动加载这个模块, 将下行加入/etc/lkm.conf:
如果此时一切正常, 你就可以编写你的第一个PF规则集了。:)
你可以用两种方法配置PF,它们是你喜欢的文字编辑器和pfctl命令行管理工具。一般日常管理你需要在/etc/pfctl.conf里编辑你的规则,然后使用pfctl重新载入你的新规则。 pfctl程序还可以实现一些目的,它有很多的选项,我们将在后面的章节讨论这些选项。
你可能很想知道是否可以通过web接口实现对PF的管理工作, 但是它们并不属于基本系统的组件。PF的开发人员并非对这些选择存有敌意, 只不过他们尚未见过可以合理地配置PF的pf.conf以及pfctl命令行的一个可用图形化接口程序。
使用 SUDO!
当我需要使用某些超级用户的权限时,我倾向于使用sudo。 它是OpenBSD基本系统的一部分,而在其它的操作系统上你也可以通过port或package系统获得它。 如果你还没有使用sudo时, 不要忘了你是用root身份登陆的,以免伤害到系统。
在OpenBSD上最简单的PF设定
如果你想在系统启动时启用PF, 你需要告诉rc系统启动这个服务。在OpenBSD里, 你只要编辑 /etc/rc.conf.local 这个文件并加上下面这行就可以了(很简单吧):
代码: 全选
pf=YES #启用PF
代码: 全选
pf_rules=/etc/pf.conf # 指定你的规则文件
在正常安装的OpenBSD里都有一个 /etc/pf.conf 文件,
在FreeBSD, NetBSD, 或其它可运行PF的系统上,也包含了一些有用的建议设定, 但是它们全被注释掉了。
事实上,要启用PF你无需重新启动你的计算机, 你只需简单地使用pfctl。而且没有人愿意无缘无故地重新启动自己的机器,键入下列命令可以启用PF:
代码: 全选
$ sudo pfctl -e
------------------------------------------------------
注释:
------------------------------------------------------你可以将PF的配置文件设置为其它文件而非默认的 /etc/pf.conf 文件,尽管这样做并不难,但是如果使用默认的配置文件,具有便于系统自动维护的优势, 例如每晚将你的配置备份到 /var/backup。
PFCTL命令行
为了方便, 我们在命令行上使用pfctl来处理一些操作。要启用PF并导入规则,这样:代码: 全选
sudo pfctl -ef /etc/pf.conf
也许有必要再说一遍,如果你重新启动计算机, OpenBSD上的rc脚本将启用一个默认的规则集,这个规则集将在所有网络接口被激活前启用。
一些PF早期版本的ports启动时并不加载默认的规则集,这也在其它项目的邮件列表上引起过一些争议, 但是在本书出版时它们在启动时已经加载了合适的默认规则集。
在FreeBSD上设置最简单的设定
高质量的代码可以运行在很多平台上, FreeBSD用户也会告诉你任何好的代码迟早会进入FreeBSD, 从FreeBSD 5.2.1以及后期的4.x系列开始, PF以及一些相关工具陆续出现在FreeBSD里。
看起来在FreeBSD的 /etc/rc.conf 里PF的设置要复杂一些, 但也是一些简单的命令。 在FreeBSD 4.x 和 5.x 以及更新的PF版本里这个文件的设置略有不同。请参考FreeBSD的 Handbook, 特别是有关PF的章节 http://www.freebsd.org/doc/
en_US.ISO8859-1/books/handbook/firewalls-pf.html , 这样你可以了解在你的环境中需要进行哪些设置。 在FreeBSD 7.0中的PF版本与OpenBSD 4.1里的版本, 通过查看文件 /etc/defaults/rc.conf , 你将知道默认的PF相关变量如下:
代码: 全选
pf_enable="NO" # 设置为 YES 表示启用pf
pf_rules="/etc/pf.conf" # 指定PF的规则定义文件
pf_program="/sbin/pfctl" # 给出pfctl程序的位置
pf_flags="" # pfctl的额外参数
pflog_enable="NO" # 设置为YES将启用PF的日志记录
pflog_logfile="/var/log/pflog" # 设置日志文件的位置
pflog_program="/sbin/pflogd" # 日志记录程序的位置
pflog_flags="" # pflogd的额外参数
pfsync_enable="NO" # 将 pf 状态输出给其它主机以便同步
pfsync_syncdev="" # pfsync的工作接口
pfsync_ifconfig="" # 提供给ifconfig(8)的pfsync额外选项
代码: 全选
pf_enable="YES" # 启用 PF (如果需要加载模块)
pflog_enable="YES" # 启动 pflogd(8)
在FreeBSD里, PF被默认编译为一个内核可引导模块。
也就是说你可以在
代码: 全选
$ sudo pfctl -e
代码: 全选
$ sudo kldload pf
pfctl -e命令会产生下面的输出:
代码: 全选
No ALTQ support in kernel
ALTQ related functions disabled
pf enabled
假设你已经在/etc/rc.conf里加上了相关的设定, 那么你也可以使用PF的rc脚本来运行它:
代码: 全选
$ sudo /etc/rc.d/pf start
代码: 全选
$ sudo /etc/rc.d/pf stop
在NetBSD里的最简单设置
在NetBSD 2.0和更新的版本中, 你可以通过packages (security/pflkm)将PF安装为一个可引导内核模块,或者编辑进一个静态内核配置文件。从NetBSD 3.0开始, PF已经成为基本的系统组建。
如果你想在内核配置里启用PF (这里是指不是每次通过调用内核模块), 将下面这几行加入你的内核配置文件:
代码: 全选
pseudo-device pf # PF packet filter
pseudo-device pflog # PF log interface
代码: 全选
lkm="YES" # do load kernel modules
pf=YES
pflogd=YES
如果你已经安装了这个模块, 要调用它,先启用PF:
代码: 全选
$ sudo pfctl -e
代码: 全选
$ sudo modload /usr/lkm/pf.o
你也可以通过运行rc脚本:
代码: 全选
$ sudo /etc/rc.d/pf start
代码: 全选
$ sudo /etc/rc.d/pflogd start
要在启动时自动加载这个模块, 将下行加入/etc/lkm.conf:
代码: 全选
/usr/lkm/pf.o - - - - AFTERMOUNT
如果此时一切正常, 你就可以编写你的第一个PF规则集了。:)