免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: minok
打印 上一主题 下一主题

菜鸟100问 [复制链接]

论坛徽章:
0
101 [报告]
发表于 2006-12-08 17:34 |只看该作者

论坛徽章:
0
102 [报告]
发表于 2006-12-09 06:34 |只看该作者

PF学习笔记

以下是我的PF学习笔记, 修剪了部分语句并精简化, 打造了自己的PF中文手册, 分享给大家作个参考, 一切皆以pf中文手册为准.

------------------------------------------------------------------------------
目录

* 基本配置
+ 开始
+ 列表和宏
+ 表
+ 包过滤
+ 网络地址转换
+ 流量重定向 (端口转发)
+ 规则生成捷径
* 高级配置
+ 运行选项
+ 流量整形 (数据包标准化)
+ 锚定和命名(子)规则集
+ 队列和优先级
+ 地址池和负载均衡
+ 数据包标记
* 附加主题
+ 日志
+ 性能
+ 研究 FTP
+ pf验证: 用Shell 进行网关验证
* 实例规则集
+ 实例: 家庭和小办公室防火墙

------------------------------------------------------------------------------

论坛徽章:
0
103 [报告]
发表于 2006-12-09 06:45 |只看该作者

基本配置

防火墙技术:
PF:OpenBSD数据包过滤

新杂人 修译
本文内容与原文pf中文手册不完全一致,鉴于本人水平有限,错误之处难免,请读者自己认真鉴别。
------------------------------------------------------------------------------

包过滤 (以下简称 PF) 是TCP/IP流量过滤和网络地址转换的软件系统。 PF也能提供TCP/IP流量的整形和控制,并且提供带宽控制和数据包优先集控制。PF作为内核的默认安装配置。

PF: 开始

------------------------------------------------------------------------------
激活

开机启动PF,编辑/etc/rc.conf文件,修改配置pf的一行:

pf=YES

重启系统让配置生效。

你也可以通过pfctl程序启动和停止pf

# pfctl -e
# pfctl -d

这只是启动和关闭PF,但不会载入规则集,规则集要么在系统启动时载入,要么在PF启动后通过命令单独载入。

配置

运行PF时从/etc/pf.conf文件载入配置规则。注意当/etc/pf.conf是默认配置文件,它仅仅是作为文本文件由pfctl(8)装入并解释和插入pf(4)的。对于一些应用来说,其他的规则集可以在系统引导后由其他文件载入。

pf.conf 文件有7个部分:

* 宏:用户定义的变量,包括IP地址,接口名称等等
* 表: 一种用来保存IP地址列表的结构
* 选项: 控制PF如何工作的变量
* 整形: 重新处理数据包,进行正常化和碎片整理
* 排队: 提供带宽控制和数据包优先级控制.
* 转换: 控制网络地址转换和数据包重定向.
* 过滤规则: 在数据包通过接口时允许进行选择性的过滤和阻止

除去宏和表,其他的段在配置文件中也应该按照这个顺序出现,尽管对于一些特定的应用并不是所有的段都是必须的。

空行会被忽略,以#开头的行被认为是注释.

控制

引导之后,PF可以通过pfctl(8)程序进行操作,以下是一些例子:

# pfctl -f /etc/pf.conf 载入 pf.conf 文件
# pfctl -nf /etc/pf.conf 解析文件,但不载入
# pfctl -Nf /etc/pf.conf 只载入文件中的NAT规则
# pfctl -Rf /etc/pf.conf 只载入文件中的过滤规则

# pfctl -sn 显示当前的NAT规则
# pfctl -sr 显示当前的过滤规则
# pfctl -ss 显示当前的状态表
# pfctl -si 显示过滤状态和计数
# pfctl -sa 显示任何可显示的

完整的命令列表,参阅pfctl的man手册页。

论坛徽章:
0
104 [报告]
发表于 2006-12-09 07:00 |只看该作者

基本配置

PF: 列表和宏
------------------------------------------------------------------------------
列表

一个列表允许一个规则集指定多个相似的标准。列表的定义是将要指定的条目放在{ }大括号中。

