æé—®â€¦
⌃K
Links

33.3.PF

从 FreeBSD 5.3 开始,OpenBSD çš„ PF 防ç«å¢™çš„ç§»æ¤ç‰ˆæœ¬å°±ä½œä¸ºåŸºæœ¬ç³»ç»Ÿçš„集æˆéƒ¨åˆ†è¢«åŒ…å«è¿›æ¥äº†ã€‚PF 是一个功能é½å…¨çš„完整防ç«å¢™ï¼Œå…·æœ‰å¯¹ ALTQ(交错队列)的å¯é€‰æ”¯æŒï¼ŒåŽè€…æä¾›æœåŠ¡è´¨é‡ï¼ˆQoS)。
OpenBSD 项目在 PF FAQ 中维护了 PF çš„æƒå¨å‚考。Peter Hansteen 在 http://home.nuug.no/~peter/pf/ 维护ç€ä¸€ä¸ªå…¨é¢çš„ PF 教程。
警告
在阅读 PF FAQ 时,请记ä½ï¼Œå¤šå¹´ä»¥æ¥ï¼ŒFreeBSD çš„ PF 版本与上游的 OpenBSD 版本有很大的ä¸åŒã€‚å¹¶éžæ‰€æœ‰åŠŸèƒ½åœ¨ FreeBSD 上的工作方å¼éƒ½ä¸Žåœ¨ OpenBSD 中的工作方å¼ç›¸åŒï¼Œå之亦然。
​FreeBSD æ•°æ®åŒ…过滤器邮件列表 是询问有关é…置和è¿è¡Œ PF 防ç«å¢™çš„问题的好地方。在æå‡ºé—®é¢˜ä¹‹å‰ï¼Œè¯·æ£€æŸ¥é‚®ä»¶åˆ—表存档,因为它å¯èƒ½å·²ç»å¾—到解答。
手册的这一部分é‡ç‚¹ä»‹ç»ä¸Ž FreeBSD 相关的 PF。它演示了如何å¯ç”¨ PF å’Œ ALTQ。它还æä¾›äº†å‡ ä¸ªåœ¨ FreeBSD 系统上创建规则集的示例。

33.3.1.å¯ç”¨ PF

è¦ä½¿ç”¨ PF,必须首先加载其内核模å—。本节介ç»å¯ä»¥æ·»åŠ åˆ° /etc/rc.conf 以å¯ç”¨ PF çš„æ¡ç›®ã€‚
首先添加 pf_enable=yes 到 /etc/rc.conf:
# sysrc pf_enable=yes
​pfctl(8) 中æåŠçš„其他选项å¯ä»¥åœ¨å¯åŠ¨æ—¶ä¼ é€’ç»™ PF。在 /etc/rc.conf 中添加或更改此æ¡ç›®ï¼Œå¹¶åœ¨ä¸¤ä¸ªå¼•å·ï¼ˆ""ï¼‰ä¹‹é—´æŒ‡å®šä»»ä½•å¿…éœ€çš„å‚æ•°ï¼š
pf_flags="" # additional flags for pfctl startup
如果 PF 找ä¸åˆ°å…¶è§„则集é…置文件,则 PF å°†ä¸ä¼šå¯åŠ¨ã€‚é»˜è®¤æƒ…å†µä¸‹ï¼ŒFreeBSD ä¸é™„带规则集,并且没有 /etc/pf.conf。å¯ä»¥åœ¨ /usr/share/examples/pf/ 中找到示例规则集。如果自定义规则集已ä¿å­˜åœ¨å…¶ä»–ä½ç½®ï¼Œè¯·åœ¨ /etc/rc.conf 中添加一行,指定文件的完整路径:
pf_rules="/path/to/pf.conf"
ç”± pflog(4) æä¾› PF 的日志记录支æŒã€‚è¦å¯ç”¨æ—¥å¿—记录支æŒï¼Œè¯·æ·»åŠ  pflog_enable=yes 到 /etc/rc.conf:
# sysrc pflog_enable=yes
还å¯ä»¥æ·»åŠ ä»¥ä¸‹è¡Œæ¥æ›´æ”¹æ—¥å¿—文件的默认ä½ç½®ï¼Œæˆ–指定在å¯åŠ¨æ—¶ä¼ é€’ç»™ pflog(4) çš„ä»»ä½•å…¶ä»–å‚æ•°ï¼š
pflog_logfile="/var/log/pflog" # where pflogd should store the logfile
pflog_flags="" # additional flags for pflogd startup
最åŽï¼Œå¦‚果防ç«å¢™åŽé¢æœ‰ LAN,并且需è¦ä¸º LAN ä¸Šçš„è®¡ç®—æœºè½¬å‘æ•°æ®åŒ…ï¼Œæˆ–è€…éœ€è¦ NAT,请å¯ç”¨ä»¥ä¸‹é€‰é¡¹ï¼š
gateway_enable="YES" # Enable as LAN gateway
ä¿å­˜æ‰€éœ€çš„编辑åŽï¼Œå¯ä»¥é€šè¿‡é”®å…¥ä»¥ä¸‹å†…容æ¥å¯åЍ PF 并具有日志记录支æŒï¼š
# service pf start
# service pflog start
默认情况下,PF 从 /etc/pf.conf 读å–å…¶é…ç½®è§„åˆ™ï¼Œå¹¶æ ¹æ®æ­¤æ–‡ä»¶ä¸­æŒ‡å®šçš„规则或定义修改ã€ä¸¢å¼ƒæˆ–传递数æ®åŒ…。FreeBSD 安装包括几个ä½äºŽ /usr/share/examples/pf/ 中的样本文件。有关 PF 规则集的完整覆盖范围,请å‚阅 PF 常è§é—®é¢˜è§£ç­”。
è¦æŽ§åˆ¶ PF,请使用 pfctl。有用的 pfctl 选项总结了此命令的一些有用选项。有关所有å¯ç”¨é€‰é¡¹çš„说明,请å‚阅 pfctl(8) :
表 28. 有用的 pfctl 选项
| 命令 | 目的 | | :----------------------------: | :-----------------------------------------------------------------: | --------- | -------------------------------------- | | pfctl -e | å¯ç”¨ PF。 | | pfctl -d | ç¦ç”¨ PF。 | | pfctl -F all -f /etc/pf.conf | 刷新所有 NATã€ç­›é€‰å™¨ã€çжæ€å’Œè¡¨è§„则,然åŽé‡æ–°åŠ è½½ /etc/pf.conf。 | | pfctl -s [ rules | nat | states ] | 对过滤规则ã€NAT 规则或状æ€è¡¨è¿›è¡ŒæŠ¥å‘Šã€‚ | | pfctl -vnf /etc/pf.conf | 检查 /etc/pf.conf 是å¦å­˜åœ¨é”™è¯¯ï¼Œä½†ä¸åŠ è½½è§„åˆ™é›†ã€‚ |
技巧
​security/sudo 对于è¿è¡Œ pfctl éœ€è¦æå‡æƒé™çš„命令éžå¸¸æœ‰ç”¨ã€‚它å¯ä»¥ä»Ž ports 安装。
è‹¥è¦ç›‘视通过 PF 防ç«å¢™çš„æµé‡ï¼Œè¯·è€ƒè™‘安装软件包或 port sysutils/pftop。安装åŽï¼Œå¯ä»¥è¿è¡Œ pftop 以类似于 top(1) çš„æ ¼å¼æŸ¥çœ‹æ­£åœ¨è¿è¡Œçš„æµé‡å¿«ç…§ã€‚

33.3.2. PF 规则集

本节演示了如何创建自定义规则集。它从最简å•的规则集开始,并使用几个示例在其概念的基础上,以演示 PF 的许多功能的实际使用情况。
最简å•的规则集适用于ä¸è¿è¡Œä»»ä½•æœåŠ¡ä¸”éœ€è¦è®¿é—®å•个网络(å¯èƒ½æ˜¯äº’è”网)的å•个计算机。è¦åˆ›å»ºæ­¤æœ€ç®€è§„则集,请编辑 /etc/pf.conf,使其如下所示:
block in all
pass out all keep state
é»˜è®¤æƒ…å†µä¸‹ï¼Œç¬¬ä¸€ä¸ªè§„åˆ™æ‹’ç»æ‰€æœ‰ä¼ å…¥æµé‡ã€‚第二æ¡è§„则å…è®¸æ­¤ç³»ç»Ÿåˆ›å»ºçš„è¿žæŽ¥ä¼ å‡ºï¼ŒåŒæ—¶ä¿ç•™è¿™äº›è¿žæŽ¥çš„状æ€ä¿¡æ¯ã€‚此状æ€ä¿¡æ¯å…许这些连接的返回æµé‡å›žä¼ ï¼Œå¹¶ä¸”应仅在å¯ä¿¡ä»»çš„计算机上使用。å¯ä»¥ä½¿ç”¨ä»¥ä¸‹å‘½ä»¤åŠ è½½è¯¥è§„åˆ™é›†ï¼š
# pfctl -e ; pfctl -f /etc/pf.conf
é™¤äº†ä¿æŒçжæ€ä¹‹å¤–,PF 还æä¾›åˆ—表和å®ï¼Œå¯ä»¥å®šä¹‰è¿™äº› 列表 å’Œ å® ä»¥ç”¨äºŽåˆ›å»ºè§„åˆ™ã€‚å®å¯ä»¥åŒ…å«åˆ—表,需è¦åœ¨ä½¿ç”¨å‰è¿›è¡Œå®šä¹‰ã€‚例如,在规则集的最顶部æ’入以下行:
tcp_services = "{ ssh, smtp, domain, www, pop3, auth, pop3s }"
udp_services = "{ domain }"
PF å¯ç†è§£ç«¯å£å称和端å£å·ï¼Œåªè¦è¿™äº›å称列在 /etc/services 中å³å¯ã€‚此示例创建了两个å®ã€‚第一个是包å«ä¸ƒä¸ª TCP 端å£å的列表,第二个是一个 UDP 端å£å。定义åŽï¼Œå¯ä»¥åœ¨è§„则中使用å®ã€‚在此示例中,除了此系统为七个指定的 TCP æœåŠ¡å’Œä¸€ä¸ªæŒ‡å®šçš„ UDP æœåŠ¡å¯åŠ¨çš„è¿žæŽ¥ä¹‹å¤–ï¼Œæ‰€æœ‰æµé‡éƒ½è¢«é˜»æ­¢ï¼š
tcp_services = "{ ssh, smtp, domain, www, pop3, auth, pop3s }"
udp_services = "{ domain }"
block all
pass out proto tcp to any port $tcp_services keep state
pass proto udp to any port $udp_services keep state
尽管 UDP 被认为是无状æ€å议,但 PF 能够跟踪一些状æ€ä¿¡æ¯ã€‚例如,当传递一个 UDP è¯·æ±‚ï¼Œè¯¢é—®åŸŸåæœåŠ¡å™¨æœ‰å…³åŸŸåçš„ä¿¡æ¯æ—¶ï¼ŒPF 将监视å“应以将其传递回去。
æ¯å½“对规则集进行编辑åŽï¼Œéƒ½å¿…须加载新规则,以便å¯ä»¥ä½¿ç”¨å®ƒä»¬ï¼š
# pfctl -f /etc/pf.conf
如果没有语法错误,pfctl 则ä¸ä¼šåœ¨è§„则加载期间输出任何消æ¯ã€‚在å°è¯•加载规则之å‰ï¼Œè¿˜å¯ä»¥å¯¹å…¶è¿›è¡Œæµ‹è¯•:
# pfctl -nf /etc/pf.conf
åŒ…å« -n 会导致规则仅被解释,但ä¸ä¼šåŠ è½½ã€‚è¿™æä¾›äº†æ›´æ­£ä»»ä½•错误的机会。在任何时候,都将强制执行加载的最åŽä¸€ä¸ªæœ‰æ•ˆè§„则集,直到ç¦ç”¨ PF 或加载新规则集。
技巧
在 pfctl è§„åˆ™é›†éªŒè¯æˆ–加载中添加 -v,将显示完全解æžè¿‡çš„规则,与它们将被加载的方å¼å®Œå…¨ä¸€è‡´ã€‚这在调试规则时是éžå¸¸æœ‰ç”¨çš„。

33.3.2.1.具有 NAT 的简å•网关

