OpenBSD高性能防火墙系统配置攻略
【IT168 专稿】与其它BSD 和大多数Unix的特点不同,OpenBSD安装了一切功能, 但是禁用了绝对重要的服务。习惯于在Linux安装之后就拥有NFS、Telnet、Finger、FTP和其它功能的用户会发现,必须要具体地启用而不是禁用OpenBSD中的这些服务。OpenBSD采取的这种设计是防止这些功能被意外打开,从而造成潜在的安全突破。
因为 OpenBSD 很小并且很安全,所以 OpenBSD 实现的最常见目标之一是用作防火墙。防火墙从底层对大多数安全单元进行操作,并且 OpenBSD 的包过滤实现是非常优秀的。Packet Filter (PF),OpenBSD 开发社区设计的开放源代码解决方案,它是 OpenBSD 所选择的方法。与 OpenBSD 软件的其他许多部分一样,这种方法非常成功,以至于其他的 BSD 变种纷纷将其移植到自己的分发版中。OpenBSD 配置为缺省安全,所以在设置坚如磐石的防火墙时,您无需关闭过多的服务。您需要启用第二个 Ethernet 接口,并根据需要配置 PF。
一、相关知识点
1. pf
pf是packet filter的缩写,中文翻译为包过滤(以下简称pf),它是openbsd系统上进行tcp/ 流量过滤和网络地址转换(nat)的软件系统。pf同样也能提供tcp/ip流量的整形和控制, 并且提供带宽控制和数据包优先级控制。硬件防火墙能完成的功能它几乎都能胜任,虽然一般只是用它来做nat,但绝不仅仅只能做nat。
2 chap
common access redundancy protocol, 或简称 carp 能够使多台主机共享同一 ip 地址。 在某些配置中,这样做可以提高可用性, 或实现负载均衡。carp 的作用之一是改善服务的可用性。将为三台主机提供故障转移服务,这三台服务器各自有独立的 ip 地址, 并提供完全一样的 web 内容。 三台机器以 dns 轮询的方式提供服务。用于故障转移的机器有两个 carp 接口,分别配置另外两台服务器的 ip 地址。当有服务器发生故障时, 这台机器会自动得到故障机的 ip 地址。 这样以来, 用户就完全感觉不到发生了故障。 故障转移的服务器提供的内容和服务,应与其为之提供热备份的服务器一致。Chap配置典型如下:
两台防火墙之间通过pfsync协议来交换信息,一台防火墙以组播方式发送状态改变报文,对方接收到之后更新自己的状态表。配置典型如下:
# ifconfig pfsync0 syncdev em1
本文要实现的防火墙网络拓扑如图1 。
图1 本文要实现的防火墙网络拓扑
二、nat简单配置简介
网络地址转换是映射整个网络(或者多个网络)到单个ip地址的方法。当你的isp分配给你的ip地址数目少于你要连上互联网的计算机数目时,nat是必需的。nat在rfc1631中描述。
nat允许使用rfc1918中定义的保留地址族。典型情况下,你的内部网络可以下面的地址族:
安装好openbsd系统以后使用pf是个很简单的事情, 只需要在/etc/rc.conf.local里面加入“pf=yes” 一行即可。重启系统让配置生效。
你也可以通过pfctl程序启动和停止pf
pflog_enable="yes" # 启动 pflogd(8)
pflog_logfile="/var/log/pflog" # pflogd 用于记录日志的文件名
openbsd系统安装以后使用pf成为nat的网络环境如图2:
图 2 简单 网络环境
基于openbsd 4.2 的防火墙配置双网卡:fxp0 和fxp1 。fxp0网卡是公网的地址, 接外网出口, fxpl是rfc1918规定的私有地址, 接内网。
配置文件如下:
建立规则文件:
因为要在两个网卡之间路由数据包, 所以需要在/etc/sysctl.conf里加入如下代码:
检查 NAT 状态
要检查活动的NAT转换可以使用pfctl(8)带-s state 选项。这个选项列出所有当前的NAT会话。
# pfctl -s state
三、冗余功能配置
要实现故障冗余功能,至少需要两台机器, 如果客户机器比较多, 可以增加防火墙的机器数量。下面笔者以两台机器为例来做实验,如图3 所示,fxp0网卡是公网地址,接外网出口,fxpl是rfc1918规定的私有地址,接内网。fxp2是私有地址, 用来连接两台机器。
图 2 OpenBSD防火墙的冗余功能配置
在这里要实现的功能为两块fxpl网卡虚拟出一块虚拟网卡做内网的网关, 下面机器网关均设置为该虚拟的网卡地址,当其中一台机器出故障之后,另外一台机器马上代替工作。假设openbsd 1是主防火墙,。
openbsd 1配置如下
pf日志简介
pf的包日志是由pflogd完成的,它通过监听pflog0接口然后将包以tcpdump二进制格式写入日志文件(一般在/val/log/pflog)。过滤规则定义的日志和log-all关键字所定义的日志都是以这种方式记录的。
读取日志文件
由pflogd生成的二进制格式日志文件不能通过文本编辑器读取,必须使用tcpdump来查看日志。
使用如下格式查看日志信息:
# tcpdump -n -e -ttt -r /var/log/pflog
使用tcpdump(8)查看日志文件并不是实时的,若要实时查询日志信息需加上pflog0参数:
# tcpdump -n -e -ttt -i pflog0
通过syslog记录日志
很多情况下需要将防火墙的日志记录以ascii代码格式存储,或者(同时)把这些日志存到远程的日志服务器上。这些可以通过两个小的脚本文件实现,是对openbsd配置文件和syslogd(8),日志守护进程的少许修改。syslogd进程以ascii格式存储日志,同时可以将日志存储到远程日志服务器。 首先我们必须建立一个用户,pflogger,使用 /sbin/nologin shell.最简单的建立用户的方法是使用adduser(8)。
完成后建立如下两个脚本:
# crontab -u root -e
增加如下两行:
# crontab -u pflogger -e
增加如下两行:
将下行增加到 /etc/syslog.conf:
local0.info /var/log/pflog.txt
如果需要日志记录到远程日志服务器,增加:
local0.info @syslogger
确定主机syslogger已在hosts(5)中定义。
建立文件 /var/log/pflog.txt 使 syslog 可以向该文件写入日志:
# touch /var/log/pflog.txt
重启syslogd使变化生效:
# kill -hup $(cat /var/run/syslog.pid)
所有符合标准的包将被写入/var/log/pflog.txt. 如果增加了第二行,这些信息也将被存入远程日志服务器syslogger。
脚本 /etc/pflogrotate 将执行,然后删除 /var/log/pflog ,因此
rotation of pflog by newsyslog(8) 不再必需可以被禁用。然而, /var/log/pflog.txt 替代 /var/log/pflog and rotation of it 要被启用。 改变 /etc/newsyslog.conf 如下:
#/var/log/pflog 600 3 250 * zb /var/run/pflogd.pid
/var/log/pflog.txt 600 7 * 24
pf 将日志以ascii格式记录到/var/log/pflog.txt. 如果这样配置 /etc/syslog.conf, 系统将把日志存到远程服务器。存储过程不会马上发生,但是会在符合条件的包出现在文件中前5-6分钟实现。
总结:本文详细介绍利用两台PC机,在0penBSD系统上架设基于Pfsync和Carp的具有故障冗余功能的防火墙,让网络不中断,并且防火墙可以自己切换。
参考文献:
有关将 OpenBSD 作为防火墙使用的详细信息,请阅读由 Hoang Q. Tran 提供的这个页面上的相关信息。
网络链接:http://www.muine.org/~hoang/openpf.html
Firewall Failover with pfsync and CARP
网络链接:http://www.countersiege.com/doc/pfsync-carp/
Firewalling with OpenBSD's PF packet filter
网络链接: http://home.nuug.no/~peter/pf/en/long-firewall.html
目前国内关于OpenBSD的书籍比较少,介绍pf防火墙的更是寥寥无几,笔者推荐一本:
THE BOOK OF PF:A No-Nonsense Guide to the OpenBSD Firewall
作者:Peter N.M. Hansteen
December 2007, 184 页
ISBN-13 978-1-59327-165-7
图 4 THE BOOK OF PF 封面
因为 OpenBSD 很小并且很安全,所以 OpenBSD 实现的最常见目标之一是用作防火墙。防火墙从底层对大多数安全单元进行操作,并且 OpenBSD 的包过滤实现是非常优秀的。Packet Filter (PF),OpenBSD 开发社区设计的开放源代码解决方案,它是 OpenBSD 所选择的方法。与 OpenBSD 软件的其他许多部分一样,这种方法非常成功,以至于其他的 BSD 变种纷纷将其移植到自己的分发版中。OpenBSD 配置为缺省安全,所以在设置坚如磐石的防火墙时,您无需关闭过多的服务。您需要启用第二个 Ethernet 接口,并根据需要配置 PF。
一、相关知识点
1. pf
pf是packet filter的缩写,中文翻译为包过滤(以下简称pf),它是openbsd系统上进行tcp/ 流量过滤和网络地址转换(nat)的软件系统。pf同样也能提供tcp/ip流量的整形和控制, 并且提供带宽控制和数据包优先级控制。硬件防火墙能完成的功能它几乎都能胜任,虽然一般只是用它来做nat,但绝不仅仅只能做nat。
2 chap
common access redundancy protocol, 或简称 carp 能够使多台主机共享同一 ip 地址。 在某些配置中,这样做可以提高可用性, 或实现负载均衡。carp 的作用之一是改善服务的可用性。将为三台主机提供故障转移服务,这三台服务器各自有独立的 ip 地址, 并提供完全一样的 web 内容。 三台机器以 dns 轮询的方式提供服务。用于故障转移的机器有两个 carp 接口,分别配置另外两台服务器的 ip 地址。当有服务器发生故障时, 这台机器会自动得到故障机的 ip 地址。 这样以来, 用户就完全感觉不到发生了故障。 故障转移的服务器提供的内容和服务,应与其为之提供热备份的服务器一致。Chap配置典型如下:
3 pysync# sysctl -w net.inet.carp.allow=1
# ifconfig carp1 create
# ifconfig carp1 vhid 1 pass mekmitasdigoat carpdev em0 \
advskew 100 10.0.0.1 netmask 255.255.255.0
两台防火墙之间通过pfsync协议来交换信息,一台防火墙以组播方式发送状态改变报文,对方接收到之后更新自己的状态表。配置典型如下:
# ifconfig pfsync0 syncdev em1
本文要实现的防火墙网络拓扑如图1 。