block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any         #规则集碰到列表时,
产生多个规则:
block out on fxp0 from 192.168.0.1 to any         #每条规则对应于列表中的一个条目。
block out on fxp0 from 10.5.32.6 to any



宏是用户定义变量用来指定IP地址,端口号,接口名称等等。宏名称不能包括保留关键字如:
pass, out, 以及 queue.

ext_if = "fxp0"

block in on $ext_if from any to any

这生成了一个宏名称为 ext_if. 被引用时,名称前面以$字符开头。
宏也可以展开成列表,如:
friends = "{ 192.168.1.1, 10.0.2.5, 192.168.43.53 }"

宏能够被重复定义,不能在引号内被扩展,必须使用下面的语法:

host1 = "192.168.1.1"
host2 = "192.168.1.2"
all_hosts = "{" $host1 $host2 "}"

宏 $all_hosts 现在会展开成 192.168.1.1, 192.168.1.2.

论坛徽章:
0
105 [报告]
发表于 2006-12-09 07:09 |只看该作者

基本配置

PF: 表
------------------------------------------------------------------------------

简介

表是用来保存一组IPv4 或者 IPv6地址。比列表消耗更少的内存,表是保存大量地址的最好方法,
表可以用于下列用途:

* 过滤,整形,NAT和重定向中的源或者目的地址.
* NAT规则中的转换地址.
* 重定向规则中的重定向地址.
* 过滤规则选项中 route-to, reply-to, 和 dup-to的目的地址.

配置

在 pf.conf文件中, 表是使用table关键字创建出来的。下面的关键字必须在创建表时指定。
* constant - 这类表的内容一旦创建出来就不能被改变。
* persist - 即使没有规则引用这类表,内核也会把它保留在内存中。
实例:

table <goodguys> { 192.0.2.0/24 }
table <rfc1918> const { 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8 }
table <spammers> persist

block in on fxp0 from { <rfc1918>, <spammers> } to any
pass in on fxp0 from <goodguys> to any

地址也可以用“非”来进行修改,如:

table <goodguys> { 192.0.2.0/24, !192.0.2.5 }

goodguys表将匹配除192.0.2.5外192.0.2.0/24网段得所有地址。

注意表名总是在<>符号的里面。

表也可以由包含IP地址和网络地址的文本文件中输入:

table <spammers> persist file "/etc/spammers"

block in on fxp0 from <spammers> to any

文件 /etc/spammers 应该包含被阻塞的IP地址或者CIDR网络地址,每个条目一行。以#开头的行被认为是注释

会被忽略。  

用 pfctl 进行操作  

表可以使用pfctl(8)进行灵活的操作。例如,在上面产生的表中增加条目可以这样写:

# pfctl -t spammers -T add 218.70.0.0/16

如果这个表不存在,这样会创建出这个表来。列出表中的内容可以这样:

# pfctl -t spammers -T show

-v 参数也可以使用-Tshow 来显示每个表的条目内容统计。要从表中删除条目,可以这样:

# pfctl -t spammers -T delete 218.70.0.0/16

更多使用pfctl操作的信息可以参阅pfctl(8)。

指定地址

除了使用IP地址来指定主机外,也可以使用主机名。 ^-^  (参见pf中文手册)

地址匹配

表中的地址查询会匹配最接近的规则,比如:

table <goodguys> { 172.16.0.0/16, !172.16.1.0/24, 172.16.1.100 }

block in on dc0 all
pass in on dc0 from <goodguys> to any

任何自dc0上数据包都会把它的源地址和goodguys表中的地址进行匹配:

* 172.16.50.5 - 精确匹配172.16.0.0/16; 数据包符合可以通过
* 172.16.1.25 - 精确匹配!172.16.1.0/24; 数据包匹配表中的一条规则,但规则是“非”(使用“!”进行了修改);数据包不匹配表会被阻塞。
* 172.16.1.100 - 准确匹配172.16.1.100; 数据包匹配表,运行通过
* 10.1.4.55 - 不匹配表,阻塞。

论坛徽章:
0
106 [报告]
发表于 2006-12-09 07:32 |只看该作者

基本配置

