免费注册 查看新帖 |

Chinaunix

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

菜鸟100问 [复制链接]

论坛徽章:
0
91 [报告]
发表于 2006-12-09 08:48 |显示全部楼层

高级配置

PF: 数据包标记

------------------------------------------------------------------------------
简介
数据包标记是给数据包打内部标记的方法,以后可以在过滤和转换规则中使用。使用标记,有可能做这样的事情,比如在接口间产生信任关系,或者确定数据包是否经过了转换规则处理。也可能从基于规则的过滤中移出,开始执行基于策略的过滤。

给数据包打标记

要给数据包打标记,使用tag 关键字:

pass in on $int_if all tag INTERNAL_NET keep state

标记 INTERNAL_NET 会增加到任何匹配上述规则的数据包中。
注意keep state (或者 modulate state/synproxy state) 使用在标记数据包通过的规则中。

标记也可以通过宏来打,比如:

name = "INTERNAL_NET"
pass in on $int_if all tag $name keep state

有一组预先定义的宏也可以被使用。

* $if - 接口
* $srcaddr - 源 IP 地址
* $dstaddr - 目的 IP 地址
* $srcport - 源端口
* $dstport - 目的端口
* $proto - 协议
* $nr - 规则号

这些宏在规则集装入时扩展,而不是运行时。

标记遵循以下规则:

* 标记是粘性的。一旦一个标记被匹配的规则打到一个数据包,就不能被删除。但它可以被不同的标记替换。
* 由于标记的粘性,打了标记的数据包会一直保持,即使所有的规则都没有使用这个标记。
* 一个数据包一次最多只能打一个标记。
* 标记是内部标识符,标记不会被送到网上。

看看下面的例子:

(1) pass in on $int_if tag INT_NET keep state
(2) pass in quick on $int_if proto tcp to port 80 tag \
INT_NET_HTTP keep state
(3) pass in quick on $int_if from 192.168.1.5 keep state

* 按照规则1,$int_if 接口上收到的数据包会打上INT_NET 标记。
* $int_if 接口上收到的目标端口80的数据包根据规则1首先打上INT_NET 标记,然后根据规则2,被INT_NET_HTTP 标记替代。
* 根据规则3,$int_if 接口上收到的来自192.168.1.5的数据包,由于这是最终匹配规则,因此如果它们的目标端口是80,则标记是INT_NET_HTTP ,否则标记是INT_NET 。
除了过滤规则外, nat, rdr, binat转换规则也可以用tag关键字使用标记。

检查数据包标记

要检查先前已经打的标记,可以使用tagged关键字:

pass out on $ext_if tagged INT_NET keep state

为$ext_if输出的数据包打上INT_NET标记。反转匹配也可以使用!操作:

pass out on $ext_if tagged ! WIFI_NET keep state

过滤策略

定义的策略设定规则,说明哪种流量放行,哪种流量阻塞。如源/目的IP地址,协议等等, 数据包被分配到不同的策略。例如,检查下面的防火墙策略:

* 自内部LAN到DMZ的流量是允许的 (LAN_DMZ)。
* 自因特网到DMZ的服务器流量是允许的。 (INET_DMZ)
* 自因特网被重定向到spamd(8)是允许的 (SPAMD)
* 其他所有流量阻塞。

注意策略是如何覆盖所有通过防火墙的流量的。括号里面的项目是策略将使用的标记。
需要过滤和转换规则来把数据包分配到不同的策略。

rdr on $ext_if proto tcp from to port smtp \
tag SPAMD -> 127.0.0.1 port 8025

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep  
state

现在要设置定义策略的规则。

pass in quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state

现在要建立整个规则集,修改分类规则。例如,如果pop3/SMTP服务器增加到了DMZ区,就需要增加针对POP3和SMTP流量的分类,如下:

mail_server = "192.168.0.10"
...
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
tag INET_DMZ keep state

Email 流量会作为INET-DMZ策略的条目被放行。
完整的规则:

# macros
int_if = "dc0"
dmz_if = "dc1"
ext_if = "ep0"
int_net = "10.0.0.0/24"
dmz_net = "192.168.0.0/24"
www_server = "192.168.0.5"
mail_server = "192.168.0.10"

table persist file "/etc/spammers"

