语法

action direction [log] [quick] on interface [af] [proto protocol] \ from src_addr [port src_port] to dst_addr [port dst_port] \ [tcp_flags] [state]

action

数据包匹配规则时执行的动作,放行或者阻塞。放行动作把数据包传递给核心进行进一步出来,阻塞动作根据block-policy 选项指定的方法进行处理。默认的动作可以修改为阻塞丢弃或者阻塞返回。

direction

数据包传递的方向,进或者出

log

指定数据包被pflogd( 进行日志记录。如果规则指定了keep state, modulate state, or synproxy state 选项,则只有建立了连接的状态被日志。要记录所有的日志,使用log-all

quick

如果数据包匹配的规则指定了quick关键字,则这条规则被认为时最终的匹配规则,指定的动作会立即执行。

interface

数据包通过的网络接口的名称或组。组是接口的名称但没有最后的整数。比如ppp或fxp,会使得规则分别匹配任何ppp或者fxp接口上的任意数据包。

af

数据包的地址类型,inet代表Ipv4inet6代表Ipv6。通常PF能够根据源或者目标地址自动确定这个参数。

protocol

数据包的4层协议: tcp udp icmp icmp6

/etc/protocols中的协议名称 0~255之间的协议号 使用列表的一系列协议.

src_addr, dst_addr

IP头中的源/目标地址。

地址可以指定为: 单个的Ipv4或者Ipv6地址. CIDR 网络地址. 能够在规则集载入时通过DNS解析到的合法的域名,IP地址会替代规则中的域名。

  1. 网络接口名称。网络接口上配置的所有ip地址会替代进规则中。
  2. 带有/掩码(例如/24)的网络接口的名称。
  3. 每个根据掩码确定的CIDR网络地址都会被替代进规则中。.
  4. 带有()的网络接口名称。

这告诉PF如果网络接口的IP地址改变了,就更新规则集。这个对于使用DHCP或者拨号来获得IP地址的接口特别有用,IP地址改变时不需要重新载入规则集。

带有如下的修饰词的网络接口名称: + :network - 替代CIDR网络地址段 (例如:192.168.0.0/24) + :broadcast - 替代网络广播地址(例如:192.168.0.255) + :peer - 替代点到点链路上的ip地址。

另外,:0修饰词可以附加到接口名称或者上面的修饰词后面指示PF在替代时不包括网络接口的其余附加(alias)地址。这些修饰词也可以在接口名称在括号()内时使用。

例如:fxp0:network:0

表. 上面的所有项但使用!(非)修饰词

使用列表的一系列地址.

  1. 关键字 any 代表所有地址
  2. 关键字 allfrom any to any的缩写。

src_port, dst_port

4层数据包头中的源/目标端口。

端口可以指定为: 1 到 65535之间的整数

/etc/services中的合法服务名称 使用列表的一系列端口

一个范围:

  • != (不等于)
  • (大于)
  • = (大于等于)
  • (反转范围)

最后2个是二元操作符(他们需要2个参数),在范围内不包括参数。

  • : (inclusive range)

    inclusive range 也是二元操作符但范围内包括参数。

tcp_flags

指定使用TCP协议时TCP头中必须设定的标记。

标记指定的格式是: flags check/mask. 例如: flags S/SA -这指引PF只检查S和A(SYN and ACK)标记,如果SYN标记是“on”则匹配。

state

指定状态信息在规则匹配时是否保持。 keep state - 对 TCP, UDP, ICMP起作用 modulate state - 只对 TCP起作用. PF会为匹配规则的数据包产生强壮的初始化序列号。 synproxy state - 代理外来的TCP连接以保护服务器不受TCP SYN FLOODs欺骗。 这个选项包含了keep state 和 modulate state 的功能