PF: 包过滤
------------------------------------------------------------------------------
简介

包过滤是在数据包通过网络接口时进行选择性的运行通过或者阻塞。
标准是源地址和目的地址,源端口和目的端口,以及协议。
过滤规则集指定了数据包在匹配时通过或者阻塞。
规则集由开始到结束顺序执行。除非规则包含 quick关键字,否则数据包在执行前会被检验。
如果数据包和规则集里的所有规则都不匹配,则它会被通过。

规则语法

一般而言,最简单的过滤规则语法是这样的:

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
数据包的动作,放行动作或者阻塞动作。
direction
数据包传递的方向,进或者出
log
指定数据包被pflogd(进行日志记录)。要记录所有的日志,使用log-all
quick
关键字,这条规则被认为最终的匹配规则,指定的动作会立即执行。
interface
数据包通过的网络接口的名称或组。组是接口的名称但没有最后的整数。比如ppp,会使得规则匹配任何ppp接口上的任意数据包。
af
数据包的地址类型,inet代表Ipv4,inet6代表Ipv6。通常PF能够自动确定这个参数。
protocol
数据包的4层协议:  ^-^  (参见pf中文手册)
src_addr, dst_addr    ^-^  (参见pf中文手册)
IP头中的源/目标地址。
src_port, dst_port    ^-^  (参见pf中文手册)
4层数据包头中的源/目标端口。
tcp_flags
指定使用TCP协议时TCP头中必须设定的标记。例如: flags S/SA -这指引PF只检查S和A(SYN and ACK)标记,如果SYN标记是“on”则匹配。
state
状态信息匹配时是否保持。
+ keep state - 对 TCP, UDP, ICMP起作用
+ modulate state - 只对 TCP起作用
+ synproxy state - 代理

默认拒绝
先拒绝所有,然后有选择的允许某些通过防火墙。
默认拒绝的过滤规则,开始2行必须是:
block in all
block out all
这会阻塞所有流量(包括任何协议,源/目的地址,任意接口)。

通过流量

流量必须被明确的允许通过或丢弃。也只有已经设计好的流量可以被允许通过。
实例:

# 允许本地网络192.168.0.0/24流量通过dc0接口进入,访问openbsd机器的192.168.0.1地址,
# 同时也允许返回的数据包从dc0接口出去。
pass in on dc0 from 192.168.0.0/24 to 192.168.0.1
pass out on dc0 from 192.168.0.1 to 192.168.0.0/24

quick 关键字
规则指定的动作马上执行。例子:

错误:
block in on fxp0 proto tcp from any to any port ssh
pass in all
在这样的条件下,block行会被检测,但永远也不会有效果,因为它后面的一行允许所有的流量通过。

正确:
block in quick on fxp0 proto tcp from any to any port ssh
pass in all
这个block行被匹配,由于quick选项的原因,数据包会被阻塞,而且剩下的规则也会被忽略。


状态规则

状态检测指PF跟踪或者处理网络连接状态的能力。
状态保持指通过存贮连接的信息到一个状态表中,确定一个通过防火墙的数据包是否属于已经建立的连接。如果是,它会直接通过防火墙而不用再进行规则检验。这样PF用于处理这些数据包的时间大为减少。大幅度提高防火墙的性能。

当一条规则使用了keep state选项,第一个匹配这条规则的数据包在收发双方之间建立了一个状态。现在,不仅发送者到接收者之间跟据这个状态绕过规则检验,而且接收者回复发送者的数据包也是同样的。例如:
pass out on fxp0 proto tcp from any to any keep state
这允许fxp0接口上的任何TCP流量通过,并且允许返回的流量通过防火墙。

状态调整选项,输入连接的初始化序列号(ISN)是随机的,这对于保护某些选择ISN存在问题的操作系统的连接初始化非常有用。

对输出的TCP, UDP, ICMP数据包保持状态,并且调整TCP ISN。

pass out on fxp0 proto { tcp, udp, icmp } from any \
to any modulate state
状态保持的另一个优点是ICMP通信流量可以直接通过防火墙。例如,如果一个TCP连接使用了状态保持,当和这个TCP连接相关的ICMP数据包到来时,它会自动找到合适的状态记录,直接通过防火墙。