# classification -- classify packets based on the defined firewall
# policy.
rdr on $ext_if proto tcp from to port smtp \
tag SPAMD -> 127.0.0.1 port 8025

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
tag INET_DMZ keep state

# policy enforcement -- pass/block based on the defined firewall policy.
pass in quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state

标记以太网帧

打标记可以在以太网级别进行,如果执行标记/过滤的机器同时做为网桥。通过创建使用tag关键字的网桥过滤规则,PF可以建立基于源/目的MAC地址的过滤规则。网桥规则可以由brconfig(8)命令产生,例如:

# brconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
tag USER1

然后在 pf.conf文件中:

pass in on fxp0 tagged USER1

论坛徽章:
0
92 [报告]
发表于 2006-12-09 08:56 |显示全部楼层

附加主题

PF: 日志

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

PF的包日志是由pflogd(8)完成的,它通过监听pflog0接口然后将包以tcpdump(8)二进制格式写入日志文件(一般在/val/log/pflog)。过滤规则定义的日志和log-all关键字所定义的日志都是以这种方式记录的。

读取日志文件

文本编辑器不能读取日志文件,必须使用Tcpdump来查看日志。

使用如下格式查看日志信息:

# tcpdump -n -e -ttt -r /var/log/pflog

使用tcpdump( 查看日志文件并不是实时的,若要实时查询日志信息需加上pflog0参数:

# tcpdump -n -e -ttt -i pflog0

当查看日志时需要特别注意tcpdump的详细协议解码(通过在命令行增加-v参数实现)。
为避免引发延时攻击,推荐在查询日志文件信息之前,先将该日志文件从防火墙上移走。

对日志文件的安全访问。默认情况下,pflogd 将在日志文件中记录96字节的包信息。访问日志文件将提供访问部分敏感包信息的途径(就像telnet(1)或者ftp(1)的用户名和密码)。

导出日志

由于pflogd以tcpdump二进制格式记录日志信息,因此可以使用tcpdump的特点。例如,只查看与特定端口匹配的包:

# tcpdump -n -e -ttt -r /var/log/pflog port 80

甚至可以限定具体的主机和端口:

# tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.3

同样的方法可以应用到直接从pflog0接口读取的信息:

# tcpdump -n -e -ttt -i pflog0 host 192.168.4.2

注意这与包被记录到pflogd日志文件不相冲突;上述语句只以包被记录的形式显示。
除了使用标准的tcpdump(8)过滤规则外,OpenBSD的tcpdump过滤语言为读取pflogd而被扩展:

* ip -IPv4版本地址。
* ip6 - IPv6版本地址。
* on int - 包通过int接口。
* ifname int - 与 on int相同.
* rulenum num - 包匹配的过滤规则编号为num。
* action act - 对包的操作。可能是pass(通过)或者block(阻断)。
* reason res - 执行对包操作的原因。可能的原因是match(匹配), bad-offset, fragment, short, normalize(规格化), memory(内存)。
* inbound -入栈包。
* outbound - 出栈包。

举例:

# tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0

这将以实时方式显示被wi0接口阻断的入栈包的日志信息。

通过Syslog记录日志

很多情况下需要将PF日志记录以ASCII代码格式存储,或者(同时)把这些日志存到远程的日志服务器上。这些可以通过两个小的脚本文件实现,是对 openbsd配置文件和syslogd(8),日志守护进程的少许修改。Syslogd进程以ASCII格式存储日志,同时可以将日志存储到远程日志服务器。

首先我们必须建立一个用户,pflogger,使用 /sbin/nologin  shell最简单的建立用户的方法是使用adduser(8)。

完成后建立如下两个脚本:

/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 -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

编辑root的cron 任务:

# crontab -u root -e

增加如下两行:

# rotate pf log file every 5 minutes
0-59/5 * * * * /bin/sh /etc/pflogrotate

为用户pflogger建立一个cron任务:

# crontab -u pflogger -e

增加如下两行:

# feed rotated pflog file(s) to syslog
0-59/5 * * * * /bin/sh /home/pflogger/pfl2sysl

将下行增加到 /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(Cool 不再必需可以被禁用。然而, /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分钟实现。

==============================================================================

论坛徽章:
0
93 [报告]
发表于 2006-12-09 08:58 |显示全部楼层

附加主题

PF: 性能

------------------------------------------------------------------------------
“PF可以处理多少带宽?”
“我需要多少台计算机处理因特网连接?”

这个问题没有简单的答案。取决于每秒处理的包数和规则集的复杂程度。

体现PF性能的几个参数:

* 每秒处理包的数量. 一个1500字节的包和一个只有1个字节的包所需要的处理过程的数目几乎是一样的。
* 系统总线性能. PCI总线有更有效的带宽,与处理器的冲突更小。
* 网卡的效率. 一些网卡的工作效率要高于其他网卡。 建议使用千兆网卡,尽管所连接的网络不是千兆网,这些千兆网卡拥有高级的缓存,可以大幅提高性能。
* 规则集的设计和复杂性。规则越复杂越慢。越多的包通过keep和quick方式过滤,性能越好。对每个包的策略越多,性能越差。
* 值得一提: CPU 和内存。由于PF是基于内核的进程,它不需要swap空间。而需要内存。 32MB内存对小型办公室或者家庭应用足够。

==============================================================================

论坛徽章:
0
94 [报告]
发表于 2006-12-09 09:00 |显示全部楼层
PF: 研究 FTP

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

^-^  (参见pf中文手册)
^-^
==============================================================================

论坛徽章:
0
95 [报告]
发表于 2006-12-09 09:10 |显示全部楼层

附加主题

PF: pf验证: 用Shell 进行网关验证

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

Authpf(Cool是身份认证网关的用户shell。类似于普通网关,只不过用户必须在网关上通过身份验证后才能使用该网关。当用户 shell被设置为/usr/sbin/authpf时(例如,代替了ksh(1),csh(1)等),并且用户通过SSH登录,authpf将对pf (4)策略集做必要的修改,以便该用户的数据包可以通过过滤器或者(和)使用NAT、重定向功能。一旦用户退出登录或者连接被断开,authpf将移除加载到该用户上的所有策略,同时关闭该用户打开的所有会话。因此,只有当用户保持着他的SSH会话进程时他才具备透过防火墙发送数据包的能力。  

Authpf通过向附加到锚点的命名策略集增加策略来改变pf(4)的策略集。每次用户进行身份验证,authpf建立一个新的命名策略集,并将已经配置好的filter、nat、binat和rdr规则加载上去。被authpf所加载的策略,可以被配置为针对单一用户相关或者针对总体。

Authpf可以应用在:

* 在允许用户访问因特网之前进行身份验证。
* 赋予特殊用户访问受限网络的权利,例如管理员。
* 只允许特定的无线网络用户访问特定的网络。
* 允许公司员工在任何时候访问公司网络,而公司之外的用户不能访问。
* 通过PF限制guest用户对因特网的访问。Authpf可以用来向已注册用户开放完全的因特网连接。

Authpf通过syslogd(8)记录每一个成功通过身份验证用户的用户名、IP地址、开始结束时间。通过这些信息,管理员可以确定谁在何时登陆,也使得用户对其网络流量负责。

配置

配置authpf的基本步骤大致描述如下。详细的信息请查看man手册。

将authpf连入主策略集

通过使用锚点策略将authpf连入主策略集:

nat-anchor authpf
rdr-anchor authpf
binat-anchor authpf
anchor authpf

锚点策略放入策略集的位置,就是PF中断执行主策略集转为执行authpf策略的位置。上述4个锚点策略并不需要全部存在,例如,当authpf没有被设置加载任何nat策略时,nat-anchor策略可被省略。

配置加载的策略

Authpf通过下面两个文件之一加载策略:

* /etc/authpf/users/$USER/authpf.rules
* /etc/authpf/authpf.rules

第一个文件包含只有当用户$USER(替换为具体的用户名)登录时才被加载的策略。当特殊用户(例如管理员)需要一系列不同于其他默认用户的策略集时可以使用每用户策略配置。第二个文件包含没定义authpf.rules文件的用户所默认加载的策略。如果用户定义的文件存在,将覆盖默认文件。这两个文件至少存在其一,否则authpf将不会工作。

过滤器和传输策略与其他的PF策略集语法一样,但有一点不同:authpf允许使用预先定义的宏:

* $user_ip – 登录用户的IP地址
* $user_id – 登录用户的用户名

推荐使用宏$user_ip,只赋予通过身份验证的计算机透过防火墙的权限。

访问控制列表

可以通过在/etc/authpf/banned/目录下,建立以用户名命名的文件来阻止该用户使用authpf。文件的内容将在authpf断开与该用户连接之前显示给他,这为通知该用户被禁止访问的原因。

相反,如果只允许特定的用户访问,可以将用户名写入/etc/authpf/authpf.allow文件。如果该文件不存在或者文件中输入了“*”,则authpf将允许任何成功通过SSH登录的用户进行访问(没有被明确禁止的用户)。  

如果authpf不能断定一个用户名是被允许还是禁止,它将打印一个摘要信息并断开该用户的连接。明确禁止将会使明确允许失效。

将authpf配置为用户shell

authpf必须作为用户的登录shell才能正常工作。当用户成功通过sshd(8)登录后,authpf将被作为用户的shell执行。它将检查该用户是否有权使用authpf,并从适当的文件中加载策略,等等。

有两种途径将authpf设置为用户shell:

1.为每个用户手动使用chsh(1), vipw(Cool, useradd(Cool, usermod(Cool,等。
2.通过把一些用户分配到一个登录类,在文件/etc/login.conf中改变这个登录类的shell属性

查看登陆者

一旦用户成功登录,并且authpf调整了PF的策略,authpf将改变它的进程名以显示登录者的用户名和IP地址:

# ps -ax | grep authpf
23664 p0 Is+ 0:00.11 -authpf: charlie@192.168 (authpf)

用户chalie从IP地址为192.168.1.3的主机登录。用户可以通过向authpf进程发送SIGTERM信号退出登录。

Authpf也将移除加载到该用户上的策略,并关闭任何该用户打开的会话连接。

# kill -TERM 23664

更多信息请查询man手册

实例

对一个大型校园无线网的用户进行身份验证。一旦某个用户验证通过,假设他不在禁用列表中,他将被允许SSH并访问网页(包括安全网站https),也可以访问该校园的任一个DNS服务器。

文件 /etc/authpf/authpf.rules包含下列策略:

wifi_if = "wi0"
dns_servers = "{ 10.0.1.56, 10.0.2.56 }"

pass in quick on $wifi_if proto udp from $user_ip to $dns_servers \
port domain keep state
pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \
https } flags S/SA keep state

管理员charlie除了网页冲浪和使用SSH外,还需要访问校园网的SMTP和POP3服务器。下列策略被配置在/etc/authpf/users/charlie/authpf.rules 中:

wifi_if = "wi0"
smtp_server = "10.0.1.50"
pop3_server = "10.0.1.51"
dns_servers = "{ 10.0.1.56, 10.0.2.56 }"

pass in quick on $wifi_if proto udp from $user_ip to $dns_servers \
port domain keep state
pass in quick on $wifi_if proto tcp from $user_ip to $smtp_server \
port smtp flags S/SA keep state
pass in quick on $wifi_if proto tcp from $user_ip to $pop3_server \
port pop3 flags S/SA keep state
pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \
https } flags S/SA keep state

定义在/etc/pf.conf中的主策略集配置如下:

# macros
wifi_if = "wi0"
ext_if = "fxp0"

scrub in all

# filter
block drop all

pass out quick on $ext_if proto tcp from $wifi_if:network flags S/SA \
modulate state
pass out quick on $ext_if proto { udp, icmp } from $wifi_if:network \
keep state

pass in quick on $wifi_if proto tcp from $wifi_if:network to $wifi_if \
port ssh flags S/SA keep state

anchor authpf in on $wifi_if

该策略集非常简单,作用如下:

* 阻断所有(默认拒绝)。
* 放行外部网卡接口上的来自无线网络并流向外部的TCP,UDP和ICMP数据包。
* 放行来自无线网络,目的地址为网关本身的SSH数据包。该策略是用户登录所必须的。
* 在无线网络接口上为流入数据建立锚点“authpf”。

设计主策略集的主导思想为:阻断任何包并允许尽可能小的数据流通过。用户一旦通过验证,用户数据包被允许通过无线接口进入,并穿过网关到达其他网络。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP