- 论坛徽章:
- 0
|
# 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分钟实现。
------------------------------------------------------------------------------
$OpenBSD: logging.html,v 1.15 2004/05/07 01:55:23 nick Exp $
==============================================================================
PF: 性能
------------------------------------------------------------------------------
“PF可以处理多少带宽?”
“我需要多少台计算机处理因特网连接?”
这个问题没有简单的答案。对于一些应用程序来说,一台486/66主机,带有2个比较好的ISA网卡在做过滤和NAT时接近5Mbps,但是对于其他应用程序,一个更快的计算机加上更有效的PCI网卡也会显得能力不足。真正的问题不是每秒处理的位数而是每秒处理的包数和规则集的复杂程度。
体现PF性能的几个参数:
* 每秒处理包的数量. 一个1500字节的包和一个只有1个字节的包所需要的处理过程的数目几乎是一样的。每秒处理包的数量标志着状态表和过滤规则集在每秒内被评估的次数 ,标志着一个系统最有效的需求(在没有匹配的情况下)。
* 系统总线性能. ISA 总线最大带宽 8MB/秒, 当处理器访问它时, 它必须降速到80286的有效速度,不管处理器的真实处理速度如何,PCI总线有更有效的带宽,与处理器的冲突更小。
* 网卡的效率. 一些网卡的工作效率要高于其他网卡。 基于Realtek 8139 (rl(4)) 的网卡性能较低,而基于 Intel 21143 (dc(4)) 的网卡性能较好。为了取得更好的性能,建议使用千兆网卡,尽管所连接的网络不是千兆网,这些千兆网卡拥有高级的缓存,可以大幅提高性能。
* 规则集的设计和复杂性。规则越复杂越慢。越多的包通过keep和quick方式过滤,性能越好。对每个包的策略越多,性能越差。
* 值得一提: CPU 和内存。由于PF是基于内核的进程,它不需要swap空间。所以,如果你有足够的内存,它将运行很好,如果没有,将受影响。不需要太大量的内存。 32MB内存对小型办公室或者家庭应用足够,300MHz的cpu如果配置好网卡和规则集,足够满足要求。
人们经常询问PF的基准点。唯一的基准是在一个环境下系统的性能。不考虑环境因素将影响所设计的防火墙的系统性能。
PF 曾经在非常大流量的系统中工作,同时PF的开发者也是它的忠实用户。
------------------------------------------------------------------------------
$OpenBSD: perf.html,v 1.14 2004/05/07 01:55:24 nick Exp $
==============================================================================
PF: 研究 FTP
------------------------------------------------------------------------------
目录
* FTP 模式
* 工作在防火墙之后的FTP客户端
* PF "自保护" FTP服务器
* 被运行NAT的外部PF防火墙所保护的FTP服务器
* FTP的更多信息
------------------------------------------------------------------------------
FTP 模式
FTP是一种协议,它可以追溯到因特网发展初期,那时的因特网规模小,联网的计算机彼此友好,过滤和严格安全性在那时不是必须的。FTP设计之初就没有考虑包过滤、穿透防火墙和NAT。
FTP的工作模式分为被动(passive)和主动(active)两种。通常这两种选择被用来确定哪边有防火墙问题。实际上,为了方便用户你应该全部支持这两种模式。
在active模式下,当用户访问远程FTP服务器并请求一个文件信息时,那台FTP服务器将与该用户建立一个新的连接用来传输请求的数据,这被称为数据连接。具体过程为:客户端随机选择一个端口号,在该端口监听的同时将端口号传给服务器,由服务器向客户端的该端口发起连接请求,然后传递数据。在 NAT后的用户访问FTP服务器的时候会出现问题,由于NAT的工作机制,服务器将向NAT网关的外部地址的所选端口发起连接,NAT网关收到该信息后将在自己的状态表中查找该端口对应的内部主机,由于状态表中不存在这样的记录,因此该包被丢弃,导致无法建立连接。
在passive模式下(OpenBSD的ftp客户端默认模式),由客户端请求服务器随机选择一个端口并在此端口监听,服务器通知客户端它所选择的端口号,等待客户端连接。不幸的是,ftp服务器前的防火墙可能会阻断客户端发往服务器的请求信息。OpenBSD的ftp(1)默认使用 passive模式;要强制改为active模式,使用-A参数,或者在“ftp>”提示符下使用命令“passive off”关闭 passive模式。
工作在防火墙之后的FTP客户端
如前所述,FTP对NAT和防火墙支持不好。
包过滤机制通过将FTP数据包重定向到一个FTP代理服务器解决这一问题。这一过程将引导FTP数据包通过NAT网关/防火墙。OpenBSD和PF使用的FTP代理是ftp-proxy(8),可以通过在pf.conf中的NAT章节增加下列信息激活该代理:
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
port 8021
这条语句的解释为:在内部接口上的ftp数据包被重定向到本机的8021端口
显然该代理服务器应该已在OpenBSD中启动并运行。配置方法为在/etc/inetd.conf中增加下列信息:
127.0.0.1:8021 stream tcp nowait root /usr/libexec/ftp-proxy \
ftp-proxy
重启系统或者通过下列命令发送一个‘HUP’标记来生效:
kill -HUP `cat /var/run/inetd.pid`
ftp代理在8021端口监听,上面的rdr语句也是将数据包转发到这一端口。这一端口号是可选的,因为8021端口没有被其他应用程序占用,因此不失为一个好的选择。
请注意ftp-proxy(8)是用来帮助位于PF过滤器后的ftp客户端传递信息;并不用于PF过滤器后的ftp服务器。
PF“自保护”FTP服务器
当PF运行在一个FTP服务器上,而不是单独的一台防火墙。这种情况下处理passive模式的FTP连接请求时FTP服务器将随机取一个较大的 TCP端口接收数据。默认情况下OpenBSD的本地FTP服务器ftpd(8)使用49152~65535范围内的端口,显然,必须要有对应的过滤规则放行这些端口的数据:
pass in on $ext_if proto tcp from any to any port 21 keep state
pass in on $ext_if proto tcp from any to any port > 49151 \
keep state
如果需要可以调整上述端口范围。在OpenBSD的ftpd(8)环境下,可以通过sysctl(8)进行调整 net.inet.ip.porthifirst 和net.inet.ip.porthilast。
使用NAT外部 PF防火墙保护FTP服务器
这种情况下,防火墙必须将数据重定向到FTP服务器。为了讨论方便,我们假设该FTP服务器使用标准的OpenBSD ftpd(8),并使用默认端口范围。
这里有个例子
ftp_server = "10.0.3.21"
rdr on $ext_if proto tcp from any to any port 21 -> $ftp_server \
port 21
rdr on $ext_if proto tcp from any to any port 49152:65535 -> \
$ftp_server port 49152:65535
# in on $ext_if
pass in quick on $ext_if proto tcp from any to $ftp_server \
port 21 keep state
pass in quick on $ext_if proto tcp from any to $ftp_server \
port > 49151 keep state
# out on $int_if
pass out quick on $int_if proto tcp from any to $ftp_server \
port 21 keep state
pass out quick on $int_if proto tcp from any to $ftp_server \
port > 49151 keep state
FTP的更多信息
过滤FTP和FTP如何工作的更多信息可以参考下面的白皮书。
ftp reviewed!(原文有超级链接)
------------------------------------------------------------------------------
$OpenBSD: ftp.html,v 1.14 2004/05/07 01:55:23 nick Exp $
==============================================================================
PF: pf验证: 用Shell 进行网关验证
------------------------------------------------------------------------------
目录
* 简介
* 配置
+ 将authpf连入主策略集
+ 配置加载的策略
+ 访问控制列表
+ 将authpf配置为用户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手册
实例
OpenBSD网关通过authpf对一个大型校园无线网的用户进行身份验证。一旦某个用户验证通过,假设他不在禁用列表中,他将被允许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 |
|