状态记录的范围被state-policy runtime选项总体控制,也能基于单条规则由if-bound, group-bound, 和 floating state选项关键字设定。例如:

pass out on fxp0 proto { tcp, udp, icmp } from any \
to any modulate state (if-bound)
为了使数据包匹配状态条目,它们必须通过fxp0网络接口传递。
需要注意的是,nat,binat,rdr规则隐含在过滤规则集审核中产生匹配连接的状态。

UDP状态保持
UDP是无状态的协议。对于没有开始和结束数据包的协议,PF仅简单追踪匹配的数据部通过的时间。如果到达超时限制,状态被清除,超时的时间值可以pf.conf配置文件中设定。

TCP 标记

经常被用于过滤试图打开新连接的TCP数据包。TCP标记和他们的意义如下所列:

* F : FIN - 结束; 结束会话
* S : SYN - 同步; 表示开始会话请求
* R : RST - 复位;中断一个连接
* P : PUSH - 推送; 数据包立即发送
* A : ACK - 应答
* U : URG - 紧急
* E : ECE - 显式拥塞提醒回应
* W : CWR - 拥塞窗口减少

要使PF检查TCP标记,flag关键需按如下语法设置。

flags check/mask

mask部分告诉PF仅检查指定的标记,check部分说明在数据包头中哪个标记设置为“on”才算匹配。

pass in on fxp0 proto tcp from any to any port ssh flags S/SA

带SYN标记的TCP流量仅查看SYN和ACK标记。带有SYN和ECE标记的数据包会匹配上面的规则,而带有SYN和ACK的数据包或者仅带有ACK的数据包不会匹配。

标记常常和状态保持规则联合使用,来控制创建状态条目:

pass out on fxp0 proto tcp all flags S/SA keep state

为所有输出带SYN和ACK标记的数据包中,仅带有SYN标记的TCP数据包创建状态。
一些人建议创建状态“只有当SYN标记设定而没有其他标记”时,这样的规则如下:
. . . flags S/FSRPAUEW 糟糕的主意!!

这个理论是,仅为TCP开始会话时创建状态,会话以SYN标记开始,而没有其他标记。问题在于一些站点使用ECN标记开始会话,而任何使用ECN连接你的会话都会被那样的规则拒绝。比较好的规则是:

. . . flags S/SAFR

这个经过实践是安全的,如果流量进行了整形就没有必要检查FIN和RST标记。整形过程会让PF丢弃带有非法TCP

标记的进入数据包(例如SYN和FIN以及SYN和RST)。强烈推荐总是进行流量整形:

scrub in on fxp0
.
.
.
pass in on fxp0 proto tcp from any to any port ssh flags S/SA \
keep state

TCP SYN 代理

当客户端向服务器初始化一个TCP连接时,PF会在二者直接传递"握手数据包"。这就是代理握手。使用代理握手,PF自动和客户端完成握手,初始化和服务器的握手,然后在二者之间传递数据。这样做的优点是在客户端完成握手之前,没有数据包到达服务器。这样就消沉了TCP SYN FLOOD欺骗影响服务器的问题,因为进行欺骗的客户端不会完成握手。

TCP SYN 代理在规则中使用synproxy state关键字打开。例如:

pass in on $ext_if proto tcp from any to $web_server port www \
flags S/SA synproxy state

这样, web服务器的连接由PF进行TCP代理。它具有keep state 和 modulate state一样的功能。

如果PF工作在桥模式下,SYN代理不会起作用。

阻塞欺骗数据包

地址欺骗是传递的数据包使用虚假地址。他们可以隐蔽真实地址实施网络攻击。

PF通过antispoof关键字提供一些防止地址欺骗的保护。

antispoof [log] [quick] for interface [af]

log
指定匹配的数据包应该被pflogd(8)进行日志记录
quick
如果数据包匹配这条规则,则这是最终的规则,不再进行其他规则集的检查。
interface
激活要进行欺骗保护的网络接口。也可以是接口的列表。
af
激活进行欺骗保护的地址族,inet代表Ipv4,inet6代表Ipv6。