本节演示如何é…ç½®è¿è¡Œ PF çš„ FreeBSD 系统作为至少一å°å…¶ä»–机器的网关。网关至少需è¦ä¸¤ä¸ªç½‘络接å£ï¼Œæ¯ä¸ªæŽ¥å£è¿žæŽ¥åˆ°å•独的网络。在此示例中,xl0 连接到互è”网,xl1 连接到内部网络。
首先,å¯ç”¨ç½‘关,让计算机将其在一个接å£ä¸Šæ”¶åˆ°çš„网络æµé‡è½¬å‘到å¦ä¸€ä¸ªæŽ¥å£ã€‚æ­¤ç³»ç»Ÿå †æ ˆè®¾ç½®å°†è½¬å‘ IPv4 æ•°æ®åŒ…:
# sysctl net.inet.ip.forwarding=1
è¦è½¬å‘ IPv6 æµé‡ï¼Œè¯·ä½¿ç”¨ï¼š
# sysctl net.inet6.ip6.forwarding=1
è¦åœ¨ç³»ç»Ÿå¯åŠ¨æ—¶å¯ç”¨è¿™äº›è®¾ç½®ï¼Œè¯·ä½¿ç”¨ sysrc(8) 将它们添加到 /etc/rc.conf:
# sysrc gateway_enable=yes
# sysrc ipv6_gateway_enable=yes
命令 ifconfig å¯ä»¥éªŒè¯ä¸¤ä¸ªæŽ¥å£æ˜¯å¦å·²å¯åŠ¨å¹¶æ­£åœ¨è¿è¡Œã€‚
接下æ¥ï¼Œåˆ›å»º PF 规则以å…许网关传递æµé‡ã€‚虽然以下规则å…许æ¥è‡ªå†…éƒ¨ç½‘ç»œä¸»æœºçš„æœ‰çŠ¶æ€æµé‡ä¼ é€’到网关,但 to 关键字ä¸ä¿è¯ä»Žæºåˆ°ç›®æ ‡çš„一直传递:
pass in on xl1 from xl1:network to xl0:network port $ports keep state
该规则仅å…许æµé‡ä¼ å…¥å†…部接å£ä¸Šçš„网关。è¦è®©æ•°æ®åŒ…走得更远,需è¦ä¸€ä¸ªåŒ¹é…的规则:
pass out on xl0 from xl1:network to xl0:network port $ports keep state
虽然这两个规则将起作用,但很少需è¦è¿™ç§ç‰¹å®šçš„规则。对于ç¹å¿™çš„网络管ç†å‘˜ï¼Œå¯è¯»çš„规则集是更安全的规则集。本节的其余部分演示如何使规则尽å¯èƒ½ç®€å•,以æé«˜å¯è¯»æ€§ã€‚例如,这两个规则å¯ä»¥æ›¿æ¢ä¸ºä¸€ä¸ªè§„则:
pass from xl1:network to any port $ports keep state
interface:network 符å·å¯ä»¥ç”¨ä¸€ä¸ªå®æ¥ä»£æ›¿ï¼Œä½¿è§„则集更易读。例如,$localnet å®å¯ä»¥è¢«å®šä¹‰ä¸ºç›´æŽ¥è¿žæŽ¥åˆ°å†…部接å£çš„网络($xl1:network)。å¦å¤–,$localnet 的定义å¯ä»¥æ”¹ä¸º IP 地å€/ç½‘ç»œæŽ©ç  ç¬¦å·æ¥è¡¨ç¤ºä¸€ä¸ªç½‘络,比如 192.168.100.1/24 è¡¨ç¤ºä¸€ä¸ªç§æœ‰åœ°å€çš„å­ç½‘。
如果需è¦ï¼Œ$localnet 甚至å¯ä»¥è¢«å®šä¹‰ä¸ºä¸€ä¸ªç½‘络的列表。ä¸ç®¡å…·ä½“的需求是什么,一个åˆç†çš„ $localnet 定义å¯ä»¥åœ¨ä¸€ä¸ªå…¸åž‹çš„通行规则中使用,如下:
pass from $localnet to any port $ports keep state
以下示例规则集å…许由内部网络上的计算机å‘起的所有æµé‡ã€‚å®ƒé¦–å…ˆå®šä¹‰ä¸¤ä¸ªå®æ¥è¡¨ç¤ºç½‘关的外部和内部 3COM 接å£ã€‚
注æ„
对于拨å·ç”¨æˆ·ï¼Œå¤–部接å£å°†ä½¿ç”¨ tun0。对于 ADSL 连接,特别是那些使用以太网 PPP(PPPoEï¼‰çš„è¿žæŽ¥ï¼Œæ­£ç¡®çš„å¤–éƒ¨æŽ¥å£æ˜¯ tun0ï¼Œè€Œä¸æ˜¯ä»¥å¤ªç½‘ç‰©ç†æŽ¥å£ã€‚
ext_if = "xl0" # macro for external interface - use tun0 for PPPoE
int_if = "xl1" # macro for internal interface
localnet = $int_if:network
# ext_if IP address could be dynamic, hence ($ext_if)
nat on $ext_if from $localnet to any -> ($ext_if)
block all
pass from { lo0, $localnet } to any keep state
这个规则集引入了 nat 规则,用æ¥å¤„ç†ä»Žå†…部网络的ä¸å¯è·¯ç”±åœ°å€åˆ°åˆ†é…给外部接å£çš„ IP 地å€çš„网络地å€è½¬æ¢ã€‚当外部接å£çš„ IP 地å€è¢«åЍæ€åˆ†é…时,nat 规则的最åŽä¸€éƒ¨åˆ†ï¼ˆ$ext_if)周围的括å·è¢«åŒ…括在内。它å¯ä»¥ç¡®ä¿å³ä½¿å¤–部 IP 地å€å‘生å˜åŒ–,网络æµé‡çš„è¿è¡Œä¹Ÿä¸ä¼šå‡ºçް䏥é‡ä¸­æ–­ã€‚
请注æ„,此规则集å¯èƒ½å…许从网络中传出的æµé‡è¶…过所需的æµé‡ã€‚一个åˆç†çš„设置å¯ä»¥åˆ›å»ºæ­¤å®ï¼š
client_out = "{ ftp-data, ftp, ssh, domain, pop3, auth, nntp, http, \
https, cvspserver, 2628, 5999, 8000, 8080 }"
在主传递规则中使用:
pass inet proto tcp from $localnet to any port $client_out \
flags S/SA keep state
å¯èƒ½éœ€è¦ä¸€äº›å…¶ä»–的通过规则。这个在外部接å£ä¸Šå¯ç”¨ SSH:
pass in inet proto tcp to $ext_if port ssh
æ­¤å®å®šä¹‰å’Œè§„则å…许内部客户端使用 DNS å’Œ NTP:
udp_services = "{ domain, ntp }"
pass quick inet proto { tcp, udp } to any port $udp_services keep state
注æ„这个规则中的 quick 关键字。由于规则集由多个规则组æˆï¼Œå› æ­¤äº†è§£è§„则集中规则之间的关系很é‡è¦ã€‚规则从上到下,按照它们的编写顺åºè¿›è¡Œè¯„估。对于 PF 评估的æ¯ä¸ªæ•°æ®åŒ…或连接,规则集中 最åŽä¸€ä¸ªåŒ¹é…的规则 是被应用的。然而,当一个数æ®åŒ…ä¸ŽåŒ…å« quick å…³é”®å­—çš„è§„åˆ™ç›¸åŒ¹é…æ—¶ï¼Œè§„则处ç†å°±ä¼šåœæ­¢ï¼Œæ•°æ®åŒ…将按照该规则处ç†ã€‚当需è¦å¯¹ä¸€èˆ¬è§„åˆ™è¿›è¡Œä¾‹å¤–å¤„ç†æ—¶ï¼Œè¿™éžå¸¸æœ‰ç”¨ã€‚

33.3.2.2.创建 FTP 代ç†