图1 本文要实现的防火墙网络拓扑
二、nat简单配置简介
网络地址转换是映射整个网络(或者多个网络)到单个ip地址的方法。当你的isp分配给你的ip地址数目少于你要连上互联网的计算机数目时,nat是必需的。nat在rfc1631中描述。
nat允许使用rfc1918中定义的保留地址族。典型情况下,你的内部网络可以下面的地址族:
担任nat任务的openbsd系统必须至少要2块网卡,一块连接到因特网,另一块连接内部网络。nat会转换内部网络的所有请求,使它们看起来象是来自进行nat工作的openbsd主机系统。10.0.0.0/8 (10.0.0.0 - 10.255.255.255)
172.16.0.0/12 (172.16.0.0 - 172.31.255.255)
192.168.0.0/16 (192.168.0.0 - 192.168.255.255)
安装好openbsd系统以后使用pf是个很简单的事情, 只需要在/etc/rc.conf.local里面加入“pf=yes” 一行即可。重启系统让配置生效。
你也可以通过pfctl程序启动和停止pf
注意这仅仅是启动和关闭pf,实际它不会载入规则集,规则集要么在系统启动时载入,要么在pf启动后通过命令单独载入。如果要记录日志,需要再加入下面两行:# pfctl -e
# pfctl -d
pflog_enable="yes" # 启动 pflogd(8)
pflog_logfile="/var/log/pflog" # pflogd 用于记录日志的文件名
openbsd系统安装以后使用pf成为nat的网络环境如图2:

图 2 简单 网络环境
基于openbsd 4.2 的防火墙配置双网卡:fxp0 和fxp1 。fxp0网卡是公网的地址, 接外网出口, fxpl是rfc1918规定的私有地址, 接内网。
配置文件如下:
/etc/hostname. fxp0:
inet 10.0.0.254 255.255.255.0 none
/etc/hostname. fxp1:
inet 192.168.0.254 255.255.255.0 none
建立规则文件:
sudo pfctl -ef /etc/pf.conf
文件内容:
####################
# 宏定义
ext_if = " fxp0"
int_if = " fxp1"
localnet = $int_if:network
nat on $ext_if from $int_if:network to any -> $ext_if
pass in quick all keep state
pass out quick all keep state
#####################
因为要在两个网卡之间路由数据包, 所以需要在/etc/sysctl.conf里加入如下代码:
说明:openbsd 有一个在系统引导时执行的配置文件。这使您可以更改运行中的内核,并将这些更改添加到配置文件,以便于在系统重新引导之后,这些更改仍然生效。 该实用程序称为 sysctl ,在 sysctl(8) 的联机帮助页中,对这个实用程序进行了完整的文档说明。 sysctl 的配置文件是 /etc/sysctl.conf 。这些行是本来就存在的,但默认安装中被#前缀注释掉了。删除#,保存文件,IP转发在机器重启后就会发生作用。net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
检查 NAT 状态
要检查活动的NAT转换可以使用pfctl(8)带-s state 选项。这个选项列出所有当前的NAT会话。
# pfctl -s state
三、冗余功能配置
要实现故障冗余功能,至少需要两台机器, 如果客户机器比较多, 可以增加防火墙的机器数量。下面笔者以两台机器为例来做实验,如图3 所示,fxp0网卡是公网地址,接外网出口,fxpl是rfc1918规定的私有地址,接内网。fxp2是私有地址, 用来连接两台机器。