实例:

antispoof for fxp0 inet

任何出现了antispoof关键字的规则都会扩展成2条规则。假定接口fxp0具有ip地址10.0.0.1和子网掩码

255.255.255.0(或者/24),上面的规则会扩展成:

block in on ! fxp0 inet from 10.0.0.0/24 to any
block in inet from 10.0.0.1 to any

这些规则实现下面的2个目的:
* 阻塞任何不是由fxp0接口进入的10.0.0.0/24网络的流量。
* 阻塞任何由10.0.0.1即fxp0接口的IP地址的进入流量。
注意:扩展出来的过滤规则会阻塞loopback接口上发送到本地地址的数据包。这些数据包应该明确的配置为允许通过。例如:

pass quick on lo0 all

antispoof for fxp0 inet

使用antispoof应该仅限于已经分配了IP地址的网络接口,不要在没有分配IP地址的网络接口上使用。

被动操作系统识别

通过基于远端主机TCP SYN数据包中某些特征,进行操作系统被动检测的技术。这些信息可以作为标准在过滤规则中使用。

PF检测远端操作系统,是通过比较TCP SYN数据包中的特征和已知的特征文件对照来确定的,特征文件默认是/etc/pf.os。如果PF起作用,可使用下面的命令查看当前的特征列表。

# pfctl -s osfp

在规则集中,特征可以指定为OS类型,版本,或者子类型/补丁级别。这些条目在上面的pfctl命令中有列表。

要在过滤规则中指定特征,需使用os关键字:

pass in on $ext_if any os OpenBSD keep state
block in on $ext_if any os "Windows 2000"
block in on $ext_if any os "Linux 2.4 ts"
block in on $ext_if any os unknown

系统类型unknow允许匹配操作系统未知的数据包。

注意以下的内容::

*操作系统识别偶尔会出错
* 某些操作系统和特征文件不符,或者符合了另外的操作系统特征。
* OSFP 仅对TCP SYN数据包起作用,它不会对其他协议或者已经建立的连接起作用。

IP 选项

默认情况下,带有IP选项的数据包会被阻塞。使得类似nmap的操作系统识别软件工作困难。如果你的应用程序需要通过这样的数据包,例如多播或者IGMP,你可以使用allow-opts关键字。。

pass in quick on fxp0 all allow-opts

过滤规则实例

下面是过滤规则得实例。运行PF的机器充当防火墙,在一个小的内部网络和因特网之间。只列出了过滤规则,

queueing, nat, rdr,等等没有在实例中列出。


ext_if = "fxp0"
int_if = "dc0"
lan_net = "192.168.0.0/24"

# scrub incoming packets
scrub in all

# setup a default deny policy
block in all
block out all

# pass traffic on the loopback interface in either direction
pass quick on lo0 all

# activate spoofing protection for the internal interface.
antispoof quick for $int_if inet

# only allow ssh connections from the local network if it‘s from the
# trusted computer, 192.168.0.15. use "block return" so that a TCP RST is
# sent to close blocked connections right away. use "quick" so that this
# rule is not overridden by the "pass" rules below.
block return in quick on $int_if proto tcp from ! 192.168.0.15 \
to $int_if port ssh flags S/SA

# pass all traffic to and from the local network
pass in on $int_if from $lan_net to any
pass out on $int_if from any to $lan_net

# pass tcp, udp, and icmp out on the external (Internet) interface.
# keep state on udp and icmp and modulate state on tcp.
pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state

# allow ssh connections in on the external interface as long as they‘re
# NOT destined for the firewall (i.e., they‘re destined for a machine on
# the local network). log the initial packet so that we can later tell
# who is trying to connect. use the tcp syn proxy to proxy the connection.
pass in log on $ext_if proto tcp from any to { !$ext_if, !$int_if } \
port ssh flags S/SA synproxy state

论坛徽章:
0
107 [报告]
发表于 2006-12-09 07:39 |只看该作者

基本配置

PF: 网络地址转换(NAT)

------------------------------------------------------------------------------
简介