由于 FTP å议的性质,é…置有效的 FTP 规则å¯èƒ½ä¼šæœ‰é—®é¢˜ã€‚FTP 比防ç«å¢™æ—©äº†å‡ å年,并且在设计上是ä¸å®‰å…¨çš„。最常è§çš„å对使用 FTP 的观点有:
  • 密ç ä»¥æ˜Žæ–‡å½¢å¼ä¼ è¾“。
  • 该åè®®è¦æ±‚在å•独的端å£ä¸Šä½¿ç”¨è‡³å°‘两个 TCP 连接(控制和数æ®ï¼‰ã€‚
  • 建立会è¯åŽï¼Œä½¿ç”¨éšæœºé€‰æ‹©çš„ç«¯å£è¿›è¡Œæ•°æ®é€šä¿¡ã€‚
所有这些è¦ç‚¹éƒ½å¸¦æ¥äº†å®‰å…¨æŒ‘战,甚至在考虑客户端或æœåŠ¡å™¨è½¯ä»¶ä¸­çš„ä»»ä½•æ½œåœ¨å®‰å…¨æ¼æ´žä¹‹å‰ä¹Ÿæ˜¯å¦‚此。存在更安全的文件传输替代方案,例如 sftp(1) 或 scp(1),它们都具有身份验è¯å’Œé€šè¿‡åŠ å¯†è¿žæŽ¥ä¼ è¾“æ•°æ®çš„功能。
å¯¹äºŽéœ€è¦ FTP 的情况,PF æä¾›äº†å°† FTP çš„æµé‡é‡å®šå‘到一个å为 ftp-proxy(8) çš„å°åž‹ä»£ç†ç¨‹åºï¼Œå®ƒåŒ…å«åœ¨ FreeBSD 基本系统中。代ç†çš„ä½œç”¨æ˜¯ä½¿ç”¨ä¸€ç»„é”šç‚¹åœ¨è§„åˆ™é›†ä¸­åŠ¨æ€æ’å…¥å’Œåˆ é™¤è§„åˆ™ï¼Œä»¥æ­£ç¡®å¤„ç† FTP æµé‡ã€‚
è¦å¯ç”¨ FTP 代ç†ï¼Œè¯·å°†æ­¤è¡Œæ·»åŠ åˆ° /etc/rc.conf:
ftpproxy_enable="YES"
ç„¶åŽå¯åЍ代ç†ï¼Œé€šè¿‡è¿è¡Œï¼š
# service ftp-proxy start
对于基本é…置,需è¦å°†ä¸‰ä¸ªå…ƒç´ æ·»åŠ åˆ° /etc/pf.conf 中。首先,代ç†å°†ç”¨äºŽæ’入它为 FTP 会è¯ç”Ÿæˆçš„规则的锚点:
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
其次,需è¦ä¼ é€’规则æ¥å…许 FTP æµé‡è¿›å…¥ä»£ç†ã€‚
第三,é‡å®šå‘å’Œ NAT 规则需è¦åœ¨è¿‡æ»¤è§„则之å‰å®šä¹‰ã€‚在 NAT 规则之åŽç«‹å³æ’入这个 rdr 规则:
rdr pass on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021
最åŽï¼Œå…许é‡å®šå‘çš„æµé‡é€šè¿‡ï¼š
pass out proto tcp from $proxy to any port ftp
其中,$proxy 扩展到代ç†å®ˆæŠ¤ç¨‹åºç»‘定到的地å€ã€‚
ä¿å­˜ /etc/pf.conf,加载新规则,然åŽåœ¨å®¢æˆ·ç«¯éªŒè¯ FTP è¿žæŽ¥æ˜¯å¦æ­£å¸¸å·¥ä½œï¼š
# pfctl -f /etc/pf.conf
此示例介ç»äº†ä¸€ä¸ªåŸºæœ¬è®¾ç½®ï¼Œå…¶ä¸­æœ¬åœ°ç½‘络中的客户端需è¦è”系其他ä½ç½®çš„ FTP æœåŠ¡å™¨ã€‚æ­¤åŸºæœ¬é…置应该适用于 FTP 客户端和æœåŠ¡å™¨çš„å¤§å¤šæ•°ç»„åˆã€‚如 ftp-proxy(8) 所示,通过å‘行中添加选项 ftpproxy_flags=,å¯ä»¥é€šè¿‡å¤šç§æ–¹å¼æ›´æ”¹ä»£ç†çš„行为。部分客户端或æœåС噍å¯èƒ½æœ‰ç‰¹å®šè®¾ç½®ï¼Œå¿…é¡»å•独为其增加特定é…置。或者需è¦é€šè¿‡ç‰¹å®šæ–¹å¼æ¥é›†æˆä»£ç†ï¼Œå¦‚å°† FTP æµé‡åˆ†é…到特定队列 。
è¦è¿è¡Œå— PF å’Œ ftp-proxy(8) ä¿æŠ¤çš„ FTP æœåŠ¡å™¨ï¼Œè¯·åœ¨å…·æœ‰è‡ªå·±çš„é‡å®šå‘传递规则的å•独端å£ä¸Šä½¿ç”¨ -R 以å呿¨¡å¼é…ç½®å•独的 FTP æœåŠ¡å™¨ã€‚

33.3.2.3.ç®¡ç† ICMP

用于调试或排除 TCP/IP 网络故障的许多工具都ä¾èµ–于互è”网控制消æ¯å议(ICMP),该å议是专门为调试而设计的。
ICMP å议在主机和网关之间å‘é€å’ŒæŽ¥æ”¶ 控制消æ¯ï¼Œä¸»è¦æ˜¯ä¸ºäº†å‘å‘逿–¹æä¾›æœ‰å…³å‰å¾€ç›®æ ‡ä¸»æœºé€”中的任何异常或困难情况的å馈。路由器使用 ICMP åè®®æ¥å商包的大å°å’Œå…¶ä»–ä¼ è¾“å‚æ•°ï¼Œè¿™ä¸ªè¿‡ç¨‹é€šå¸¸è¢«ç§°ä¸ºè·¯å¾„ MTU å‘现。
从防ç«å¢™çš„角度æ¥çœ‹ï¼ŒæŸäº› ICMP 控制消æ¯å®¹æ˜“å—到已知攻击媒介的攻击。此外,让所有诊断æµé‡æ— æ¡ä»¶é€šè¿‡ä½¿è°ƒè¯•更容易,但也使其他人更容易æå–有关网络的信æ¯ã€‚由于这些原因,以下规则å¯èƒ½ä¸æ˜¯æœ€ä½³è§„则:
pass inet proto icmp from any to any
一ç§è§£å†³æ–¹æ¡ˆæ˜¯è®©æ¥è‡ªæœ¬åœ°ç½‘络的所有 ICMP æµé‡é€šè¿‡ï¼ŒåŒæ—¶é˜»æ­¢æ¥è‡ªç½‘络外部的所有探测:
pass inet proto icmp from $localnet to any keep state
pass inet proto icmp from any to $ext_if keep state
其他选项也å¯ç”¨ï¼Œè¿™äº›é€‰é¡¹å±•示了 PF çš„ä¸€äº›çµæ´»æ€§ã€‚例如,å¯ä»¥æŒ‡å®š ping(8) å’Œ traceroute(8) 使用的消æ¯ï¼Œè€Œä¸æ˜¯å…许所有 ICMP 消æ¯ã€‚首先为该类型的消æ¯å®šä¹‰ä¸€ä¸ªå®ï¼š
icmp_types = "echoreq"
以åŠä½¿ç”¨å®çš„规则:
pass inet proto icmp all icmp-type $icmp_types keep state
如果需è¦å…¶ä»–类型的 ICMP æ•°æ®åŒ…,å¯ä»¥å°† icmp_type 扩展为这些数æ®åŒ…类型的列表。输入 more /usr/src/sbin/pfctl/pfctl_parser.c 坿Ÿ¥çœ‹ PF 支æŒçš„ ICMP 消æ¯ç±»åž‹åˆ—表。关于æ¯ç§æ¶ˆæ¯ç±»åž‹çš„解释,请å‚考 http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml。
由于 Unix çš„ traceroute 默认使用 UDP,所以需è¦å¦ä¸€æ¡è§„则æ¥å…许 Unix çš„ traceroute。
# allow out the default range for traceroute(8):
pass out on $ext_if inet proto udp from any to any port 33433 >< 33626 keep state
由于 Microsoft Windows 系统上的 TRACERT.EXE 使用 ICMP echo 请求信æ¯ï¼Œæ‰€ä»¥åªéœ€è¦ç¬¬ä¸€æ¡è§„则就å¯ä»¥å…许æ¥è‡ªè¿™äº›ç³»ç»Ÿçš„网络追踪。Unix çš„ traceroute 也å¯ä»¥è¢«æŒ‡ç¤ºä½¿ç”¨å…¶ä»–å议,如果使用 -I,将使用 ICMP echo 请求消æ¯ã€‚详情请查看 traceroute(8) 手册页以了解详细信æ¯ã€‚

33.3.2.3.1.路径 MTU å‘现

互è”网åè®®è¢«è®¾è®¡ä¸ºä¸Žè®¾å¤‡æ— å…³ï¼Œè®¾å¤‡ç‹¬ç«‹çš„ä¸€ä¸ªåŽæžœæ˜¯ï¼Œæ— æ³•始终å¯é åœ°é¢„测给定连接的最佳数æ®åŒ…大å°ã€‚æ•°æ®åŒ…大å°çš„主è¦çº¦æŸæ˜¯ 最大传输å•ä½ï¼ˆMTUï¼‰ï¼Œå®ƒè®¾ç½®äº†æŽ¥å£æ•°æ®åŒ…大å°çš„上é™ã€‚键入 ifconfig 以查看系统网络接å£çš„ MTU。
TCP/IP 使用称为路径 MTU å‘现的过程æ¥ç¡®å®šè¿žæŽ¥çš„æ­£ç¡®æ•°æ®åŒ…大å°ã€‚此过程å‘é€è®¾ç½®äº†â€œDo not fragmentâ€æ ‡å¿—集的ä¸åŒå¤§å°çš„æ•°æ®åŒ…ï¼Œå½“è¾¾åˆ°ä¸Šé™æ—¶ï¼Œé¢„计 ICMP 将返回数æ®åŒ…“type 3, code 4â€ã€‚“type 3â€è¡¨ç¤ºâ€œç›®æ ‡æ— æ³•访问â€ï¼Œâ€œtype 4â€æ˜¯â€œéœ€è¦åˆ†ç‰‡ï¼Œä½†è®¾ç½®äº†ä¸åˆ†æ®µæ ‡å¿—â€çš„缩写。è¦å…许路径 MTU å‘现以支æŒä¸Žå…¶ä»– MTU 的连接,请将类型 destination unreachable 添加到 icmp_types å®ä¸­ï¼š
icmp_types = "{ echoreq, unreach }"
由于传递规则已使用该å®ï¼Œå› æ­¤æ— éœ€å¯¹å…¶è¿›è¡Œä¿®æ”¹å³å¯æ”¯æŒæ–°çš„ ICMP 类型:
pass inet proto icmp all icmp-type $icmp_types keep state
PF å…许对 ICMP 类型和代ç çš„æ‰€æœ‰å˜ä½“进行过滤。å¯èƒ½çš„类型和代ç åˆ—表记录在 icmp(4) å’Œ icmp6(4) 中。

33.3.2.4.使用表

æŸäº›ç±»åž‹çš„æ•°æ®ä¸Žç»™å®šæ—¶é—´çš„筛选和é‡å®šå‘相关,但它们的定义太长,无法包å«åœ¨è§„则集文件中。PF 支æŒä½¿ç”¨è¡¨ï¼Œè¡¨æ˜¯å®šä¹‰çš„åˆ—è¡¨ï¼Œæ— éœ€é‡æ–°åŠ è½½æ•´ä¸ªè§„åˆ™é›†å³å¯å¯¹å…¶è¿›è¡Œæ“作,并且å¯ä»¥æä¾›å¿«é€ŸæŸ¥æ‰¾ã€‚表å始终括在 < > 中,如下所示:
table <clients> { 192.168.2.0/24, !192.168.2.5 }
在此示例中,网络是 192.168.2.0/24 表的一部分,但 192.168.2.5 地å€é™¤å¤–,该地å€ä½¿ç”¨ ! è¿ç®—符将其排除。还å¯ä»¥ä»Žæ¯ä¸ªé¡¹ç›®ä½äºŽå•独行上的文件中加载表,如以下示例 /etc/clients 所示:
192.168.2.0/24
!192.168.2.5
è¦å¼•用该文件,请按如下方å¼å®šä¹‰è¡¨ï¼š
table <clients> persist file "/etc/clients"
定义表åŽï¼Œå¯ä»¥é€šè¿‡è§„则引用它:
pass inet proto tcp from <clients> to any port $client_out flags S/SA keep state
å¯ä»¥ä½¿ç”¨ pfctl 实时æ“作表的内容。以下示例å‘表中添加å¦ä¸€ä¸ªç½‘络:
# pfctl -t clients -T add 192.168.1.0/16
注æ„ï¼Œä»¥è¿™ç§æ–¹å¼åšå‡ºçš„任何改å˜éƒ½ä¼šç«‹å³ç”Ÿæ•ˆï¼Œä½¿å…¶æˆä¸ºæµ‹è¯•çš„ç†æƒ³é€‰æ‹©ï¼Œä½†åœ¨æ–­ç”µæˆ–é‡å¯åŽå°†æ— æ³•继续。è¦ä½¿è¿™äº›å˜åŒ–æˆä¸ºæ°¸ä¹…性的,请修改规则集中的表的定义,或者编辑表所指å‘的文件。我们å¯ä»¥ä½¿ç”¨ cron(8) 工作æ¥ç»´æŠ¤ç£ç›˜ä¸Šçš„表的副本,该工作会定期将表的内容转储到ç£ç›˜ä¸Šï¼Œä½¿ç”¨çš„命令有:pfctl -t clients -T show >/etc/clients。å¦å¤–,/etc/clients 也å¯ä»¥ç”¨å†…存中的表内容进行更新:
# pfctl -t clients -T replace -f /etc/clients

33.3.2.5.使用é‡è½½è¡¨æ¥ä¿æŠ¤ SSH

在外部接å£ä¸Šè¿è¡Œ SSH 的用户å¯èƒ½åœ¨èº«ä»½éªŒè¯æ—¥å¿—中看到过类似这样的内容:
Sep 26 03:12:34 skapet sshd[25771]: Failed password for root from 200.72.41.31 port 40992 ssh2
Sep 26 03:12:34 skapet sshd[5279]: Failed password for root from 200.72.41.31 port 40992 ssh2
Sep 26 03:12:35 skapet sshd[5279]: Received disconnect from 200.72.41.31: 11: Bye Bye
Sep 26 03:12:44 skapet sshd[29635]: Invalid user admin from 200.72.41.31
Sep 26 03:12:44 skapet sshd[24703]: input_userauth_request: invalid user admin
Sep 26 03:12:44 skapet sshd[24703]: Failed password for invalid user admin from 200.72.41.31 port 41484 ssh2
这表明有人或æŸäº›ç¨‹åºè¯•图探索用户å和密ç ï¼Œä»¥è®©ä»–们进入系统。
å¦‚æžœåˆæ³•用户需è¦å¤–部 SSH 访问,则更改 SSH 使用的默认端å£å¯ä»¥æä¾›ä¸€äº›ä¿æŠ¤ã€‚但是,PF æä¾›äº†ä¸€ä¸ªæ›´ä¼˜é›…的解决方案。Pass 规则å¯ä»¥åŒ…å«å¯¹è¿žæŽ¥ä¸»æœºå¯ä»¥æ‰§è¡Œçš„æ“ä½œçš„é™åˆ¶ï¼Œå¹¶ä¸”å¯ä»¥å°†è¿è§„者放é€åˆ°è¢«æ‹’ç»éƒ¨åˆ†æˆ–全部访问的地å€è¡¨ä¸­ã€‚甚至å¯ä»¥ä»Žè¶…出é™åˆ¶çš„计算机中删除所有现有连接。
è¦å¯¹æ­¤è¿›è¡Œé…置,请在规则集的表部分中创建此表:
table <bruteforce> persist
ç„¶åŽï¼Œåœ¨è§„则集的早期æŸä¸ªä½ç½®ï¼Œæ·»åŠ è§„åˆ™ä»¥é˜»æ­¢æš´åŠ›è®¿é—®ï¼ŒåŒæ—¶å…è®¸åˆæ³•访问:
block quick from <bruteforce>
pass inet proto tcp from any to $localnet port $tcp_services \
flags S/SA keep state \
(max-src-conn 100, max-src-conn-rate 15/5, \
overload <bruteforce> flush global)
括å·ä¸­çš„部分定义了é™åˆ¶ï¼Œåº”æ›´æ”¹æ•°å­—ä»¥æ»¡è¶³æœ¬åœ°è¦æ±‚。å¯ä»¥è¿™æ ·ç†è§£ï¼š
max-src-conn 是å…许从一å°ä¸»æœºåŒæ—¶è¿žæŽ¥çš„æ¬¡æ•°ã€‚
max-src-conn-rate 是æ¯ç§’数(5)å…许æ¥è‡ªä»»ä½•å•个主机的新连接速率(15)。
overload <bruteforce> æ„味ç€ä»»ä½•超过这些é™åˆ¶çš„主机都会被添加到 bruteforce 表中。该规则集阻止æ¥è‡ª bruteforce 表中的地å€çš„æ‰€æœ‰æµé‡ã€‚
最åŽï¼Œflush global 表示,当一个主机达到é™åˆ¶æ—¶ï¼Œè¯¥ä¸»æœºçš„æ‰€æœ‰ï¼ˆglobal)连接将被终止(flush)。
注æ„
这些规则 ä¸ä¼š 阻止如 http://home.nuug.no/\~peter/hailmary2013/ 中所述的速度较慢的暴力破解程åºã€‚
此示例规则集主è¦ç”¨ä½œè¯´æ˜Žã€‚例如,如果通常需è¦å¤§é‡çš„è¿žæŽ¥ï¼Œä½†åœ¨æ¶‰åŠ ssh 时希望更加严格,请在规则集的早期用如下内容补充上述规则:
pass quick proto { tcp, udp } from any to any port ssh \
flags S/SA keep state \
(max-src-conn 15, max-src-conn-rate 5/3, \
overload <bruteforce> flush global)
注æ„
å¯èƒ½æ²¡æœ‰å¿…è¦é˜»æ­¢æ‰€æœ‰é‡è½½å™¨ï¼š
值得注æ„的是,é‡è½½æœºåˆ¶æ˜¯ä¸€ç§é€šç”¨æŠ€æœ¯ï¼Œä¸ä»…适用于 SSH,并且完全阻止è¿è§„者的所有æµé‡å¹¶ä¸æ€»æ˜¯æœ€ä½³çš„。
例如,é‡è½½è§„则å¯ç”¨äºŽä¿æŠ¤é‚®ä»¶æœåŠ¡æˆ– Web æœåŠ¡ï¼Œé‡è½½è¡¨å¯ç”¨äºŽåœ¨è§„则中将è¿è§„者分é…到具有最å°å¸¦å®½åˆ†é…的队列或é‡å®šå‘到特定网页。
éšç€æ—¶é—´çš„æŽ¨ç§»ï¼Œè¡¨å°†è¢«é‡è½½è§„则填充,其大å°å°†é€æ¸å¢žé•¿ï¼Œå ç”¨æ›´å¤šå†…存。有时,被阻止的 IP åœ°å€æ˜¯åЍæ€åˆ†é…çš„ IP 地å€ï¼Œæ­¤åŽå·²åˆ†é…给具有正当ç†ç”±ä¸Žæœ¬åœ°ç½‘络中的主机通信的主机。
对于这样的情况,pfctl æä¾›äº†ä½¿è¡¨é¡¹è¿‡æœŸçš„能力。例如,该命令将删除 86400 秒内未被引用的 <bruteforce> 表项。
# pfctl -t bruteforce -T expire 86400
​security/expiretable 也æä¾›äº†ç±»ä¼¼çš„功能,它删除了在指定时间段内未被访问的表æ¡ç›®ã€‚
安装åŽï¼Œå¯ä»¥è¿è¡Œ expiretable æ¥åˆ é™¤ <bruteforce> 表中超过指定期é™çš„表æ¡ç›®ã€‚本示例删除所有早于 24 å°æ—¶çš„æ¡ç›®ï¼š
/usr/local/sbin/expiretable -v -d -t 24h bruteforce