图 2 OpenBSD防火墙的冗余功能配置
在这里要实现的功能为两块fxpl网卡虚拟出一块虚拟网卡做内网的网关, 下面机器网关均设置为该虚拟的网卡地址,当其中一台机器出故障之后,另外一台机器马上代替工作。假设openbsd 1是主防火墙,。
openbsd 1配置如下
四、关注防火墙日志 openbsd 2配置如下:/etc/hostname.fxp0:
inet 10.0.0.254 255.255.255.0 none
/etc/hostname.fxp1:
inet 192.168.0.254 255.255.255.0 none
/etc/hostname.fxp2:
inet 192.168.254.254 255.255.255.0 none
/etc/hostname.carp0:
inet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 pass foo
/etc/hostname.carp1:
inet 192.168.0.1 255.255.255.0 192.168.0.255 vhid 2 pass bar
/etc/hostname.pfsync0:
up syncif fxp2
/etc/hostname.carp0:
inet 10.0.0.1 255.255.255.0 10.0.0.255 vhid 1 advskew 100 pass foo
/etc/hostname.carp1:
inet 192.168.0.1 255.255.255.0 192.168.0.255 vhid 2 advskew 100 pass bar
因为要在两个网卡之间路由数据包, 所以需要在/etc/sysctl.conf里加入如下代码:
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
net.inet.carp.preempt=1
建立规则文件:
sudo pfctl -ef /etc/pf.conf
文件内容:
#######################
# macro definitions
ext_if = " fxp0"
int_if = " fxp1"
localnet = $int_if:network
nat on $ext_if from $int_if:network to any -> $ext_if
pass quick on { $sync_if } proto pfsync
pass on { $ext_if $int_if } proto carp keep state
pass in quick all keep state
pass out quick all keep state
########################
# macro definitions
pf日志简介
pf的包日志是由pflogd完成的,它通过监听pflog0接口然后将包以tcpdump二进制格式写入日志文件(一般在/val/log/pflog)。过滤规则定义的日志和log-all关键字所定义的日志都是以这种方式记录的。
读取日志文件
由pflogd生成的二进制格式日志文件不能通过文本编辑器读取,必须使用tcpdump来查看日志。
使用如下格式查看日志信息:
# tcpdump -n -e -ttt -r /var/log/pflog
使用tcpdump(8)查看日志文件并不是实时的,若要实时查询日志信息需加上pflog0参数:
# tcpdump -n -e -ttt -i pflog0
通过syslog记录日志
很多情况下需要将防火墙的日志记录以ascii代码格式存储,或者(同时)把这些日志存到远程的日志服务器上。这些可以通过两个小的脚本文件实现,是对openbsd配置文件和syslogd(8),日志守护进程的少许修改。syslogd进程以ascii格式存储日志,同时可以将日志存储到远程日志服务器。 首先我们必须建立一个用户,pflogger,使用 /sbin/nologin shell.最简单的建立用户的方法是使用adduser(8)。
完成后建立如下两个脚本:
编辑root的cron 任务:/etc/pflogrotate
file=/home/pflogger/pflog5min.$(date " %y%m%d%h%m")
kill -alrm $(cat /var/run/pflogd.pid)
if [ $(ls -l /var/log/pflog | cut -d " " -f 8) -gt 24 ]; then
mv /var/log/pflog $file
chown pflogger $file
kill -hup $(cat /var/run/pflogd.pid)
fi
/home/pflogger/pfl2sysl
for logfile in /home/pflogger/pflog5min* ; do
tcpdump -n -e -ttt -r $logfile | logger -t pf -p local0.info
rm $logfile
done
# crontab -u root -e
增加如下两行:
为用户pflogger建立一个cron任务:# rotate pf log file every 5 minutes
0-59/5 * * * * /bin/sh /etc/pflogrotate
# crontab -u pflogger -e
增加如下两行:
将下行增加到 /etc/syslog.conf:
local0.info /var/log/pflog.txt
如果需要日志记录到远程日志服务器,增加:
local0.info @syslogger
确定主机syslogger已在hosts(5)中定义。
建立文件 /var/log/pflog.txt 使 syslog 可以向该文件写入日志:
# touch /var/log/pflog.txt
重启syslogd使变化生效:
# kill -hup $(cat /var/run/syslog.pid)
所有符合标准的包将被写入/var/log/pflog.txt. 如果增加了第二行,这些信息也将被存入远程日志服务器syslogger。
脚本 /etc/pflogrotate 将执行,然后删除 /var/log/pflog ,因此
rotation of pflog by newsyslog(8) 不再必需可以被禁用。然而, /var/log/pflog.txt 替代 /var/log/pflog and rotation of it 要被启用。 改变 /etc/newsyslog.conf 如下:
#/var/log/pflog 600 3 250 * zb /var/run/pflogd.pid
/var/log/pflog.txt 600 7 * 24
pf 将日志以ascii格式记录到/var/log/pflog.txt. 如果这样配置 /etc/syslog.conf, 系统将把日志存到远程服务器。存储过程不会马上发生,但是会在符合条件的包出现在文件中前5-6分钟实现。
总结:本文详细介绍利用两台PC机,在0penBSD系统上架设基于Pfsync和Carp的具有故障冗余功能的防火墙,让网络不中断,并且防火墙可以自己切换。
参考文献:
有关将 OpenBSD 作为防火墙使用的详细信息,请阅读由 Hoang Q. Tran 提供的这个页面上的相关信息。
网络链接:http://www.muine.org/~hoang/openpf.html
Firewall Failover with pfsync and CARP
网络链接:http://www.countersiege.com/doc/pfsync-carp/
Firewalling with OpenBSD's PF packet filter
网络链接: http://home.nuug.no/~peter/pf/en/long-firewall.html
目前国内关于OpenBSD的书籍比较少,介绍pf防火墙的更是寥寥无几,笔者推荐一本:
THE BOOK OF PF:A No-Nonsense Guide to the OpenBSD Firewall
作者:Peter N.M. Hansteen
December 2007, 184 页
ISBN-13 978-1-59327-165-7

图 4 THE BOOK OF PF 封面
0
相关文章