网络地址转换是映射整个网络(或者多个网络)到单个IP地址的方法。
^-^  (参见pf中文手册)
^-^
==============================================================================

论坛徽章:
0
108 [报告]
发表于 2006-12-09 07:41 |只看该作者

基本配置

PF: 重定向 (端口转发)

------------------------------------------------------------------------------
简介

如果在办公地点应用了NAT,内部网所有的机器都可以访问因特网。
^-^  (参见pf中文手册)
^-^
==============================================================================

论坛徽章:
0
109 [报告]
发表于 2006-12-09 07:48 |只看该作者

基本配置

PF: 规则生成捷径

------------------------------------------------------------------------------
简介

PF提供了许多方法来进行规则集的简化。规则集越简单,就越容易理解和维护。

使用宏

宏是非常有用的,因为它提供了硬编码地址,端口号,接口名称等的可选替代。在一个规则集中,服务器的IP地址改变了?没问题,仅仅更新一下宏,不需要弄乱你花费了大量时间和精力建立的规则集。

通常的惯例是在PF规则集中定义每个网络接口的宏。如果网卡被另一网卡取代,例如,用intel代替3com,可以更新宏,过滤规则集会和以 前功能一样。另一个优点是,如果在多台机器上安装同样的规则集,某些机器会有不同的网卡,使用宏定义网卡可以使的安装的规则集进行最少的修改。
# define macros for each network interface
IntIF = "dc0"
ExtIF = "fxp0"
DmzIF = "fxp1"

另一个惯例是使用宏来定义IP地址和网络,这可以大大减轻在IP地址改变时对规则集的维护。

# define our networks
IntNet = "192.168.0.0/24"
ExtAdd = "24.65.13.4"
DmzNet = "10.0.0.0/24"

如果内部地址扩展了或者改到了一个不同的IP段,可以更新宏为:

IntNet = "{ 192.168.0.0/24, 192.168.1.0/24 }"

当这个规则集重新载入时,任何东西都跟以前一样。

使用列表

这例子使得RFC1918定义的内部地址不会传送到因特网上,如果发生传送的事情,可能导致问题。

例(1)
block in quick on tl0 inet from 127.0.0.0/8 to any
block in quick on tl0 inet from 192.168.0.0/16 to any
block in quick on tl0 inet from 172.16.0.0/12 to any
block in quick on tl0 inet from 10.0.0.0/8 to any
block out quick on tl0 inet from any to 127.0.0.0/8
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 10.0.0.0/8

例(2)
block in quick on tl0 inet from { 127.0.0.0/8, 192.168.0.0/16, \
172.16.0.0/12, 10.0.0.0/8 } to any
block out quick on tl0 inet from any to { 127.0.0.0/8, \
192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }

这个规则集从8行减少到2行。如果联合使用宏,还会变得更好:

例(3)
NoRouteIPs = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8 }"
ExtIF = "tl0"
block in quick on $ExtIF from $NoRouteIPs to any
block out quick on $ExtIF from any to $NoRouteIPs

注意虽然宏和列表简化了pf.conf文件,但是实际是这些行会被pfctl(8)扩展成多行,因此,上面的例(2),例(3)实际扩展成例(1): 可以看到,PF扩展仅仅是简化了编写和维护pf.conf文件,实际并不简化pf(4)对于规则的处理过程。

宏不仅仅用来定义地址和端口,它们在PF的规则文件中到处都可以用:

pre = "pass in quick on ep0 inet proto tcp from "
post = "to any port { 80, 6667 } keep state"

# David‘s classroom
$pre 21.14.24.80 $post

# Nick‘s home
$pre 24.2.74.79 $post
$pre 24.2.74.178 $post

扩展后:

pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
port = 80 keep state
pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
port = 6667 keep state

PF 语法

PF能够自动插入某些关键字而不必在规则中明确写出,关键字的顺序也是随意的。

减少关键字

要定义全部拒绝的策略,使用下面2条规则:

block in all
block out all

这可以简化为:

block all

如果没有指定方向,PF会认为规则适用于数据包传递的进、出2个方向。