33.3.2.6.防止垃圾邮件

ä¸è¦ä¸Žä¸Ž spamassassin æ†ç»‘åœ¨ä¸€èµ·çš„åžƒåœ¾é‚®ä»¶å®ˆæŠ¤ç¨‹åºæ··æ·†ï¼Œmail/spamd å¯ä»¥ä½¿ç”¨ PF 进行é…置,以æä¾›é’ˆå¯¹åžƒåœ¾é‚®ä»¶çš„外部防御。此垃圾邮件使用一组é‡å®šå‘挂接到 PF é…置中。
垃圾邮件å‘é€è€…倾å‘于å‘é€å¤§é‡é‚®ä»¶ï¼Œåžƒåœ¾é‚®ä»¶ä¸»è¦æ¥è‡ªå°‘数垃圾邮件å‘é€è€…å‹å¥½çš„网络和大é‡è¢«åŠ«æŒçš„计算机,这两者都会相当快地报告到 阻止列表 中。
当收到æ¥è‡ªé˜»æ­¢åˆ—表中æŸä¸ªåœ°å€çš„ SMTP 连接时,spamd 会显示其标题,并立å³åˆ‡æ¢åˆ°ä¸€ç§æ¨¡å¼ï¼Œåœ¨è¯¥æ¨¡å¼ä¸‹ï¼Œå®ƒä¸€æ¬¡ä¸€ä¸ªå­—节地应答 SMTP é€šä¿¡ã€‚è¿™ç§æŠ€æœ¯æ—¨åœ¨å°†å°½å¯èƒ½å¤šçš„æ—¶é—´æµªè´¹åœ¨åžƒåœ¾é‚®ä»¶å‘é€è€…这一端,称为 缓é€ã€‚使用一个字节 SMTP ç­”å¤çš„特定实现通常称为 断断续续。
此示例演示了使用自动更新的阻止列表设置垃圾邮件的基本过程。有关详细信æ¯ï¼Œè¯·å‚é˜…éš mail/spamd 一起安装的手册页。
é…ç½®å垃圾邮件的过程:
  1. 1.
    通过软件包或 port 安装 mail/spamd。è¦ä½¿ç”¨ spamd çš„ç°åå•功能,fdescfs(5) 必须挂载在 /dev/fd。将以下行添加到 /etc/fstab:
fdescfs /dev/fd fdescfs rw 0 0
ç„¶åŽï¼ŒæŒ‚载文件系统:
# mount fdescfs
  1. 2.
    接下æ¥ï¼Œç¼–辑 PF 规则集以包括:
table <spamd> persist
table <spamd-white> persist
rdr pass on $ext_if inet proto tcp from <spamd> to \
{ $ext_if, $localnet } port smtp -> 127.0.0.1 port 8025
rdr pass on $ext_if inet proto tcp from !<spamd-white> to \
{ $ext_if, $localnet } port smtp -> 127.0.0.1 port 8025
两个表 <spamd> å’Œ <spamd-white> 是必ä¸å¯å°‘的。æ¥è‡ª <spamd> 中所列但ä¸åœ¨ <spamd-white> 中的地å€çš„ SMTP æµé‡è¢«é‡å®šå‘到在 8025 端å£ç›‘å¬çš„ spamd 守护进程。
  1. 3.
    下一步是在 /usr/local/etc/spamd.conf 中é…ç½® spamd,并添加一些 rc.conf 傿•°ã€‚
​mail/spamd 的安装包括一个示例é…置文件(/usr/local/etc/spamd.conf.sample)和一个 spamd.conf 的手册页。有关此示例中所示选项之外的其他é…置选项,请å‚阅这些选项。
é…置文件中ä¸ä»¥ # 注释符å·å¼€å¤´çš„第一行包å«äº†å®šä¹‰ all 列表的å—,它指定了è¦ä½¿ç”¨çš„列表:
all:\
:traplist:allowlist:
æ­¤æ¡ç›®æ·»åŠ æ‰€éœ€çš„åŒºå—列表,以冒å·(:)分隔。è¦ä½¿ç”¨ç™½åå•从黑åå•中å‡åŽ»åœ°å€ï¼Œè¯·åœ¨è¯¥é»‘åå•çš„åç§°ä¹‹åŽ ç´§è·Ÿ 添加白åå•çš„å称。例如::blocklist:allowlist:
åŽè·ŸæŒ‡å®šçš„黑åå•的定义:
traplist:\
:black:\
:msg="SPAM. Your address %A has sent spam within the last 24 hours":\
:method=http:\
:file=www.openbsd.org/spamd/traplist.gz
å…¶ä¸­ç¬¬ä¸€è¡Œæ˜¯å°æ€åå•çš„å称,第二行是指定åå•类型。msg 字段包å«äº†åœ¨ SMTP 对è¯ä¸­æ˜¾ç¤ºç»™è¢«å°æ€çš„å‘é€è€…的信æ¯ã€‚method 字段指定 spamd-setup 如何获å–列表数æ®ï¼›æ”¯æŒçš„æ–¹æ³•有 httpã€ftpã€æŒ‚载文件系统中的 file 和通过外部程åºçš„ exec。最åŽï¼Œfile 字段指定了 spamd 期望接收的文件的å称。
指定白åå•的定义类似,但çœç•¥äº†è¯¥å­—段,因为ä¸éœ€è¦æ¶ˆæ¯ msg:
allowlist:\
:white:\
:method=file:\
:file=/var/mail/allowlist.txt
技巧
è°¨æ…Žé€‰æ‹©æ•°æ®æºï¼š
使用示例 spamd.conf 中的所有阻止列表将阻止互è”网的大å—区域。管ç†å‘˜éœ€è¦ç¼–è¾‘è¯¥æ–‡ä»¶ä»¥åˆ›å»ºä½¿ç”¨é€‚ç”¨æ•°æ®æºå¹¶åœ¨å¿…è¦æ—¶ä½¿ç”¨è‡ªå®šä¹‰åˆ—表的最佳é…置。
接下æ¥ï¼Œå°†æ­¤æ¡ç›®æ·»åŠ åˆ° /etc/rc.conf。注释指定的手册页中讲解了其他标志:
spamd_flags="-v" # use "" and see spamd-setup(8) for flags
完æˆåŽï¼Œé‡æ–°åŠ è½½è§„åˆ™é›†ï¼Œé€šè¿‡è¾“å…¥ service obspamd start å¯åЍ spamd,并使用 spamd-setup 完æˆé…置。最åŽï¼Œåˆ›å»ºä¸€ä¸ª cron(8) 工作,在åˆç†çš„æ—¶é—´é—´éš”内调用 spamd-setup æ¥æ›´æ–°è¿™äº›è¡¨ã€‚
在邮件æœåС噍å‰é¢çš„典型网关上,主机很快就会在几秒钟到几分钟内开始陷入困境。
PF è¿˜æ”¯æŒ ç°åå•ï¼Œè¿™ä¼šæš‚æ—¶æ‹’ç»æ¥è‡ªå…·æœ‰ä»£ç  45n 的未知主机的邮件。æ¥è‡ªç°åå•主机的消æ¯åœ¨åˆç†æ—¶é—´å†…冿¬¡å°è¯•,将被å…许通过。æ¥è‡ªè®¾ç½®ä¸ºåœ¨ RFC 1123 å’Œ RFC 2821 设置的é™åˆ¶èŒƒå›´å†…è¿è¡Œçš„å‘件人的æµé‡å°†ç«‹å³é€šè¿‡ã€‚
有关ç°åå•æŠ€æœ¯çš„æ›´å¤šä¿¡æ¯ï¼Œè¯·è®¿é—® greylisting.org 网站。除了简å•之外,ç°å啿œ€ä»¤äººæƒŠå¥‡çš„事情是它ä»ç„¶æœ‰æ•ˆã€‚垃圾邮件å‘é€è€…å’Œæ¶æ„è½¯ä»¶ç¼–å†™è€…åœ¨é€‚åº”ç»•è¿‡è¿™ç§æŠ€æœ¯æ–¹é¢éžå¸¸ç¼“慢。
é…ç½®ç°åå•的基本过程如下:
é…ç½®ç°åå•的过程:
  1. 1.
    ç¡®ä¿ fdescfs(5) 已按照上一过程的步骤 1 中所述进行挂载。
  2. 2.
    è¦åœ¨ç°å啿¨¡å¼ä¸‹è¿è¡Œåžƒåœ¾é‚®ä»¶ï¼Œè¯·å°†æ­¤è¡Œæ·»åŠ åˆ° /etc/rc.conf:
spamd_grey="YES" # use spamd greylisting if YES
æœ‰å…³å…¶ä»–ç›¸å…³å‚æ•°çš„说明,请å‚阅垃圾邮件手册页。
  1. 3.
    è¦å®Œæˆç°åå•设置:
# service obspamd restart
# service obspamlogd start
在幕åŽï¼Œspamdb æ•°æ®åº“工具和 spamlogd 白å啿›´æ–°ç¨‹åºæ‰§è¡Œç°åå•功能的基本功能。spamdb 是管ç†å‘˜é€šè¿‡ /var/db/spamdb æ•°æ®åº“的内容管ç†å—ã€ç°åå•å’Œå…许列表的主è¦ç•Œé¢ã€‚

33.3.2.7.网络维护

本节介ç»å¦‚何使用 block-policy ã€scrub å’Œ antispoof æ¥ä½¿è§„则集的行为正常。
block-policy 选项,å¯ä»¥åœ¨ options 规则集的一部分中设置,该部分ä½äºŽé‡å®šå‘和过滤规则之å‰ã€‚此选项确定 PF å‘被规则阻止的主机å‘é€å“ªäº›å馈(如果有)。该选项有两个å¯èƒ½çš„值:drop 没有å馈的被阻止数æ®åŒ…,并 return 返回状æ€ä»£ç ï¼Œå¦‚ Connection refused。
如果未设置 drop,则缺çœç­–略为 block-policyï¼Œè¦æ›´æ”¹ï¼Œè¯·æŒ‡å®šæ‰€éœ€çš„值:
set block-policy return
在 PF 中,scrub 是å¯ç”¨ç½‘络数æ®åŒ…è§„èŒƒåŒ–çš„å…³é”®å­—ã€‚æ­¤è¿‡ç¨‹å°†é‡æ–°ç»„åˆç¢Žç‰‡æ•°æ®åŒ…并丢弃具有无效标志组åˆçš„ TCP æ•°æ®åŒ…。å¯ç”¨ scrub 功能æä¾›äº†ä¸€ç§é’ˆå¯¹åŸºäºŽä¸æ­£ç¡®å¤„ç†æ•°æ®åŒ…片段的æŸäº›ç±»åž‹æ”»å‡»çš„ä¿æŠ¤æŽªæ–½ã€‚æœ‰è®¸å¤šé€‰é¡¹å¯ç”¨ï¼Œä½†æœ€ç®€å•的形å¼é€‚用于大多数é…置:
scrub in all
æŸäº›æœåŠ¡ï¼ˆå¦‚ NFS)需è¦ç‰¹å®šçš„片段处ç†é€‰é¡¹ã€‚有关详细信æ¯ï¼Œè¯·å‚阅 https://home.nuug.no/~peter/pf/en/scrub.html。
æœ¬ç¤ºä¾‹é‡æ–°ç»„åˆç‰‡æ®µï¼Œæ¸…除 "do not fragment" ä½ï¼Œå¹¶å°†æœ€å¤§æ®µå¤§å°è®¾ç½®ä¸º 1440 字节:
scrub in all fragment reassemble no-df max-mss 1440
antispoof 机制å¯é˜²æ­¢æ¥è‡ªæ¬ºéª—或伪造 IP 地å€çš„æ´»åŠ¨ï¼Œä¸»è¦æ˜¯é€šè¿‡é˜»æ­¢å‡ºçŽ°åœ¨æŽ¥å£ä¸Šå’Œé€»è¾‘上ä¸å¯èƒ½çš„æ–¹å‘上的数æ®åŒ…。
这些规则清除了æ¥è‡ªä¸–界其他地区的欺骗性æµé‡ä»¥åŠæºè‡ªæœ¬åœ°ç½‘络的任何欺骗性数æ®åŒ…:
antispoof for $ext_if
antispoof for $int_if

33.3.2.8.处ç†ä¸å¯è·¯ç”±çš„地å€

å³ä½¿ä½¿ç”¨æ­£ç¡®é…置的网关æ¥å¤„ç†ç½‘络地å€è½¬æ¢ï¼Œä¹Ÿå¯èƒ½å¿…须补å¿å…¶ä»–人的错误é…置。一个常è§çš„错误é…置是让具有ä¸å¯è·¯ç”±åœ°å€çš„æµé‡æµå‘互è”网。由于æ¥è‡ªä¸å¯è·¯ç”±åœ°å€çš„æµé‡å¯ä»¥åœ¨å¤šç§ DoS æ”»å‡»æŠ€æœ¯ä¸­å‘æŒ¥ä½œç”¨ï¼Œå› æ­¤è¯·è€ƒè™‘显å¼é˜»æ­¢æ¥è‡ªä¸å¯è·¯ç”±åœ°å€çš„æµé‡é€šè¿‡å¤–部接å£è¿›å…¥ç½‘络。
在此示例中,定义了一个包å«ä¸å¯è·¯ç”±åœ°å€çš„å®ï¼Œç„¶åŽå°†å…¶ç”¨äºŽé˜»æ­¢è§„则。进出这些地å€çš„æµé‡ä¼šæ‚„悄地丢弃在网关的外部接å£ä¸Šã€‚
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
0.0.0.0/8, 240.0.0.0/4 }"
​
block drop in quick on $ext_if from $martians to any
block drop out quick on $ext_if from any to $martians

33.3.3.å¯ç”¨ ALTQ

在 FreeBSD 上,ALTQ å¯ä»¥ä¸Ž PF 一起使用,以æä¾›æœåŠ¡è´¨é‡ï¼ˆQOS)。å¯ç”¨ ALTQ åŽï¼Œå¯ä»¥åœ¨è§„则集中定义队列,以确定出站数æ®åŒ…的处ç†ä¼˜å…ˆçº§ã€‚
在å¯ç”¨ ALTQ 之å‰ï¼Œè¯·å‚考 altq(4) 以确定系统上安装的网å¡çš„é©±åŠ¨ç¨‹åºæ˜¯å¦æ”¯æŒå®ƒã€‚
ALTQ ä¸èƒ½ç”¨ä½œå¯åŠ è½½çš„å†…æ ¸æ¨¡å—ã€‚å¦‚æžœç³»ç»Ÿçš„æŽ¥å£æ”¯æŒ ALTQ,那么使用 é…ç½® FreeBSD 内核中的说明创建一个定制内核。以下内核选项å¯ç”¨ã€‚需è¦ç¬¬ä¸€ä¸ªæ¥å¯ç”¨ ALTQ。至少需è¦ä¸€ä¸ªå…¶ä»–é€‰é¡¹æ¥æŒ‡å®šæŽ’队调度程åºç®—法:
options ALTQ
options ALTQ_CBQ # Class Based Queuing (CBQ)
options ALTQ_RED # Random Early Detection (RED)
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
options ALTQ_PRIQ # Priority Queuing (PRIQ)
以下调度程åºç®—法å¯ç”¨ï¼š
  • CBQ
    基于类的队列(CBQ)用于将连接的带宽划分为ä¸åŒçš„类或队列,以根æ®è¿‡æ»¤è§„则确定æµé‡çš„优先级。
  • RED
    éšæœºæ—©æœŸæ£€æµ‹ï¼ˆRED)用于通过测é‡é˜Ÿåˆ—的长度并将其与队列的最å°å’Œæœ€å¤§é˜ˆå€¼è¿›è¡Œæ¯”较æ¥é¿å…ç½‘ç»œæ‹¥å¡žã€‚å½“é˜Ÿåˆ—è¶…è¿‡æœ€å¤§å€¼æ—¶ï¼Œå°†éšæœºä¸¢å¼ƒæ‰€æœ‰æ–°æ•°æ®åŒ…。
  • RIO
    åœ¨éšæœºæ—©æœŸæ£€æµ‹å…¥åº“和出库(RIO)模å¼ä¸‹ï¼ŒRED ä¿æŒå¤šä¸ªå¹³å‡é˜Ÿåˆ—长度和多个阈值,æ¯ä¸ª QOS 级别一个阈值。
  • HFSC
    分层公平æœåŠ¡æ›²çº¿æ•°æ®åŒ…调度程åºï¼ˆHFSC)在 http://www-2.cs.cmu.edu/\~hzhang/HFSC/main.html 中进行了说明。
  • PRIQ
    优先级队列(PRIQ)始终首先传递较高队列中的æµé‡ã€‚
有关调度算法和示例规则集的更多信æ¯ï¼Œè¯·è®¿é—® OpenBSD çš„ Web 存档。