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 系统上创建规则集的示例。
è¦ ä½¿ç”¨ 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 常è§é—®é¢˜è§£ç”。
表 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 是å¦å˜åœ¨é”™è¯¯ï¼Œä½†ä¸åŠ è½½è§„åˆ™é›†ã€‚ |技巧
è‹¥è¦ç›‘视通过 PF 防ç«å¢™çš„æµé‡ï¼Œè¯·è€ƒè™‘安装软件包或 port sysutils/pftop。安装åŽï¼Œå¯ä»¥è¿è¡Œ pftop 以类似于 top(1) çš„æ ¼å¼æŸ¥çœ‹æ£åœ¨è¿è¡Œçš„æµé‡å¿«ç…§ã€‚
本节演示了如何创建自定义规则集。它从最简å•的规则集开 å§‹ï¼Œå¹¶ä½¿ç”¨å‡ ä¸ªç¤ºä¾‹åœ¨å…¶æ¦‚å¿µçš„åŸºç¡€ä¸Šï¼Œä»¥æ¼”ç¤º 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,将显示完全解æžè¿‡çš„è§„åˆ™ï¼Œä¸Žå®ƒä»¬å°†è¢«åŠ è½½çš„æ–¹å¼å®Œå…¨ä¸€è‡´ã€‚这在调试规则时是éžå¸¸æœ‰ç”¨çš„。
本节演示如何é…ç½®è¿è¡Œ PF çš„ FreeBSD 系统作为至少一å°å…¶ä»–机器的网关。网关至少需è¦ä¸¤ä¸ªç½‘络接å£ï¼Œæ¯ä¸ªæŽ¥å£è¿žæŽ¥åˆ°å•独的网络。在æ¤ç¤ºä¾‹ä¸ï¼Œxl0 连接到互è”网,xl1 连接到内部网络。
首先,å¯ç”¨ç½‘关,让计算机将其在一个接å£ä¸Šæ”¶åˆ°çš„网络æµé‡è½¬å‘到å¦ä¸€ä¸ªæŽ¥å£ã€‚æ¤ç³»ç»Ÿå †æ ˆè®¾ç½®å°†è½¬å‘ IPv4 æ•°æ®åŒ…:
# sysctl net.inet.ip.forwarding=1
è¦è½¬å‘ IPv6 æµé‡ï¼Œè¯·ä½¿ç”¨ï¼š
# sysctl net.inet6.ip6.forwarding=1
# 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
关键å—çš„è§„åˆ™ç›¸åŒ¹é…æ—¶ï¼Œè§„则处ç†å°±ä¼šåœæ¢ï¼Œæ•°æ®åŒ…将按照该规则处ç†ã€‚当需è¦å¯¹ä¸€èˆ¬è§„åˆ™è¿›è¡Œä¾‹å¤–å¤„ç†æ—¶ï¼Œè¿™éžå¸¸æœ‰ç”¨ã€‚由于 FTP å议的性质,é…置有效的 FTP 规则å¯èƒ½ä¼šæœ‰é—®é¢˜ã€‚FTP 比防ç«å¢™æ—©äº†å‡ å年,并且在设计上是ä¸å®‰å…¨çš„。最常è§çš„å对使用 FTP 的观点有:
- 密ç 以明文形å¼ä¼ 输。
- 该åè®®è¦æ±‚在å•独的端å£ä¸Šä½¿ç”¨è‡³å°‘两个 TCP 连接(控制和数æ®ï¼‰ã€‚
- 建立会è¯åŽï¼Œä½¿ç”¨éšæœºé€‰æ‹©çš„ç«¯å£è¿›è¡Œæ•°æ®é€šä¿¡ã€‚
å¯¹äºŽéœ€è¦ 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 æœåŠ¡å™¨ã€‚ç”¨äºŽè°ƒè¯•æˆ–æŽ’é™¤ 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) 手册页以了解详细信æ¯ã€‚互è”网åè®®è¢«è®¾è®¡ä¸ºä¸Žè®¾å¤‡æ— å…³ï¼Œè®¾å¤‡ç‹¬ç«‹çš„ä¸€ä¸ªåŽæžœæ˜¯ï¼Œæ— 法始终å¯é 地预测给定连接的最佳数æ®åŒ…大å°ã€‚æ•°æ®åŒ…大å°çš„主è¦çº¦æŸæ˜¯ æœ€å¤§ä¼ è¾“å•ä½ï¼ˆ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 支æŒä½¿ç”¨è¡¨ï¼Œè¡¨æ˜¯å®šä¹‰çš„åˆ—è¡¨ï¼Œæ— éœ€é‡æ–°åŠ è½½æ•´ä¸ªè§„åˆ™é›†å³å¯å¯¹å…¶è¿›è¡Œæ“作,并且å¯ä»¥æä¾›å¿«é€ŸæŸ¥æ‰¾ã€‚表å始终括在
< >
ä¸ï¼Œå¦‚下所示: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
在外部接å£ä¸Šè¿è¡Œ 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
ä¸è¦ä¸Žä¸Ž spamassassin æ†ç»‘åœ¨ä¸€èµ·çš„åžƒåœ¾é‚®ä»¶å®ˆæŠ¤ç¨‹åºæ··æ·†ï¼Œmail/spamd å¯ä»¥ä½¿ç”¨ PF 进行é…置,以æä¾›é’ˆå¯¹åžƒåœ¾é‚®ä»¶çš„外部防御。æ¤åžƒåœ¾é‚®ä»¶ä½¿ç”¨ä¸€ç»„é‡å®šå‘挂接到 PF é…ç½®ä¸ã€‚
垃圾邮件å‘é€è€…倾å‘于å‘é€å¤§é‡é‚®ä»¶ï¼Œåžƒåœ¾é‚®ä»¶ä¸»è¦æ¥è‡ªå°‘数垃圾邮件å‘é€è€…å‹å¥½çš„网络和大é‡è¢«åŠ«æŒçš„计算机,这两者都会相当快地报告到 阻æ¢åˆ—表 ä¸ã€‚
当收到æ¥è‡ªé˜»æ¢åˆ—è¡¨ä¸æŸä¸ªåœ°å€çš„ SMTP 连接时,spamd ä¼šæ˜¾ç¤ºå…¶æ ‡é¢˜ï¼Œå¹¶ç«‹å³åˆ‡æ¢åˆ°ä¸€ç§æ¨¡å¼ï¼Œåœ¨è¯¥æ¨¡å¼ä¸‹ï¼Œå®ƒä¸€æ¬¡ä¸€ä¸ªå—èŠ‚åœ°åº”ç” SMTP é€šä¿¡ã€‚è¿™ç§æŠ€æœ¯æ—¨åœ¨å°†å°½å¯èƒ½å¤šçš„æ—¶é—´æµªè´¹åœ¨åžƒåœ¾é‚®ä»¶å‘é€è€…这一端,称为 缓é€ã€‚使用一个å—节 SMTP ç”å¤çš„特定实现通常称为 æ–æ–ç»ç»ã€‚
æ¤ç¤ºä¾‹æ¼”示了使用自动更新的阻æ¢åˆ—表设置垃圾邮件的基本过程。有关详细信æ¯ï¼Œè¯·å‚é˜…éš mail/spamd 一起安装的手册页。
é…ç½®å垃圾邮件的过程:
1.通过软件包或 port 安装 mail/spamd。è¦ä½¿ç”¨ spamd çš„ç°åå•功能,fdescfs(5) 必须挂载在 /dev/fdã€‚å°†ä»¥ä¸‹è¡Œæ·»åŠ åˆ° /etc/fstab:fdescfs /dev/fd fdescfs rw 0 0ç„¶åŽï¼ŒæŒ‚载文件系统:# mount fdescfs
2.接下æ¥ï¼Œç¼–辑 PF 规则集以包括:table <spamd> persisttable <spamd-white> persistrdr pass on $ext_if inet proto tcp from <spamd> to \{ $ext_if, $localnet } port smtp -> 127.0.0.1 port 8025rdr 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 守护进程。
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. 2.è¦åœ¨ç°å啿¨¡å¼ä¸‹è¿è¡Œåžƒåœ¾é‚®ä»¶ï¼Œè¯·å°†æ¤è¡Œæ·»åŠ åˆ° /etc/rc.conf:spamd_grey="YES" # use spamd greylisting if YESæœ‰å…³å…¶ä»–ç›¸å…³å‚æ•°çš„说明,请å‚阅垃圾邮件手册页。
3.è¦å®Œæˆç°åå•设置:# service obspamd restart# service obspamlogd start
在幕åŽï¼Œspamdb æ•°æ®åº“工具和 spamlogd 白å啿›´æ–°ç¨‹åºæ‰§è¡Œç°åå•功能的基本功能。spamdb 是管ç†å‘˜é€šè¿‡ /var/db/spamdb æ•°æ®åº“的内容管ç†å—ã€ç°åå•å’Œå…许列表的主è¦ç•Œé¢ã€‚
本节介ç»å¦‚何使用
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
å³ä½¿ä½¿ç”¨æ£ç¡®é…置的网关æ¥å¤„ç†ç½‘络地å€è½¬æ¢ï¼Œä¹Ÿå¯èƒ½å¿…须补å¿å…¶ä»–人的错误é…置。一个常è§çš„错误é…置是让具有ä¸å¯è·¯ç”±åœ°å€çš„æµé‡æµå‘互è”网。由于æ¥è‡ªä¸å¯è·¯ç”±åœ°å€çš„æµé‡å¯ä»¥åœ¨å¤šç§ 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
在 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ï¼‰å§‹ç»ˆé¦–å…ˆä¼ é€’è¾ƒé«˜é˜Ÿåˆ—ä¸çš„æµé‡ã€‚