在网上未找到关于NPF的中文文档,还好有英文的。完成此文主要参考了下面两篇文档:
- NPF documentation 网址:http://www.netbsd.org/~rmind/npf/
- man npf.conf


1,需求
   除了允许openvpn用户端发起的vpn会话,其它所有的会话都被禁止。注:我的openvpn server只有一个物理网卡,我只需要VPN用户端与server端通信即可,很简单的架构。

2,编辑npf.conf
    创建/etc/npf.conf文档,可以参照/usr/share/examples/npf目录下的文档内容来创建,或者man npf.conf。

   下面贴出我的配置文件:

# 这是一种定义方法,这里定义的是物理网卡
$pub_if = "wm0"
$pub_v4 = { inet4(wm0) }

# 这是另一种定义方法,这里定义的是openvpn的TUN设备
$openvpn_if = { inet4(tun0) }


group (name "test", interface $pub_if) {
        block all
        # allow openvpn incoming from anywhere with stateful
        pass stateful in final family inet4 proto udp to $pub_v4 port 1194
        # allow ssh incoming from A.B.C.D with stateful - 这里指定一台公网上的特定电脑可以通过SSH访问openvpn server,以便应急使用
        pass stateful in final family inet4 proto tcp flags S/SA from A.B.C.D to $pub_v4 port ssh
}

# 这里允许openvpn隧道内的会话
group (name "openvpn", interface $openvpn_if) {
        # allow all session within openvpn tunnel
        pass all
}

group (default) {
        pass final on lo0 all
        block all
}

3,启动NPF
     这里照抄文档:
     srv# echo 'npf=YES' >> /etc/rc.conf
     srv# /etc/rc.d/npf reload
     Reloading NPF ruleset.
     srv# /etc/rc.d/npf start
     Enabling NPF.

     如修改了npf.conf文件,要想生效,只需:/etc/rc.d/npf reload 然后 npfctl start 即可。
    查看npf的简单状态,npfctl show 和 npfctl stats 命令。
12-08 11:45