PfÎĵµ·Ò루һ²¿·Ö£¬ Çë°ïÖúÕÒ³ö´íÎó¡¢Ð£¶Ô£©
[COLOR=orangered][size=3]ÏÈ·ÒëÒ»²¿·ÖPFÎĵµ³öÀ´£¬ ÐÖµÜÃÇ¿´¿´ÓÐÄÄЩÓï¾ä²»Í¨Ë³£¬·Òë´íÎóµÄµØ·½ÇëÖ¸³öÀ´£¬ »ØÌù»ò·¢µ½renhw895@sohu.com¸øÎÒ£¬ÎҺñ߷Òëºó±ßµÄÎĵµ±ßÐÞ¸ÄÇ°ÃæµÄ´íÎó£¡ Ð»Ð»£¡[/size][/color][color=blue][size=6]PF: The OpenBSD Packet Filter[/size][/color]
Packet Filter(ºóÃæÎÒÃǼòµ¥½Ð£ºPF)ÊÇopenbsdϵͳÓÃÀ´¹ýÂËtcp´«ÊäºÍ½øÐÐÍøÂçµØÖ·×ª»»µÄÒ»¸ö¹¤¾ß¡£PFͨ³£ÓÃÀ´¹ÜÀíTCP/IP´«ÊäºÍ´ø¿í¹ÜÀí¼°Êý¾Ý°üµÄÓÅÏȼ¶¹ÜÀí¡£´Óopenbsd3.0¿ªÊ¼PFÒÑ×÷ΪϵͳµÄ»ù±¾Äں˰üº¬ÔÚϵͳÖÐÁË¡£Ö®Ç°Ê¹ÓõÄfirewall/NAT½«²»ÔÙʹÓá£
PF×î³õÊÇÓÉDaniel Hartmeier¿ª·¢µÄ£¬ ÏÖÔÚÖ÷Òª¿ª·¢¹ÜÀí¸ºÔðÈËÊÇDanielºÍOpenBSD¿ª·¢ÍŶӡ£
Õâ¸öÎĵµÊÇPFÔËÐÐÔÚOpenBSDϵͳÉϵÄÒ»¸ö»ù±¾½éÉÜ¡£ËüÊǶÔϵͳman pagesµÄÒ»¸ö²¹³ä£¬ ²¢²»ÄÜÈ¡´úËüÃÇ¡£±¾Îĵµ²¢Ã»°üº¬ËùÓÐPFµÄÌØÐÔ£¬ ¿ÉÄܲ»»áËæman pagesÒ»Æð¸üС£
Õâ·ÝÎĵµÖ÷Òª¼¯ÖÐÓÚÔÚOpenBSD3.4ʹÓá£PFÒ»Ö±ÔÚ¿ª·¢£¬ OpenBSD3.4 ºÍOpenBSD-currentÖ®¼ä¿ÉÄÜÓÐһЩ¸Ä±äºÍÔö¼Ó¡£ ¶ÁÕß×îºÃÏÈ¿´¿´×Ô¼ºÏµÍ³ÉϵÄman pages¡£
[color=blue][size=5]PF: Configuration[/size][/color]
[color=blue][size=4]Activation[/size][/color]
´ò¿ªPF²¢Ê¹ËüÄÜÔÚbootʱÔĶÁÅäÖÃÎļþ£¬ ÄãÐèÒªÐÞ¸Ä/etc/rc.conf²¢½«PFÕâÒ»ÐиÄΪÈçÏÂËùʾ£º
pf=YES
ÖØÆôϵͳËü¾Í¿ÉÒÔ¹¤×÷ÁË¡£
µ±È»ÄãÒ²¿ÉÒÔʹÓÃpfctl(8)Õâ¸ö³ÌÐòÀ´´ò¿ªºÍ¹Ø±ÕPF£º
pfctl ?e
pfctl ?d
ÕâÖ»ÊÇ´ò¿ªºÍ¹Ø±ÕPF£¬ Ëü²¢²»»á´ÓÅäÖÃÎļþÖе¼Èë¹æÔòÉèÖ᣹æÔòÉèÖÃÐèÒªÁíÍâµ¼È룬 ¿ÉÒÔÔÚPFÆô¶¯Ö®Ç°»òÖ®ºó¡£
[color=blue][size=4]Configuration[/size][/color]
PFÔÚrc½Å±¾ÖÐÆô¶¯Ê±´Ó/etc/pf.confÖе¼Èë¹æÔòÉèÖᣠ/etc/pf.confÊÇĬÈϵÄÅäÖÃÎļþ£¬ »á±»ÏµÍ³rc½Å±¾¼ÓÔØ½øÈ¥£» pfctl(8)»á¼ÓÔØ½âÎöÕâ¸öÎı¾Îļþ²¢½«Ëü²åÈëpf(4)ÖС£Èç¹û»¹ÓбðµÄ¹æÔòÁ´¿ÉÒÔÔÚÆô¶¯ºó¼ÓÈ롣ͬÆäËüunix³ÌÐòÒ»Ñù£¬ PFÓкܺõÄÊÊÓ¦ÐÔ¡£
pf.conf ÎļþÓÉÆß²¿·Ö×é³É£º
Macros: Óû§¿ÉÒÔΪ hold IP addresses¡¢ interface nameµÈ¶¨Òå±äÁ¿¡£
Tables: ΪÓÐЧʹÓõÄIPµØÖ·¶¨Òå½á¹¹¡£
Options: ¸÷ÖÖÑ¡Ïî¿ØÖÆPFÈçºÎ¹¤×÷¡£
Scrub: ÖØÐ¶ÔÊý¾Ý°ü½øÐй淶»¯²¢·ÖƬÕûÀí¡£
Queueing: ´ø¿í¹ÜÀí¼°Êý¾Ý°üÓÅÏȼ¶¹ÜÀí¡£
Translation: ¹ÜÀíÍøÂçµØÖ·×ª»»¼°Êý¾Ý°üת·¢¡£
Filter Rules: µ±Êý¾Ý°üͨ¹ý¶Ë¿ÚʱÔÊÐí¶ÔÊý¾Ý°ü½øÐйýÂ˺Í×èÈû¡£
³ýmacros and tablesÖ®Íâ, ±ðµÄÑ¡Ïî¶¼Ó¦¸Ã¾¡¿ÉÄܰüº¬ÖÐÅäÖÃÎļþÖС£
¿Õ°×ÐкöÂÔ£¬ ÒÔ#¿ªÍ·µÄÐе±³É×¢ÊÍ¡£
[color=blue][size=4]Control[/size][/color]
Æô¶¯ºó£¬ ¿ÉÒÔʹÓÃpfctl(8)À´¹ÜÀípf²Ù×÷¡£ÈçÏÂÃæµÄһЩÀý×Ó£º
# pfctl ?f /etc/pf.conf ÔØÈëpf.confÅäÖÃÎļþ
# pfctl ?nf /etc/pf.conf ½âÎö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 (8) manpage¡£
[color=blue][size=5]Lists and Macros[/size][/color]
[color=blue][size=4]Lists[/size][/color]
ListsÔÊÐíÄãÔÚÒ»Ìõ¹æÔòÖÐÖ¸¶¨ÀàËÆÀàÐ͵Ĺæ¸ñ˵Ã÷¡£ ÀýÈ磺¸÷ÖÖprotocols, ¶Ë¿ÚºÅ£¬ µØÖ·µÈ¡£ËùÒÔÔÚ¹ýÂ˹æÔòÖв»±ØÎªÃ¿Ò»¸öIPµØÖ·¶¼½øÐÐ×èÈû£¬ ¿ÉÒÔÓý«ÏêϸµÄIPµØÖ··ÅÔÚÒ»¸ölistsÖÐд½øÒ»Ìõ¹æÔòÁ´ÖС£Listsͨ³£¶¨ÒåÔÚ{ }À¨ºÅÖ®ÖС£
µ±pfctl(8)ÔØÈëµÄ¹æÔòÁ´ÖÐÓÐlistsʱ£¬ Ëü»á½«ËüÃǷֳɼ¸Ìõ¹æÔòÀ´Ö´ÐС£È磺
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
¸÷ÖÖlists¿ÉÒÔÏêϸµÄд½ø¹æÔòÁ´£¬ ²¢²»ÊÇÖ»ÄÜд½ø¹ýÂ˹æÔòÖС£
Rdr on fxp0 proto tcp from any to any port { 20 80 } -> \
192.168.0.6
block out on fxp0 proto { tcp udp } from { 192.168.0.1, \
10.5.32.6 } to any port { ssh telnet }
listsÖÐÿ¸öitemsÊÇËæÒâÅÅÁеġ£
[color=blue][size=4]Macros[/size][/color]
MacrosÓÃÀ´¸øIPµØÖ·¡¢¶Ë¿ÚºÅ£¬ ½Ó¿ÚÃûµÈ¶¨ÒåÒ»¸ö±ðÃû¡£Macros¿ÉÒÔ¼ò»¯ÉèÖÃPF¹æÔòÁ´µÄ¸´ÔÓÐÔ²¢Ê¹¹ÜÀí±äµÃ¸ü¼ÓÈÝÒס£
MacrosÃû³Æ±ØÐëÒÔ×Öĸ¿ªÍ·£¬ ¿ÉÒÔ°üº¬×Öĸ¡¢Êý×ÖºÍÏ»®Ïß¡£MacrosÃû³Æ²»ÄÜÊDZ£Áô¹Ø¼ü×ÖÈ磺pass¡¢out¡¢queueµÈ¡£
ext_if = ¡°fxp0¡±
block in on $ext_if from any to any
ÕâÀィÁËÒ»¸ömacro½Ðext_if£¬ Ò»¸ömacro¿ÉÒÔÔÚËü½¨Á¢ºó½øÐÐÒýÓ㬠µ«ËüÃû×Öǰ±ØÐëÓаüº¬$·ûºÅ¡£
Macros ͬÑù¿ÉÒÔ·¢Õ¹³ÉÒ»¸ölists£¬ È磺
friends = ¡°{ 192.168.1.1, 10.0.2.5, 192.268.43.53 }¡±
Macros¿ÉÒÔ½øÐеݹ鶨Òå¡£×Ô´ÓÒýºÅÄÚºêûÓÐÀ©Õ¹ÏÂÁÐÓï·¨±ØÐ뱻ʹÓãº
host1 = ¡°192.168.1.1¡±
host2 = ¡°192.168.1.2¡±
all_hosts = ¡°{¡°$host1 $host2 ¡°}¡±
ÏÖÔÚmacro $all_hosts±»À©Õ¹µ½£º192.168.1.1, 192,168.1.2¡£
[color=blue][size=5]PF: Tables[/size][/color]
[color=blue][size=4]Introduction[/size][/color]
TableÓÃÀ´¿ØÖÆÒ»×éIPv4 £¨ºÍ/»ò£© IPv6 µØÖ·¡£Ê¹ÓÃtable²éÕҷdz£¿ì£¬ Ëü»áÏûºÄºÜÉÙµÄÄÚ´æ²¢ÇÒÖ´ÐÐËٶȱÈlists¿ì¡£ÒòΪÕâÑù£¬ tableÔÚÒ»×é5000ÌõµØÖ·ÖеIJéÕÒËٶȱÈÒ»×é50ÌõµØÖ·ÖеIJéÕÒÖ»ÂýÒ»µãµã¡£TableÓÃÔÚfilter¡¢scrub¡¢ net¡¢redirectionµÈ¹æÔòµÄÔ´µØÖ·ºÍÄ¿µÄµØÖ·ÖУ¬µ«²»ÄÜÓÃÔÚnat¹æÔòÖеÄת·¢µØÖ·Öлòfileter¹æÔòÖеÄrouting optionsÖС£Table ¿ÉÒÔÔÚ/etc/pf.confÖд´½¨»òÀûÓÃpfctk(8)ʹÓá£
[color=blue][size=4]Configuration[/size][/color]
ÔÚpf.confÖУ¬ ʹÓÃtableÖ¸Áî´´½¨tables¡£ÏÂÃæÊÇÿ¸öÊôÐÔµÄÏêϸ˵Ã÷£º
const ? table½¨Á¢ºótableÖеÄÄÚÈݽ«²»Ôٸı䡣Èç¹û²»Ê¹ÓÃÕâ¸öÊôÐÔ£¬ pfctl(8)¿ÉÒÔËæÊ±´ÓtableÖÐÌí¼Ó»òɾ³ýµØÖ·£¬even when running with a securelevel(7) of two or greater.
persist ? ¼´Ê¹Ã»ÓÐÒ»Ìõ¹æÔòʹÓÃËü£¬ kernelÒ²½«Õâ¸ötable±£´æÔÚÄÚ´æÖС£Èç¹û²»Ê¹ÓÃÕâ¸öÊôÐÔ£¬ µ±×îºóÒ»¸ö¹æÔò²»ÔÚʹÓÃÕâ¸ötableʱ£¬ the kernel»á×Ô¶¯É¾³ýËü¡£
ÀýÈ磺
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
AddressesͬÑù¿ÉÒÔʹÓà ȡ·´£¨ or ¡°not¡± £©±êʾ·û£¬ È磺
table < goodguys > { 192.0.2.0/24, !192.0.2.5 }
goodguys table½«Æ¥Åä192.0.2.0/24Öгý192.0.2.5Ö®ÍâµÄËùÓеØÖ·¡£
Ìáʾ£ºtable nameͨ³£°üº¬ÔÚ< >À¨ºÅÄÚ¡£
TablesÒ²¿ÉÒÔÖÐÒ»¸öÎı¾ÎļþÖлñÈ¡IPµØÖ·ÁÐ±í¡£
Table < spammers > persist file ¡°/etc/spammers¡±
Block in on fxp0 from < spammers > to any
/etc/spammersÎļþÖÐÿһÐÐÓ¦¸Ã°üº¬Ò»ÌõIP µØÖ·¡£Èç¹ûÓÐÐÐÒÔ#¿ªÍ·½«µ±×÷×¢ÊͺöÂÔµô¡£
[color=blue][size=4]Manipulating with pfctl[/size][/color]
¿ÉÒÔʹÓÃpfctl(8)À´´¦Àítables¡£ ÈçÕâ¸öÀý×Ó£º
# pfctl ?t spammers ?Tadd 218.70.0.0/16
Èç¹û< spammers >table²»´æÔÚ½«´´½¨Ëü¡£ÏÔʾtableÖеØÖ·£º
# pfctl ?t spammers ?Tshow
-v Ñ¡Ïîͬ¿ÉÒÔºÍ ?TshowÒ»ÆðÓÃÀ´ÏÔʾͳ¼ÆÃ¿Ò»¸ötable¡£´ÓtableÖÐɾ³ýµØÖ·£º
# pfctl ?t spammers ?Tdelete 218.70.0.0/16
ÏëÁ˽â¸ü¶à¹ØÓÚpfctl¿ØÖÆtablesµÄÐÅÏ¢¿ÉÒԲ鿴 pfctl(8)¡£
[color=blue][size=4]Specifying Addresses[/size][/color]
³ýÁËIPµØÖ·±»Ö¸¶¨Í⣬ Ò²¿ÉÒÔʹÓÃÖ÷»úÃûÖ¸¶¨Ö÷»ú¡£µ±Ò»¸öÖ÷»úÃû½âÎö³ÉIP µØÖ·Ê±£¬ IPV4ºÍIPV6µÄ½á¹û¶¼°üº¬ÔÚÒ»¸ötableÀï¡£¿ÉÒÔΪIP µØÖ·Ö¸¶¨Ò»¸öÓÐЧµÄ½Ó¿ÚÃû¼ÓÈëµ½tableÖУ¬ »òÔÚΪËùÓеĵØÖ·Ö¸¶¨½Ó¿Ú¹Ø¼ü×ÖµÄÇé¿öϼÓÈëµ½tableÖС£(ÔÎÄ£ºIP addresses can also be entered into a table by specifying a valid interface name or the self keyword in which case all addresses assigned to the interface(s) will be added to the table.)
[color=blue][size=4]Address Matching[/size][/color]
¶ÔtableÖеĵØÖ·²éÕÒ½«·µ»Ø¾«Ï¸µÄÆ¥Åä¡£ËüÔÊÐíÕâÑù´´½¨tbales:
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½Ó¿Ú½øÀ´µÄÈκÎÊý¾Ý°ü½«°ÑËüµÄÔ´µØÖ·Óëtable <goodguys>½øÐÐÆ¥Åä¡£
172.16.50.5 ? ¾«È·Æ¥Å䣺172.16.0.0/16£» Êý¾Ý°üÆ¥Åätables£¬ ½«Í¨¹ý¡£
172.16.1.25 ? ¾«È·Æ¥Å䣺!172.16.1.0/24£» Æ¥Åä172.16.1.0/24£¬ µ«Õâ¸öµØÖ·ÊÇÈ¡·´²Ù×÷£¬ Ò²¾ÍÊÇÆ¥Åä172.16.1.0/24µÄÊý¾Ý°ü¶¼²»ÄÜͨ¹ý£¬ ËùÒÔÕâ¸öÊý¾Ý°ü²»ÄÜͨ¹ý¡£
172.16.1.100 ? Æ¥Å䣺172.16.1.100£» Êý¾Ý°üͨ¹ý¡£
10.1.4.55 ? ûÓÐÆ¥Å乿Ôò£¬ ½«×èÈû¡£
[color=blue][size=4]PF: Options[/size][/color]
OptionsÓÃÀ´¿ØÖÆPFµÄ²Ù×÷¡£OptionsÖ¸¶¨ÓÃÔÚ/etc/pf.confÀïÉèÖÃÖ¸Áî¡£
[color=blue][size=3]Set block-policy[/size][/color]
Ϊfilter rulesÉèÖÃȱʡÐÐΪ£º×èÈû¶¯×÷
drop ? Êý¾Ý°üĬĬµØdrop¡£
return ? TCP RSTÊý¾Ý°ü·µ»ØÒ»¸ö×èÈûµÄTCP°ü£¬ICMP UNREACHABLE °ü·µ»Ø×èÈûµÄUDP°ü¡£ÆäËüµÄ°ü½«silently dropped¡£
×¢Ò⣺µ¥¸öµÄfilter rules¿ÉÒÔÔ½¹ýȱʡ»ØÓ¦¡£
[color=blue][size=3]Set limit[/size][/color]
flags ? ÄÚ´æ³ØÖÐÊý¾Ý°üÖØÐÂ×é×°µÄ×î´óÊý£¨Îªscrub rulesÉèÖã©¡£È±Ê¡5000¡£
states ? ÄÚ´æ³ØÖб£´æÊ¹ÓõÄÈ«¾Ötable״̬µÄ×î´óÊý£¨flter rulesÖ¸¶¨´æÔÚµÄ״̬£©¡£È±Ê¡£º10000¡£
[color=blue][size=3]Set loginterface int[/size][/color]
ÉèÖÃPFÊÕ¼¯Í³¼ÆÊý¾ÝÈ磺bytes in/out and packets passed/blockedʱʹÓõĽӿڡ£½ö½öÿ´ÎΪһ¸ö½Ó¿Úͳ¼ÆÊÕ¼¯Êý¾Ý£¬ ÈçÆ¥Å乿Ôò£¬ »µÆ«ÒÆÁ¿µÈ¡£²»¹Üloginterface ÊÇ·ñ±»ÉèÖ㬠¼ÆÊýÆ÷ºÍtable¼ÆÊýÆ÷¶¼½«±»¼Ç¼¡£
[color=blue][size=3]Set optimization[/size][/color]
ÔÚÏÂÃæµÄÍøÂç»·¾³ÖÐÓÅ»¯PF£º
normal ? ÊÊÓÃÓÚËùÓеÄÍøÂ磬 Õâ¸öÊÇȱʡµÄ¡£
high-latency ? ÓÃÓÚÈçÈËÔìÎÀÐǵȸ߷´Ó¦Ê±¼äµÄÍøÂç¡£
aggressive ? ѸËÙÈ¥ÖÐstate tableÀïÖÕÖ¹Á¬½Ó¡£ÔÚ·±Ã¦µÄ·À»ðǽð×ÅÈ¥µôÎÞÓÃÁ¬½ÓµÄ·çÏÕÀ´¼õÉÙÄÚ´æÐèÇó¡£
conservative ? ¼«±£ÊصÄÉèÖá£Õâ±ÜÃâÔÚʹÓøü¶àµÄÄÚ´æÇé¿öÏÂÈ¥µôÎÞÓÃÁ¬½Ó²¢ÉÔ΢Ôö¼ÓÁË´¦ÀíÆ÷µÄʹÓÃÂÊ¡£
[color=blue][size=3]Set timeout[/size][/color]
interval ? Çå³ýÖÕÖ¹µÄ״̬ºÍÊý¾Ý°üË鯬µÄÃëÊý¡£
flag ? δ×é×°µÄ·ÖƬÖÕÖ¹ÃëÊý¡£
Examples:
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
[color=blue][size=5]PF:Scrub[/size][/color]
[color=blue][size=4]Introduction[/size][/color]
¡°Scrubbing¡±ÊÇÊý¾Ý°ü±ê×¼»¯¡¢Õý³£»¯£»Ê¹µ½µ½´ï×îÖÕÄ¿µØµØµÄÊý¾Ý°ü½âÊÍûÓÐÆçÒå¡£ScrubÖ¸ÁîÒ²¿ÉÒÔÖØÐÂ×éºÏ·ÖƬµÄÊý¾Ý°ü£¬×èֹһЩ²Ù×÷ϵͳ¹¥»÷µÄÐÎʽ£¬È¥µôº¬ÓÐÎÞÓÃflag×éºÏµÄTCPÊý¾Ý°ü¡£ÈçÏÂÃæ¼òµ¥µÄscrubÖ¸Á
scrub in all
Õ⽫ÇåÀíËùÓж˿ڽøÀ´µÄÊý¾Ý°ü¡£
Èç¹ûͨ¹ýPFʹÓÃÒ»¸öNFS´«Ê䣬 ÄDz»ÄÜÔÚÒ»¸ö½Ó¿ÚÉÏʹÓÃscrub¡£Ò»Ð©·Çopenbsdϵͳƽ̨·¢ËÍ£¨and expect£©Ææ¹ÖµÄÊý¾Ý°ü ? ·ÖƬÊý¾Ý°üûÓÐÉèÖá°do not fragment¡±Î»£¬Ëü£¨¿ÉÄܻᣩ¾Ü¾øÊ¹ÓÃscrubÕûÀí¡£ÕâÄÜʹÓÃno-dfÑ¡Ïî½â¾ö¡£±ðµÄÔÒò£ºÒ»Ð©¶àýÌåÓÎÏ·³ÌÐòÔÚͨ¹ýÒ»¸öʹÓÃÁËscrubÉèÖõÄPF·À»ðǽʱÁ¬½Ó»áÓÐÎÊÌâ¡£³ýÁËÕâЩ²»Æ½³£µÄÔÒòÍ⣬scrubbing all packets±»×ÅÖØÍÆ¼öʹÓõġ£
ScrubÖ¸ÁîÓï·¨Óëfiltering Óï·¨ºÜÏàËÆ£¬Ê¹ÓÃËü¿ÉÒÔºÜÈÝÒ×µØÑ¡ÔñÇåÀí¿É¿¿µÄÊý¾Ý°üºÍÆäËüµÄÊý¾Ý°ü¡£
ÏÂÃæµÄÁ´½ÓÓиü¶à¹ØÓÚscrubµÄÔÀíºÍ½éÉÜ£º£¨ÎÄÕÂÃû£ºÍøÂçÈëÇÖ¼ì²â£©
[url]http://www.icir.org/vern/papers/norm-usenix-sec-01-html/index.html[/url]
[color=blue][size=4]Options[/size][/color]
ScrubÓÐÏÂÃæÒ»Ð©Ñ¡Ï
[color=red]no-df[/color]
´ÓIPÊý¾Ý°üÍ·ÇåÀídon¡¯t fragmentλ¡£Ò»Ð©²Ù×÷ϵͳ²úÉúÉèÖÃÁËdon¡¯t fragmentλµÄ·ÖƬÊý¾Ý°ü¡£NFSÊÇ×îÃ÷ÏԵģ¡scrubÈç¹û²»ÉèÖÃno-dfÑ¡ÏÇå³ýËùÓÐÕâЩÊý¾Ý°ü¡£Ò»Ð©²Ù×÷ϵͳ²úÉúÔÚÆ¬Í·°üº¬ÁËÒ»¸özero IP identificationµÄdon¡¯t fragmentÊý¾Ý°ü¡£ÍƼöno-df ºÍrandom-id½áºÏÔÚÒ»ÆðʹÓá£
[color=red]random-id[/color]
½«Ä³Ð©²Ù×÷ϵͳ·¢Ë͵½ÍâÃæµÄÊý¾Ý°üÖÐIP identification fieldÖÐʹÓõÄËæ»úÊýÖµÌæ»»³ÉÒ»¸ö¿ÉÔ¤¼ûµÄÖµ¡£Õâ¸öÑ¡ÏîÊÊÓÃÓÚÏòÍâ·¢ËÍÔÚËæÒâÖØÐÂ×éºÏºóûÓÐ·ÖÆ¬µÄÊý¾Ý°ü¡£
[color=red]min-ttl num[/color]
Ç¿ÖÆ·ÅÒ»¸ö×îС Time To Live ( TTL )µ½IPÊý¾Ý°ü°üÍ·¡£
[color=red]max-mss num[/color]
Ç¿ÖÆ·ÅÒ»¸ö×î´óMaximum Segment Size ( MSS )µ½TCPÊý¾Ý°ü°üÍ·¡£
[color=red]fragment reassemble[/color]
ÔÚͨ¹ýfilter engineǰ½«»º³åÇø½øÀ´µÄ·ÖƬ°üÖØÐÂ×éºÏ³ÉÒ»¸öÍêÕûµÄÊý¾Ý°ü¡£ÕâÑù×öµÄÓÅÊÆÊÇfilter rulesÖ»´¦ÀíÍêÕûµÄÊý¾Ý°ü¶ø¿ÉÒÔºöÂÔ·ÖÆ¬Êý¾Ý°ü£¨Ë鯬°ü£©¡£È±µãÊÇÐèÒªÔö¼ÓÄÚ´æÈÝÁ¿À´»º³å·ÖƬÊý¾Ý°ü¡£µ±Ã»ÓÐfragmentÑ¡ÏîÖ¸¶¨Ê±Õâ¸öÊÇȱʡÉèÖá£Ò²Ö»ÓÐÕâ¸öfragment Ñ¡ÏîÄÜÓëNATÒ»Æð¹¤×÷¡£
[color=red]fragment crop[/color]
Ö÷ÒªÓÃÓÚ½«ÏàͬµÄ·ÖƬÅׯúºÍ²ÃÇÐһЩ½»µüµÄ·ÖƬ¡£²¢²»Ïñ·ÖÆ¬ÖØ×飬µ½´ïµÄ·ÖƬ²¢²»½øÐлº³å¶øÊǾ¡¿ìµÄͨ¹ý¡£
[color=red]fragment drop-ovl[/color]
Óëfragment cropÏàËÆ£¬»á¸ü½øÒ»²½½«ÏàÓ¦µÄ·ÖƬµÄËùÓÐÏàͬ»òÖØµþµÄ·ÖƬÅׯú¡£
Example:
Scrub in on fxp0 all fragment reassemble min-ttl 15 max-mss 1400
[color=blue][size=5]PF: Queueing[/size][/color]
[color=blue][size=4]Queueing[/size][/color]
ÔڵȺò´¦Àíʱ½«Ò»Ð©ÐÅÏ¢½øÐд洢¡¢ÅÅÐò¡£ÔÚ¼ÆËã»úÍøÂçÀµ±Êý¾Ý°ü´ÓijÖ÷»úÉÏ·¢ËͳöÀ´£¬ÔڵȺò²Ù×÷ϵͳ´¦ÀíʱËüÃǽøÈëÒ»¸ö¶ÓÁС£²Ù×÷ϵͳ½«¾ö¶¨¶Ôij¶ÓÁлòij¶ÓÁÐÉϵÄÊý¾Ý°ü½øÐд¦Àí¡£ÍøÂçÐÔÄÜÓ°Ïì²Ù×÷ϵͳ´¦ÀíÊý¾Ý°üµÄ˳Ðò¡£ÀýÈ磺ÏëÏñÒ»¸öÓû§ÕýÔÚÔËÐÐÁ½¸ö³ÌÐò£ºSSHºÍFTP¡£Ö±¹ÛµØ£¬ ÓÉÓÚSSHµÄthe time-sensitiveÐÔÖÊ£¬SSHÊý¾Ý°ü½«±ÈFTPÊý¾Ý°ü½øÐÐÓÅÏÈ´¦Àí£»µ±¿Í»§¶ËʹÓÃÒ»¸öKEYÁ¬½Óµ½·þÎñÆ÷ʱ£¬ Á¢¿ÌÓÐÒ»¸ö»ØÓ¦£¬µ«FTP´«ÊäÈ´¼¸ºõÒòÈκÎ֪ͨ¶øÑÓ³ÙÁ˼¸ÃëÖÓ¡£ÄÇô·ÓÉÆ÷ÔÚ´¦ÀíSSHÁ¬½ÓÊý¾Ý°üǰÊÇÈçºÎ´¦ÀíFTPÁ¬½ÓÊý¾Ý°üµÄÄØ£¿SSHÁ¬½ÓÊý¾Ý°ü½«±£³Ö½øÒ»¸ö¶ÓÁУ¨»òÈç¹û¶ÓÁÐûÓÐ×ã¹»µÄ¿Õ¼ä´æ´¢ËùÓÐÊý¾Ý°üµÄ»°£¬ ·ÓÉÆ÷¿ÉÄÜÅׯúһЩÊý¾Ý°ü£©ºÍSSH»á»°¿ÉÄܳöÏÖÖͺó»ò¶Ï¿ª¡£¸Ä½ø¶ÓÁеIJßÂÔÔËÓã¬Ê¹ÍøÂç´ø¿íÔÚ²»Í¬µÄ³ÌÐò¡¢Óû§ºÍµçÄÔ¼ä½øÐй²Ïí¡£
×¢Òâ¶ÓÁÐÖ»ÄÜÓÃÓÚ·¢ËÍÍùÍâÃæµÄÊý¾Ý°üÉÏ¡£µ±´ÓÒ»¸ö½Ó¿Ú½øÀ´µÄÊý¾Ý°üÒÑÌ«³Ù¶ÔËü½øÐÐÅÅÁÐÁË ? ÔÚ´Ó½Ó¿Ú´¦½ÓÊÕËüʱÒÑÏûºÄÁËÍøÂç´ø¿í¡£Î¨Ò»µÄ½â¾ö·½°¸ÊÇ£ºÔÚÁÚ½üµÄ·ÓÉÆ÷ÉÏÆôÓöÓÁУ¬»òÈç¹ûÒ»¸öÊÕµ½Êý¾Ý°üµÄÖ÷»úÆð´úÀí·ÓÉÆ÷µÄ×÷Ó㬶ԴæÔÚÓÚ·ÓÉÆ÷ÄÚ²¿½Ó¿ÚÉϵÄÊý¾Ý°ü½øÐÐÅÅÁС£
[color=blue][size=4]Schedulers[/size][/color]
µ÷¶È³ÌÐò¾ö¶¨¶Ô¶ÓÁнøÐд¦ÀíºÍÅÅÐò¡£OpenBSDĬÈÏÇé¿öÏÂʹÓÃFirst In First Out ( FIFO )µ÷¶È³ÌÐò¡£FIFO¶ÓÁоÍÏñÔÚ³¬ÊлòÒøÐÐÀïÅŶӵȺò´¦ÀíÒ»Ñù ? ¶ÓÁеĵÚÒ»×éµÚÒ»¸ö´¦Àí¡£Ðµ½µÄÊý¾Ý°ü½«¼Óµ½¶ÓÁеÄβ¶Ë¡£Èç¹ûÒ»¸ö¶ÓÁÐÅÅÂú£¬ е½µÄÊý¾Ý°ü½«±»Åׯú¡£Õâ¾ÍÊǶÓβÅׯú¡£
OpenBSDÖ§³ÖÁ½¸ö¶îÍâµÄµ÷¶È³ÌÐò£º
Class Based Queueing
Priority Queueing
[color=blue][size=4]Class Based Queueing[/size][/color]
Class Based Queueing ( CBQ )ÊÇÒ»¸ö¶ÓÁÐËã·¨£¬ÓÃÀ´Çø·ÖÍøÂçÁ¬½ÓµÄ´ø¿íÖеĶàÑùµÄ¶ÓÁлòclasses¡£Ã¿¸ö¶ÓÁлùÓÚÔ´µØÖ·»òÄ¿µÄµØÖ·¡¢¶Ë¿ÚºÅ»òÍøÂçÐÒéµÈ·ÖÅä¡£¶ÓÁпÉÒÔËæÒâµÄ´Ó¿ÉÒÔÀûÓõĸ¸¶ÓÁÐÀï·ÖÅäµ½´ø¿í¡£¿ÉÒÔ¸ø½»»¥Ê½µÄ´«Êä¶ÓÁÐÓÅÏÈȨ£¬ÈçSSH£¬¿ÉÒÔÏÈ´¦Àí´óµÄÊý¾Ý°ü£¬ÈçFTP¡£
CBQ±»°²ÅŽøÒ»¸ö·ÖµÈ¼¶µÄÑùʽÖС£ÔÚ¶¥²ãµÄroot¶ÓÁж¨ÒåÁËÈ«²¿µÄ´ø¿í¡£ ×Ó¶ÓÁÐÔÚroot¶ÓÁÐϽ¨Á¢£¬Ã¿¸ö×Ó¶ÓÁпÉÒÔ´Óroot¶ÓÁзֵÃÒ»²¿·Ö´ø¿í¡£ÀýÈ磺ÏñÏÂÃæÕâÑù¶¨Òå¶ÓÁУº
Root Queue ( 2 Mbps )
Queue A ( 1 Mbps )
Queue B ( 500 Kbps )
Queue C ( 500 Kbps )
ÔÚÕâÀýÖУ¬ ×Ü´ø¿íÉèÖÃΪ2 megabits per second( Mbps )¡£½«Õâ¸ö´ø¿í·ÖÅ䏸Óë3¸ö×Ó¶ÓÁС£
¸ü½øÒ»²½Ê¹Óòã´Î¶Ô¶ÓÁж¨Òå¡£ÔÚ²»Í¬Óû§¼ä¹«Æ½µÄ·ÖÅä´ø¿íºÍ·ÖÀàËûÃǵĴ«ÊäÒԱ㲻ÖÂÓÚʹÓÃijÐÒéµÄ´«Êä·ÖÅä²»µ½´ø¿í£¬¶ÓÁнṹÈçÏÂËùʾ£º
Root Queue (2Mbps)
UserA (1Mbps)
ssh (50Kbps)
bulk (950Kbps)
UserB (1Mbps)
audio (250Kbps)
bulk (750Kbps)
http (100Kbps)
other (650Kbps)
·ÖÅ䏸×Ó¶ÓÁеĴø¿íµÄºÍ²»ÄÜ´óÓÚËüÃǸ¸¶ÓÁÐËù·Öµ½µÄ´ø¿í¡£
¿ÉÒÔ¶¨ÒåÒ»¸ö¶ÓÁнèÓø¸¶ÓÁÐûÓзÖÅ䏸ÆäËü×Ó¶ÓÁеĹýÊ£´ø¿í¡£¹Û²ìÈç϶ÓÁеÄÉèÖãº
Root Queue (2Mbps)
UserA (1Mbps)
ssh (100Kbps)
ftp (900Kbps, borrow)
UserB (1Mbps)
Èç¹ûFTP´«Êä¶ÓÁÐʹÓó¬¹ýÁË900Kbps´ø¿í£¬¶øÓû§AµÄ´«Êä¶ÓÁÐʹÓõĴø¿íÉÙÓÚ1Mbps(ÒòΪSSH´«Êä¶ÓÁÐʹÓõĴø¿íÉÙÓÚ·ÖÅäµÄ100Kbps)£¬FTP´«Ê佫´ÓÓû§AÀï½èÓÃʣϵĴø¿í¡£ÕâÑù£¬ FTP¶ÓÁпÉÒÔʵ¼ÊʹÓõĴø¿í³¬¹ý±íÃæ·ÖÅ䏸ËüµÄ´ø¿í¡£µ±SSH¶ÓÁÐÐèÒªÔö¼Ó´ø¿íʱ£¬ ½è³öÈ¥µÄ´ø¿í½«±»»¹»ØÀ´¡£
CBQ¿ÉÒÔΪÿ¸ö¶ÓÁÐÖ¸¶¨ÓÅÏÈȨ¡£ÔÚͬÑùµÄ¸¸¶ÓÁÐÏ£¬ ÔÚÓµÈûÇé¿öÏ£¨»»¾ä»°Ëµ£¬ÔÚÒ»²ã´Î·ÖÖ§Ï£©¸ßÓÅÏÈȨ¶ÓÁбȵÍÓÅÏÈȨ¶ÓÁÐÓÅÏÈ´¦Àí¡£¶ÓÁоßÓÐÏàͬµÄÓÅÏÈȨ½«Ñ»·´¦Àí£¬ÀýÈ磺
Root Queue (2Mbps)
UserA (1Mbps, priority 1)
ssh (100Kbps, priority 5)
ftp (900Kbps, priority 3)
UserB (1Mbps, priority 1)
CBQ½«Ñ»·´¦ÀíUserAºÍ UserB¶ÓÁÐ ? ÿ¸ö¶ÓÁж¼ÊÇÊ×Ñ¡¡£ÔÚ´¦ÀíUserA¶ÓÁÐʱ£¬CBQ½«Í¬Ñù´¦ÀíËüµÄ×Ó¶ÓÁС£ÔÚÕâÀ SSH¶ÓÁоßÓиߵÄÓÅÏÈȨ²¢ÔÚÍøÂ緱æʱ±ÈFTP¶ÓÁÐÓÅÏÈ´¦Àí¡£×¢Ò⣺SSH¶ÓÁкÍFTP¶ÓÁÐΪʲô²»ÄÜͬUserA ºÍUserB¶ÓÁнøÐÐÓÅÏÈȨ±È½Ï£¬ ÒòΪËüÃÇ´¦ÓÚ²»Í¬µÄÓÅÏÈȨ·ÖÖ§ÉÏ¡£
Ïë¸ü½øÒ»²½Á˽âµÄCBQÏêϸ˵Ã÷ºÍÀíÂÛ£¬¿É·ÃÎÊÕâ¸öÍøÕ¾¡£ [color=blue][size=4]Priority Queueing[/size][/color]
Priority Queueing ( PRIQ )ÎªÍøÂç½Ó¿ÚµÄ¸÷Ñù¶ÓÁÐÖÐÿһ¸ö¶ÓÁзÖÅäΨһµÄÓÅÏÈȨ¡£¾ßÓиßÓÅÏÈȨµÄ¶ÓÁÐͨ³£ÔÚµÍÓÅÏÈȨ¶ÓÁÐǰ´¦Àí¡£
PRIQÀïµÄ¶ÓÁнṹºÜ¸É´à ? Äã²»ÄÜÔÚ¶ÓÁÐÖÐÔÙ¶¨Òå¶ÓÁС£root¶ÓÁÐÉèÖÃΪӵÓÐÈ«²¿´ø¿í£¬×Ó¶ÓÁÐÖ±½Ó´Óroot¶ÓÁÐ϶¨Òå¡£¿¼ÂÇÏÂÃæÀý×Ó£º
Root Queue (2Mbps)
Queue A (priority 1)
Queue B (priority 2)
Queue C (priority 3)
root¶ÓÁж¨ÒåΪº¬ÓÐ2MbpsµÄ´ø¿í²¢ÇÒËüÏÂÃæ¶¨ÒåÁË3¸ö×Ó¶ÓÁС£¾ßÓÐ×î¸ßÓÅÏÈȨµÄ£¨ÓÐ×î¸ßÓÅÏÈȨÊý×Ö£©¶ÓÁб»Ê×ÏÈ·þÎñ¡£µ±ÄǸö¶ÓÁÐÖеÄËùÓÐÊý¾Ý°ü´¦ÀíÍêºó£¬ »òÄǸö¶ÓÁÐΪ¿Õ£¬PRIQÒÆµ½¾ßÓеڶþÓÅÏÈȨµÄ¶ÓÁнøÐд¦Àí¡£ÔÚ¸ø¶¨µÄ¶ÓÁÐÖУ¨·ÒëÕß¼Ó£ºÔÚ½øÐд¦ÀíµÄ¶ÓÁÐÖУ©£¬ Êý¾Ý°üÒÔFirst In First Out£¨FIFO£©½øÐд¦Àí¡£
ÖØÒªÌáʾ£ºµ±Ê¹ÓÃPRIQʱÄã±ØÐëСÐĵļƻ®¶ÓÁС£ÒòΪPRIQͨ³£ÓÅÏÈ´¦ÀíÓÅÏÈȨ½Ï¸ßµÄ¶ÓÁУ¬µ±¾ßÓиßÓÅÏÈȨ¶ÓÁгÖÐø½ÓÊÕÊý¾Ý°üʱ¿ÉÄܻᵼÖµÍÓÅÏÈȨµÄ¶ÓÁеÄÊý¾Ý°ü±»ÑÓ³Ù»òÅׯú¡£
[color=blue][size=4]Random Early Detection[/size][/color]
Random Early DetectionÊÇÓµÈû»Ø±ÜËã·¨¡£ËüµÄ¹¤×÷ÊDZÜÃâÍøÂçÓµÈûÒÔ±£Ö¤¶ÓÁв»±»ÌîÂú¡£Ëü²»¶ÏµØ¼ÆËã¶ÓÁÐµÄÆ½¾ù³¤¶È²¢ÓëÁ½¸öthreshold(×îСµÄshresholdºÍ×î´óµÄthreshold)½øÐбȽϡ£µ±¶ÓÁÐµÄÆ½¾ù³¤¶ÈСÓÚ×îСthresholdʱûÓÐÊý¾Ý°ü±»Åׯú¡£µ±Æ½¾ù³¤¶È´óÓÚ×î´óthresholdʱËùÓÐе½´ïµÄÊý¾Ý°ü¶¼±»Åׯú¡£µ±Æ½¾ù³¤¶ÈÔÚÁ½ÕßÖ®¼äʱ£¬ ¿ÉÄÜ»á»ùÓÚ¼ÆËã¶ÓÁÐµÄÆ½¾ù³¤¶ÈÀ´ÅׯúÊý¾Ý°ü¡£»»¾ä»°Ëµ£¬ µ±¶ÓÁÐÆ½¾ù³¤¶È±Æ½ø×î´óthresholdʱ£¬ ´óÁ¿µÄÊý¾Ý°ü»á±»Åׯú¡£µ±ÅׯúÊý¾Ý°üʱ£¬ REDËæ»úµØÅׯúij¸öÁ¬½ÓÖеÄÊý¾Ý°ü¡£Ê¹ÓôóÁ¿´ø¿íµÄÁ¬½ÓµÄÊý¾Ý°üÓиü¸ßµÄ¿ÉÄÜÐÔ±»Åׯú¡£
RED·Ç³£ÓÐÓã¬Ëü¿ÉÒÔ±ÜÃâÈ«¾Öͬ²½£¬ÔÚÍøÂç´«Ê䱬·¢µÄÇé¿öϽøÐе÷½Ú¡££¨Óе㲻Çå³þ£¬ ÇëÖ¸Õý¡£ÔÎÄ£ºRED is useful because it avoids a situation known as global synchronization and it is able to accommodate bursts of traffic£©¡£ÓÉÓÚͬһʱ¿ÌÈô¸ÉÁ¬½ÓÖÐÓÐÊý¾Ý°ü»áÅׯú£¬È«¾Öͬ²½£¨Global synchronization£©ÌṩÁËÈ«²¿ÍÌÍÂÁ¿µÄ½µµÍ×´¿ö¡£ÀýÈ磬ÔÚÍøÂçÓµÈû³öÏÖʱ£¬Â·ÓÉÆ÷Ϊ10¸öFTPÁ¬½Ó½øÐд«Ê䣬 ÕâЩÁ¬½ÓµÄÊý¾Ý°ü±»³ýÊýÅׯú£¨ÔÚʹÓÃFIFOµÄ¶ÓÁÐÖУ©£¬È«²¿ÍÌÍÂÁ¿»á¼±¾çµØÅׯú¡£Õâ²¢²»ÊÇÀíÏëÇé¿ö£¬ ÒòΪËü»á¼õÉÙËùÓÐFTPÁ¬½ÓµÄÍÌÍÂÁ¿£¬Ò²¾ÍÊÇËµÍøÂç²»ÔÙÄÜ·¢»Ó³ö×î´óµÄDZÁ¦¡£REDÌá¹©Ëæ»úµØ´Óij¸öÁ¬½ÓÖÐÅׯúÊý¾Ý°üÀ´Ìæ´úÉÏÃæµÄÑ¡Ôñ¡£Ê¹Óøߴø¿íµÄÁ¬½ÓµÄÊý¾Ý°üÔ½ÓпÉÄܻᱻÅׯú¡£ÕâÑù£¬¸ß´ø¿íµÄÁ¬½Ó±»½ÚÁ÷£¬ÓµÈû»á±ÜÃ⣬ȫ²¿ÍÌÍÂÁ¿Ã÷ÏԵĽµµÍ½«²»»á³öÏÖ¡£ÁíÍ⣬REDÄÜ´¦Àí±¬·¢ÍøÂç´«Ê䣬ÒòΪÔÚ¶ÓÁл¹Ã»ÅÅÂúǰËüÒÑ¿ªÊ¼ÅׯúÊý¾Ý°ü¡£µ±ÆÙ·¢´«Êäµ½À´Ê±ËüÒÑÓÐ×ã¹»µÄ¿Õ¼äÀ´´æ´¢Ðµ½µÄÊý¾Ý°ü¡£
µ±´«ÊäÐÒé¿ÉÄÜ·´Ó¦ÍøÂç³öÏÖ±¬·¢Çé¿öʱRED»á±»Ó¦Óá£Õâ¾ÍÊÇ˵ÔÚ´ó¶àÊýÇé¿öÏÂREDÓ¦¸ÃÓ¦ÓÃÓÚTCP´«Êä¶ø²»ÊÇUDP»òICMP´«Êä¡£
ÏëÁ˽â¸ü¶à¹ØÓÚREDµÄÔÀíºÍ¼¼Êõ¿É·ÃÎÊÕâ¸öÍøÕ¾¡£
[color=blue][size=4]Explicit Congestion Notification[/size][/color]
Explicit Congestion Notification(ECN)ÓëREDÒ»Æð¹¤×÷£¬ ͨ±¨Á½Ì¨Í¨ÐŵÄÖ÷»úÖеÄÓµÈûµÄͨÐÅ·¾¶¡£ËüÔÊÐíREDÔÚÊý¾Ý°ü°üÍ·ÉèÖÃÒ»¸ö±ê¼ÇÀ´Ìæ´ú½«Êý¾Ý°üÅׯú¡£·¢ËÍÖ÷»úÓÐÖ§³ÖECN£¬ Ëü¿ÉÒÔ¶ÁÈ¡Õâ¸ö±ê¼ÇÒò´ËÀ´½ÚÁ÷ËüµÄÍøÂç´«Êä¡£
¸ü¶àµÄECNÐÅÏ¢¿É²é¿´RFC 3168¡£
[color=blue][size=4]Configuring Queueing[/size][/color]
×Ô´ÓOpenBSD3.0¿ªÊ¼£¬ Alternate Queueing( ALTQ )×÷Ϊ»ù±¾ÏµÍ³Ö´ÐеÄÒ»²¿·Ö¡£´ÓOpenBSD 3.3¿ªÊ¼ÒÑÕûºÏ½øPFÀïÁË¡£OpenBSDÉϵÄALTQʵÏÖÖ§³Öthe Class Based Queueing(CBQ)ºÍPriority Queueing(PRIQ)µ÷¶È³ÌÐò¡£ËüͬÑùÖ§³ÖRandom Early Detection(RED)ºÍExplicit Congestion Notification(ECN)¡£
ÒòΪALTQÒѺϲ¢µ½PFÀïÁË£¬ËùÒÔPF±ØÐëÆôÓöÓÁС£ÔÚÅäÖÃÒ»½ÚÖÐÓÐÈçºÎÆô¶¯PF¹¤×÷µÄ½éÉÜ¡£
Queueing ÔÚ/etc/pf.confÀïÅäÖá£ÕâÀïÓÐÁ½¸öÖ¸ÁîÓÃÀ´ÅäÖöÓÁУ¨queueing£©¡£
altq on ? ÔÚÒ»¸ö½Ó¿ÚÉÏÆô¶¯¶ÓÁУ¬¶¨ÒåʹÓÃÄĸöµ÷¶È³ÌÐòºÍ´´½¨root¶ÓÁС£
queue ? Ϊ×Ó¶ÓÁж¨ÒåÌØÐÔ¡£
altq on Ö¸ÁîµÄÓ﷨Ϊ£º
altq on interface scheduler bandwidth bw qlimit qlim \
tbrsize size queue { queue_list }
interface ? ¶ÓÁÐʹÓõÄÍøÂç½Ó¿Ú¡£
scheduler ? ʹÓõĶÓÁе÷¶È³ÌÐò¡£¿ÉÄܵÄÖµÓÐcbqºÍpriq¡£Ò»¸öʱ¼äÒ»¸ö½Ó¿ÚÉÏÖ»ÄÜʹÓÃÒ»ÖÖµ÷¶È³ÌÐò¡£
bw ? µ÷¶È³ÌÐòÄÜʹÓõÄ×Ü´ø¿í¡£This may be specified as an absolute value using the suffixes b, Kb, Mb, and Gb to represent bits, kilobits, megabits, and gigabits per second, respectively or as a percentage of the interface bandwidth¡£
qlim ? ¶ÓÁб£´æµÄÊý¾Ý°üµÄ×î´óÊý¡£Õâ¸ö²ÎÊýÊÇ¿ÉÑ¡ÔñµÄ£¬ ĬÈÏΪ50¡£
size ? ʹÓÃ×Ö½ÚÉèÖÃthe token bucket regulatorµÄ´óС¡£Èç¹û²»Ö¸¶¨£¬Õâ¸ö´óС½«»ùÓڽӿڵĴø¿í¡£
queue_list ? ÔÚroot¶ÓÁÐÏ´´½¨µÄ×Ó¶ÓÁÐÁÐ±í¡£
ÀýÈ磺
altq on fxp0 cbq bandwidth 2Mb queue { std, ssh, ftp }
Õâ¸öÔÚfxp0½Ó¿ÚʹÓÃCBQ£¬ ×Ü´ø¿íÉèÖÃΪ2Mbps£¬¶¨ÒåÁËÈý¸ö×Ó¶ÓÁУºstd¡¢sshºÍftp¡£
queueÖ¸ÁîµÄÓ﷨Ϊ£º
queue name bandwidth bw priority pri qlimit qlim \
scheduler ( sched_options ) { queue_list }
name ? ¶ÓÁÐÃû¡£±ØÐëÓëaltq on Ö¸ÁîÖÐqueue_listÖж¨ÒåµÄ¶ÓÁÐÃûÖ®Ò»ÏàÆ¥Å䡣ʹÓÃcbqʱ¶ÓÁÐÃûͬÑùÒªÓëÏÈǰqueueÖ¸ÁîÖÐqueue_listÖеĶÓÁÐÃûÖ®Ò»ÏàÆ¥Åä¡£¶ÓÁÐÃû²»Äܳ¤ÓÚ15¸ö×Ö·û¡£
bw ? µ÷¶È³ÌÐòʹÓÃ×Ü´ø¿í¡£This may be specified as an absolute value using the suffixes b, Kb, Mb, and Gb to represent bits, kilobits, megabits, and gigabits per second, respectively or as a percentage of the interface bandwidth¡£
pri ? ¶ÓÁеÄÓÅÏÈȨ¡£Ê¹ÓÃcbqʱ·¶Î§Îª0 -> 7£¬Ê¹ÓÃpriqʱ·¶Î§Îª0 -> 15¡£ÓÅÏȹ«£°ÊÇ×îµÍµÄ¡£Èç¹û²»Ö¸¶¨£¬Ä¬ÈÏÖ¸¶¨£±¡£
qlim ? ¶ÓÁб£´æµÄÊý¾Ý°üµÄ×î´óÊý¡£Õâ¸ö²ÎÊýÊÇ¿ÉÑ¡ÔñµÄ£¬ ĬÈÏΪ50¡£
scheduler ? ʹÓÃÄĸöµ÷¶È³ÌÐò¡£¿ÉÑ¡Ôñ£ºcbq»òpriq¡£±ØÐëÓëroot¶ÓÁÐʹÓõĵ÷¶È³ÌÐòÏàͬ¡£
sched_options ? ¸ü¶à¿ØÖƵ÷¶È³ÌÐòÐÐΪµÄÑ¡Ï
¡¡¡¡¡¡default ? ¶¨ÒåÒ»¸öȱʡ¶ÓÁУ¬ µ±Êý¾Ý°üÓë±ðµÄ¶ÓÁв»ÄÜÆ¥Åäʱ¶¼½«½øÈëÕâ¸ö¶ÓÁÐÖС£Õâ¸ö¶ÓÁбØÐëÕýÈ·¶¨Òå¡£
red ? ÔÚ¶ÓÁÐÖÐÆôÓÃRandom Early Detection(RED)¡£
rio ? ÈÃREDÓëIN/OUTÒ»ÆðʹÓá£ÔÚÕâ¸öģʽÏ£¬REDά³Ö¶àÑùµÄƽ¾ù¶ÓÁг¤¶ÈºÍ¶àÑùµÄthresholdÖµ£¬Ã¿Ò»¸öIP·þÎñˮƽµÄÖÊÁ¿¡£
ecn ? ÔÚÕâ¸ö¶ÓÁÐÉÏÆôÓÃExplicit Congestion Notification(ECN)¡£ENCÐèÒªREDÒ»ÆðʹÓá£
borrow ? ¶ÓÁпÉÒÔ´ÓËüµÄ¸¸¶ÓÁÐÄǵ½½èµ½´ø¿í¡£Ö»Óе±Ê¹ÓÃcbqµ÷¶È³ÌÐòʱ²ÅÄÜʹÓÃÕâ¸öÑ¡Ïî¡£
queue_list ? ´ÓÕâ¸ö¶ÓÁдӴ´½¨µÄ×Ó¶ÓÁÐÁÐ±í¡£Ö»Óе±Ê¹ÓÃcbqµ÷¶È³ÌÐòʱ²ÅÄܶ¨Òå×Ó¶ÓÁС£
ÈÃÎÒÃÇÀ´¿´¿´Àý×Ó£º
queue std bandwidth 50% cbq(default)
queue ssh { ssh_login, ssh_bulk }
queue ssh_login priority 4 cbq(ecn)
queue ssh_bulk cbq(ecn)
queue ftp bandwidth 500Kb priority 3 cbq(borrow red)
ÕâÊÇÎÒÃÇΪÏÈǰ¶¨ÒåµÄ×Ó¶ÓÁÐÉèÖõIJÎÊý¡£std¶ÓÁдÓroot¶ÓÁÐÖзֵ½ÁË50%£¨1Mbps£©µÄ´ø¿í²¢½«ËüÉèÖóÉĬÈ϶ÓÁУ¨default queue£©¡£ssh¶ÓÁÐÓÖ´ÓÖж¨ÒåÁËÁ½¸ö×Ó¶ÓÁУ¬ssh_login¶ÓÁкÍssh_bulk¶ÓÁС£ssh_login¶ÓÁбÈssh_bulk¶ÓÁеÄÓÅÏÈȨ¸ß²¢ÇÒÁ½¸ö¶ÓÁж¼Æô¶¯ÁËECNÑ¡Ïî¡£ftp¶ÓÁзֵ½ÁË500kbpsµÄ´ø¿í²¢ÉèÖÃÁËÓÅÏÈȨ3¡£Ëü¿ÉÒÔ´Ó¸¸¶ÓÁÐÖнèÓöîÍâµÄ´ø¿í²¢Æô¶¯ÁËREDÑ¡Ïî¡£
[color=blue][size=4]Assigning Traffic to a Queue[/size][/color]
½«ÍøÂç´«Êä·ÖÅ䏸¶ÓÁУ¬¶ÓÁйؼü×ÖºÍPF¡¯s filter rulesÒ»ÆðʹÓá£ÀýÈ磬¿¼ÂÇÈçÏÂfilter rulesÉèÖãº
pass out on fxp0 from any to any port 22
¿ÉÒÔʹÓöÓÁйؼü×ÖΪƥÅ乿ÔòµÄÊý¾Ý°üÖ¸¶¨¶ÓÁУº
pass out on fxp0 from any to any port 22 queue ssh
µ±ÓëblockÖ¸ÁîÒ»ÆðʹÓöÓÁйؼü×Öʱ£¬½á¹ûÊÇÈκÎTCP RST»òICMP²»Äܵ½´ïµÄÊý¾Ý°ü¶¼½«·ÖÅäµ½Ö¸¶¨µÄ¶ÓÁÐÖС£
×¢Òâ³ýÁËaltq onÖ¸ÁÒåµÄ¶Ë¿ÚÍâ±ðµÄ¶Ë¿ÚµÄÊý¾Ý¿ÉÄܻḽ¼Óµ½¶ÓÁÐÉÏ¡££¨Õâ¾äÓÐЩÒÉÎÊ£¬ÔÎÄ£ºNote that queue tagging can happen on an interface other than the one defined in the altq on directive £©£º
altq on fxp0 cbq bandwidth 2Mb queue { std, ftp }
queue std cbq(default)
queue ftp bandwidth 1.5Mb
¶ÓÁÐÆôÓõÄfxp0¶Ë¿Úµ«ÊÂÇé·¢ÉúÔÚdc0¶Ë¿ÚÉÏ¡£Èç¹ûÊý¾Ý°üÆ¥Åä´æÔÚÓÚfxp0¶Ë¿ÚµÄpass rule¡£ËüÃǽ«¼ÓÈëµ½ftp¶ÓÁÐÖС£ÕâÖÖÀàÐ͵ĶÓÁÐÔÚ·ÓÉÆ÷ÉϺÜÓÐÓá£
»ù±¾ÉÏËæ¶ÓÁйؼü×Ö¸ø³öµÄÖ»ÓÐÒ»¸ö¶ÓÁУ¬Èç¹ûÓеڶþ¸öÃû×Ö±»Ö¸¶¨£¬ÄǶÓÁÐÓÃÓÚµÍÑÓ³Ù·þÎñÐ͵ÄÊý¾Ý°ü£¨packets with a Type of Service(ToS)of low-delay£©ºÍÓÐûÊý¾Ý¸ººÉµÄTCP ACKÊý¾Ý°ü¡£Ò»¸ö·Ç³£ÓÐÓõÄÀý×ÓÊÇʹÓÃssh ¡£SSH login»á»°½«ÉèÖà ToS ΪµÍÑÓ³Ù¶øSCPºÍSFTP»á»°È´²»»á¡£PF¿ÉÒÔʹÓõǽÁ¬½ÓµÄÊý¾Ý°üÓëûÓеǽÁ¬½ÓµÄÊý¾Ý°üµÄ²»Í¬ÊôÐÔÀ´½«Êý¾Ý°ü·ÖÅäµ½²»Í¬µÄ¶ÓÁÐÖС£Õâ¾Í¿ÉÒ԰ѵǽÁ¬½ÓÊý¾Ý°üµÄÓÅÏÈȨÉèÖÃÔÚÎļþ´«ÊäÊý¾Ý°üÖ®ÉÏ¡£
pass out on fxp0 from any to any port 22 queue(ssh_bulk, ssh_login)
ÉÏÃæ½«SSH login»á»°Á¬½ÓÊôÐÔµÄÊý¾Ý°ü·ÖÅäµ½ssh_login¶ÓÁÐÖУ¬½«SCPºÍSFTPÁ¬½ÓÊôÐÔµÄÊý¾Ý°ü·ÖÅäµ½ssh_bulk¶ÓÁÐÖС£ÓÉÓÚssh_login¾ßÓнϸߵÄÓÅÏÈȨ£¬SSH loginÁ¬½ÓµÄÊý¾Ý°ü»áÔÚSCP ºÍSFTPÁ¬½ÓµÄÊý¾Ý°üÇ°Ãæ´¦Àí¡£
ÔÚ²»¶Ô³ÆÁ¬½ÓÖУ¬ °ÑTCP ACKÊý¾Ý°ü·ÖÅäµ½¸ßÓÅÏÈȨ¶ÓÁÐÊǺÜÓÐÓô¦µÄ£¬that is, ÔÚADSLÁ¬ÍøÖУ¬ ÉÏ´«ºÍÏÂÔØÁ¬½ÓʹÓò»Í¬µÄ´ø¿í¡£ÔÚʹÓÃADSL´«ÊäÏß·ÖУ¬µ±ÉÏ´«Í¨µÀÁ÷Á¿¹ý¶àʱÏÂÔØÍ¨µÀ½«Ê¹Óã¬ÏÂÔØÍ¨µÀ½«ÈÌÊÜÒòΪTCP ACKÊý¾Ý°üÏëʹÓõÄÉÏÔØÍ¨µÀ´¦ÓÚÓµÈû״̬¶øÖ»ºÃʹÓÃÏÂÔØÍ¨µÀÁË¡£²âÊÔÏÔʾÁ˺ܺõĽá¹û£¬ÉÏÔØÍ¨µÀµÄ´ø¿íÓ¦¸ÃÉèÖÃСÓÚÁ¬½ÓÏß·ÌṩµÄÄÜÁ¦¡£ÀýÈ磬Èç¹ûADSLÏß·×î´óÉÏ´«´ø¿íΪ640kbps£¬ÄÇô×îºÃ½«root¶ÓÁеĴø¿íÉèÖÃΪ600kbps£¬ÕâÑùÐÔÄÜ»áºÃһЩ¡£ÊÔÑ齫²úÉú×îºÃµÄÉ趨´ø¿í¡£
µ±ÔÚ¹æÔòÖÐʹÓöÓÁйؼü×Ö±£³ÖÄÇÖÖ״̬ʱ£º
pass in on fxp0 proto tcp from any to any port 22 flags S/SA \
keep state queue ssh
PF½«ÔÚ״̬tableÈë¿Ú¼Ç¼¶ÓÁУ¬Êý¾Ý°üÒÆ»Øµ½fxp0½Ó¿ÚÆ¥Åä״̬Á¬½Ó²¢¼ÓÈëµ½ssh¶ÓÁеÄβ²¿¡£×¢Ò⾡¹Ü¼´Ê¹¶ÓÁйؼü×ÖÔËÐÐÔÚ¹ýÂ˽øÀ´µÄÍøÂç´«Ê乿ÔòÖУ¬Ä¿µÄÊÇΪÍâ³öµÄÍøÂçÁ¬½ÓÖ¸¶¨ÏàÓ¦µÄ¶ÓÁУ»ÉÏÃæµÄ¹æÔò²¢²»¶ÓÁнøÀ´µÄÊý¾Ý°ü¡£
Example # 1: Small, Home Network
[ Alice ] [ Charlie ]
| | ADSL
---+-----+-------+------ dc0 [ OpenBSD ] fxp0 -------- ( Internet )
|
[ Bob ]
ÔÚÕâÀýÖУ¬OpenBSDÓÃÓÚÓÐÈý¸ö¹¤×÷Õ¾µÄСÐͼÒÍ¥ÍøÂçµÄÍø¹Ø¡£Íø¹ØÖ÷ÒªÓÃÓÚÖ´Ðаü¹ýÂ˺ÍNAT¡£Á¬½ÓinternetµÄÁ¬½ÓÊÇÒ»¸öADSLÁ¬½Ó£¬ÓÐ640kbpsµÄÉÏÔØ´ø¿íºÍ2MbpsµÄÏÂÔØ´ø¿í¡£
Õâ¸öÍøÂçµÄ¶ÓÁз½°¸ÊÇ£º
1¡¢ÎªBob·ÖÅä80KbpsµÄÏÂÔØ´ø¿í£¬µ±Alice or CharlieûÓÐʹÓôóÁ¿ÏÂÔØÊ±Ëû¿ÉÒÔÍæÔÚÏßÓÎÏ·¡£ÔÊÐíÔÚÍøÂç¿ÕÏÐʱBobʹÓõĴø¿í´óÓÚ80Kbps¡£
2¡¢SSHÁ¬½ÓºÍ¼´Ê±Í¨Ñ¶´«Êä±Èƽ³£´«ÊäÓµÓиü¸ßµÄÓÅÏÈȨ¡£
3¡¢DNS²éѯºÍ´ð¸´ÓµÓеڶþ¸ßÓÅÏÈȨ¡£
4¡¢ÏòÍâ´«ÊäµÄTCP ACKÊý¾Ý°ü±ÈÒ»°ãµÄÏòÍâ´«ÊäµÄÊý¾Ý°üÓµÓиü¸ßµÄÓÅÏÈȨ¡£
ÏÂÃæÊÇÕâ¸öÍøÂçµÄ¹æÔò·½°¸¡£×¢Òâpf.confÖ¸Áî½ö½ö°üº¬Ç°Ãæ½éÉܹýµÄÃüÁnat, rdr, optionsµÈ¶¼Ã»ÓÐÏÔʾ¡£
# enable queueing on the external interface to control traffic going to
# the Internet. use the priq scheduler to control only priorities. set
# the bandwidth to 610Kbps to get the best performance out of the TCP
# ACK queue.
altq on fxp0 priq bandwidth 610Kb queue { std_out, ssh_im_out, dns_out, \
tcp_ack_out }
# define the parameters for the child queues.
# std_out - the standard queue. any filter rule below that does not
# explicitly specify a queue will have its traffic added
# to this queue.
# ssh_im_out - interactive SSH and various instant message traffic.
# dns_out - DNS queries.
# tcp_ack_out - TCP ACK packets with no data payload.
queue std_out priq(default)
queue ssh_im_out priority 4 priq(red)
queue dns_out priority 5
queue tcp_ack_out priority 6
# enable queueing on the internal interface to control traffic coming in
# from the Internet. use the cbq scheduler to control bandwidth. max
# bandwidth is 2Mbps.
altq on dc0 cbq bandwidth 2Mb queue { std_in, ssh_im_in, dns_in, bob_in }
# define the parameters for the child queues.
# std_in - the standard queue. any filter rule below that does not
# explicitly specify a queue will have its traffic added
# to this queue.
# ssh_im_in - interactive SSH and various instant message traffic.
# dns_in - DNS replies.
# bob_in - bandwidth reserved for Bob's workstation. allow him to
# borrow.
queue std_in cbq(default)
queue ssh_im_in priority 4
queue dns_in priority 5
queue bob_in bandwidth 80Kb cbq(borrow)
# ... in the filtering section of pf.conf ...
alice = "192.168.0.2"
bob = "192.168.0.3"
charlie = "192.168.0.4"
local_net = "192.168.0.0/24"
ssh_ports = "{ 22 2022 }"
im_ports = "{ 1863 5190 5222 }"
# filter rules for fxp0 inbound
block in on fxp0 all
# filter rules for fxp0 outbound
block out on fxp0 all
pass out on fxp0 inet proto tcp from (fxp0) to any flags S/SA \
keep state queue(std_out, tcp_ack_out)
pass out on fxp0 inet proto { udp icmp } from (fxp0) to any keep state
pass out on fxp0 inet proto { tcp udp } from (fxp0) to any port domain \
keep state queue dns_out
pass out on fxp0 inet proto tcp from (fxp0) to any port $ssh_ports \
flags S/SA keep state queue(std_out, ssh_im_out)
pass out on fxp0 inet proto tcp from (fxp0) to any port $im_ports \
flags S/SA keep state queue(ssh_im_out, tcp_ack_out)
# filter rules for dc0 inbound
block in on dc0 all
pass in on dc0 from $local_net
# filter rules for dc0 outbound
block out on dc0 all
pass out on dc0 from any to $local_net
pass out on dc0 proto { tcp udp } from any port domain to $local_net \
queue dns_in
pass out on dc0 proto tcp from any port $ssh_ports to $local_net \
queue(std_in, ssh_im_in)
pass out on dc0 proto tcp from any port $im_ports to $local_net \
queue ssh_im_in
pass out on dc0 from any to $bob queue bob_in
Examples # 2: Company Network
( IT Dept ) [ Boss's PC ]
| | T1
--+----+-----+---------- dc0 [ OpenBSD ] fxp0 -------- ( Internet )
| fxp1
[ COMP1 ] [ WWW ] /
| /
--+----------'
ÔÚÕâÒ»ÀýÖУ¬ OpenBSDÓÃÓÚÒ»¸ö¹«Ë¾µÄ·À»ðǽ¡£ÔÚËüÃǵÄDMZÍøÂ粿·ÖÖÐÔËÐÐ׏«Ë¾µÄwww·þÎñÆ÷£¬ Óû§Ê¹ÓÃFTPÉÏ´«µ½ËûÃǵķþÎñÆ÷ÉÏ¡£IT²¿ÃŰÑËûÃǵÄ×ÓÍøÁ¬½Óµ½Ö÷¸ÉÍøÉÏ£¬Àϰå°ì¹«ÊÒÀïÓÐ̨µçÄÔÓÃÓÚÊÕ·¢emailºÍä¯ÀÀÍøÒ³¡£Ê¹ÓÃË«Ïò´«Êä¶¼ÊÇ1.5MbpsµÄT1Á¬½Óµ½internet¡£±ðµÄÍø¶Î¶¼Ê¹ÓÿìËÙÒÔÌ«Íø£¨100Mbps£©¡£
ÍøÂç¹ÜÀíÔ±¾ö¶¨Ê¹ÓÃÏÂÃæµÄ·½°¸£º
1¡¢ ÏÞÖÆwwwºÍinternetÖ®¼äµÄË«ÏòÍøÂç´«ÊäΪ500Kbps¡£
2¡¢ ÄÚ²¿ÍøÂçÓëwwwÖ®¼äûÓдø¿íÏÞÖÆ¡£
3¡¢ ¸øwwwÓëinternetÖ®¼äµÄHTTP´«Êä±È±ðµÄ´«Ê䣨ÈçFTP£©¸ü¸ßµÄÓÅÏÈȨ¡£
4¡¢ ΪIT²¿ÃÅÔ¤±¸500Kbps£¬ ÕâÑùËûÃÇ¿ÉÒÔÏÂÔØÉý¼¶Èí¼þ¡£µ±ÓÐÊ£ÓàÍøÂç´ø¿íʱ£¬ ¿ÉÒÔʹÓó¬¹ý500KbpsµÄ´ø¿í¡£
5¡¢ ÀϰåµÄµçÄÔµ½internetµÄÁ¬½Ó´«Êä±È±ðµÄÁ¬½Ó´«ÊäµÄÓÅÏÈȨ¸ß¡£
ÏÂÃæÊÇÕâ¸öÍøÂçµÄ¹æÔò·½°¸¡£×¢Òâpf.confÖ¸Áî½ö½ö°üº¬Ç°Ãæ½éÉܹýµÄÃüÁnat, rdr,
optionsµÈ¶¼Ã»ÓÐÏÔʾ¡£
# enable queueing on the external interface to queue packets going out
# to the Internet. use the cbq scheduler so that the bandwidth use of
# each queue can be controlled. the max outgoing bandwidth is 1.5Mbps.
altq on fxp0 cbq bandwidth 1.5Mb queue { std_ext, www_ext, boss_ext }
# define the parameters for the child queues.
# std_ext - the standard queue. also the default queue for
# outgoing traffic on fxp0.
# www_ext - container queue for WWW server queues. limit to
# 500Kbps.
# www_ext_http - http traffic from the WWW server
# www_ext_misc - all non-http traffic from the WWW server
# boss_ext - traffic coming from the boss's computer
queue std_ext cbq(default)
queue www_ext bandwidth 500Kb { www_ext_http, www_ext_misc }
queue www_ext_http priority 3 cbq(red)
queue www_ext_misc priority 1
queue boss_ext priority 3
# enable queueing on the internal interface to control traffic coming
# from the Internet or the DMZ. use the cbq scheduler to control the
# bandwidth of each queue. bandwidth on this interface is set to the
# maximum. traffic coming from the DMZ will be able to use all of this
# bandwidth while traffic coming from the Internet will be limited to
# 1.0Mbps (because 0.5Mbps (500Kbps) is being allocated to fxp1).
altq on dc0 cbq bandwidth 100% queue { net_int, www_int }
# define the parameters for the child queues.
# net_int - container queue for traffic from the Internet. bandwidth
# is 1.0Mbps.
# std_int - the standard queue. also the default queue for outgoing
# traffic on dc0.
# it_int - traffic to the IT Dept network.
# boss_int - traffic to the boss's PC.
# www_int - traffic from the WWW server in the DMZ.
queue net_int bandwidth 1.0Mb { std_int, it_int, boss_int }
queue std_int cbq(default)
queue it_int bandwidth 500Kb cbq(borrow)
queue boss_int priority 3
queue www_int cbq(red)
# enable queueing on the DMZ interface to control traffic destined for
# the WWW server. cbq will be used on this interface since detailed
# control of bandwidth is necessary. bandwidth on this interface is set
# to the maximum. traffic from the internal network will be able to use
# all of this bandwidth while traffic from the Internet will be limited
# to 500Kbps.
altq on fxp1 cbq bandwidth 100% queue { internal_dmz, net_dmz }
# define the parameters for the child queues.
# internal_dmz - traffic from the internal network.
# net_dmz - container queue for traffic from the Internet.
# net_dmz_http - http traffic.
# net_dmz_misc - all non-http traffic. this is also the default queue.
queue internal_dmz # no special settings needed
queue net_dmz bandwidth 500Kb { net_dmz_http, net_dmz_misc }
queue net_dmz_http priority 3 cbq(red)
queue net_dmz_misc priority 1 cbq(default)
# ... in the filtering section of pf.conf ...
main_net = "192.168.0.0/24"
it_net = "192.168.1.0/24"
int_nets = "{ 192.168.0.0/24, 192.168.1.0/24 }"
dmz_net = "10.0.0.0/24"
boss = "192.168.0.200"
wwwserv = "10.0.0.100"
# default deny
block on { fxp0, fxp1, dc0 } all
# filter rules for fxp0 inbound
pass in on fxp0 proto tcp from any to $wwwserv port { 21, \
> 49151 } flags S/SA keep state queue www_ext_misc
pass in on fxp0 proto tcp from any to $wwwserv port 80 \
flags S/SA keep state queue www_ext_http
# filter rules for fxp0 outbound
pass out on fxp0 from $int_nets to any keep state
pass out on fxp0 from $boss to any keep state queue boss_ext
# filter rules for dc0 inbound
pass in on dc0 from $int_nets to any keep state
pass in on dc0 from $it_net to any queue it_int
pass in on dc0 from $boss to any queue boss_int
pass in on dc0 proto tcp from $int_nets to $wwwserv port { 21, 80, \
> 49151 } flags S/SA keep state queue www_int
# filter rules for dc0 outbound
pass out on dc0 from dc0 to $int_nets
# filter rules for fxp1 inbound
pass in on fxp1 proto { tcp, udp } from $wwwserv to any port 53 \
keep state
# filter rules for fxp1 outbound
pass out on fxp1 proto tcp from any to $wwwserv port { 21, \
> 49151 } flags S/SA keep state queue net_dmz_misc
pass out on fxp1 proto tcp from any to $wwwserv port 80 \
flags S/SA keep state queue net_dmz_http
pass out on fxp1 proto tcp from $int_nets to $wwwserv port { 80, \
21, > 49151 } flags S/SA keep state queue internal_dmz
Ò³:
[1]