同样的, "from any to any" 和 "all" 子句可以在规则中省略,例如

block in on rl0 all
pass in quick log on rl0 proto tcp from any to any port 22 keep state

可以简化为:

block in on rl0
pass in quick log on rl0 proto tcp to port 22 keep state
第一条规则阻塞rl0上从任意到任意的进入数据包,第二条规则允许rl0上端口22的TCP流量通过。

Return 简化

用于阻塞数据包,回应TCP RST或者ICMP不能到达的规则集可以这么写:

block in all
block return-rst in proto tcp all
block return-icmp in proto udp all
block out all
block return-rst out proto tcp all
block return-icmp out proto udp all

可以简化为::

block return

当PF看到return关键字,PF可以智能回复合适应答,或者完全不回复,取决于要阻塞的数据包使用的协议。

关键字顺序

在大多数情况下,关键字的顺序是非常灵活的。例如,规则可以这么写:

pass in log quick on rl0 proto tcp to port 22 \
flags S/SA keep state queue ssh label ssh
也可以这么写:
pass in quick log on rl0 proto tcp to port 22 \
queue ssh keep state label ssh flags S/SA

其他类似的顺序也能够正常工作。

论坛徽章:
0
110 [报告]
发表于 2006-12-09 07:55 |只看该作者

高级配置

PF: 运行选项

------------------------------------------------------------------------------

使用set指定运行选项是控制pf的选择。

set block-policy
设定过滤规则中block动作的默认行为。
+ drop - 数据包悄然丢弃.
+ return - TCP RST 数据包返回给遭阻塞的TCP数据包,ICMP不能到达数据包返回给其它。
注意单独的过滤规则可以重写默认的响应。

set debug
设定 pf的调试级别。
+ none - 不显示任何调试信息。
+ urgent - 为严重错误产生调试信息,这是默认选择。
+ misc - 为多种错误产生调试信息。(例如,收到标准化/整形的数据包的状态,和产生失败的状态)。.
+ loud - 为普通条件产生调试信息(例如,收到被动操作系统检测信息状态)。

set fingerprints file
设定应该装入操作系统特征文件来识别操作系统,默认是 /etc/pf.os.

set limit
frags - 在内存池中进行数据包重组的最大数目。默认是5000。
src-nodes - 在内存池中用于追踪源地址(由stick-address 和 source-track选项产生)的最大数目,默认是10000。
states - 在内存池中用于状态表(过滤规则中的keep state)的最大数目,默认是10000。

set loginterface int
设定PF接口卡要统计(进/出流量,放行/阻塞)数据包的数目。统计数目一次只能用于一张卡。注意 match, bad-offset, 等计数器和状态表计数器不管 loginterface是否设置都会被记录。

set optimization
为以下的网络环境优化PF:
+ normal - 适用于绝大多数网络,这是默认项。
+ high-latency - 高延时网络,例如卫星连接。
+ aggressive - 自状态表中主动终止连接。大大减少繁忙防火墙的内存需求,但要冒空闲连接时被过早断开的风险。
+ conservative - 特别保守的设置。避免在内存需求过大时断开空闲连接,会稍微增加CPU的使用率。

set state-policy
设定PF在状态保持时的行为。这种行为可以被单条规则所改变。见状态保持章节。
+ if-bound - 状态绑定到产生它们的接口。如果流量匹配状态表的条目,但不是由条目中记录的接口通过,这个匹配会失败。数据包要么匹配一条过滤规则,或者被丢弃/拒绝。
+ group-bound - 行为基本和if-bound相同,除了数据包允许由同一组接口通过,例如所有的ppp接口等。
+ floating - 状态可以匹配任何接口上的流量。只要数据包匹配状态表条目,不管是否匹配它通过的接口,都会放行。这是默认的规则。

set timeout
interval - 丢弃过期的状态和数据包碎片的秒数。
frag - 不能重组的碎片过期的秒数。

例如:

set timeout interval 10
set timeout frag 30
set limit { frags 5000, states 2500 }
set optimization high-latency
set block-policy return
set loginterface dc0
set fingerprints /etc/pf.os.test
set state-policy if-bound
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP