ºìÁªLinuxÃÅ»§
Linux°ïÖú

Linux·À»ðǽÀ©Õ¹¼¼ÊõÓëÈëÇÖ¼ì²âʵÏÖ

·¢²¼Ê±¼ä:2007-02-06 00:26:59À´Ô´:ºìÁª×÷Õß:Thisyear
Õª Òª:¸ÃÎĽéÉÜ»ùÓÚLinux netfilter/iptables¼Ü¹¹ÊµÏÖ»úÖÆºÍÀ©Õ¹¼¼Êõ,ÔÚ´Ë»ù´¡ÉÏÌá³öÀ©Õ¹Æ¥ÅäÑ¡ÏîʵÏÖ·À»ðǽµÄÈëÇÖ¼ì²â¹¦ÄÜ£¬À©³äºóµÄ·À»ðǽ¿ÉÒÔÏñSnortÒ»Ñù¾ßÓÐÈëÇÖ¼ì²â¹¦ÄÜ£¬´Ó¶øÀ©Õ¹ÁË·À»ðǽµÄ°²È«¿ØÖƹ¦ÄÜ£¬²¢Çҿɽ«Snort¹æÔòת»¯Îª·À»ðǽ¹æÔòʵÏÖ·À»ðǽ¹æÔò¼¯µÄÀ©³ä¡£

°´ÕÕ·À»ðǽ¶ÔÄÚÍâÀ´ÍùµÄÊý¾ÝµÄ´¦Àí·½·¨£¬·À»ðǽ¿ÉÒÔ·ÖΪ°ü¹ýÂË·À»ðǽºÍÓ¦Óòã·À»ðǽ£¬°ü¹ýÂË·À»ðǽ¹¤×÷ÔÚÍøÂç²ã£¬ËüÖ»ÊǼì²â°üµÄЭÒéÍ·¶ÔÊý¾Ý°ü½øÐвþö£¬ËüÔËÐÐËٶȿ쵫ÎÞ·¨¶Ô¸ß²ãµÄЭÒéÄÚÈݽøÐмì²é£¬Ó¦Óòã·À»ðǽÔò¿ÉÒԶԸ߲ãÊý¾Ý½øÐÐת·¢ºÍ¹ýÂ˲¢Ç¿ÖÆÉí·ÝÑéÖ¤£¬µ«¶Ô²»Í¬µÄ·þÎñÐèÒªÌṩ´úÀíÓ¦ÓóÌÐò²¢ÇÒ½¨Á¢ÁËÍøÂçÆ¿¾±£»²¢ÇÒ½«°ü¹ýÂ˼¼ÊõºÍ¶àÖÖÓ¦Óü¼ÊõÈںϵ½Ò»Æð£¬¹¹³É¸´ºÏÐÍ·À»ðǽÊÇĿǰ¹úÄÚ·À»ðǽ²úÆ·µÄÒ»¸öÌØµã£¬Ò²ÊÇ·À»ðǽ½ñºó·¢Õ¹µÄÖ÷Á÷¼¼Êõ¡£¼øÓÚÔÚ·À»ðǽÖÐÕûºÏÊý¾Ý°ü¼ì²â¹¦ÄÜÊÇÒ»ÖÖÁ¼ºÃµÄ½â¾ö·½·¨£¬Ëü¿ÉÒÔÃÖ²¹ÏÖÓзÀ»ðǽµÄȱµã²¢ÇÒ¾ßÓÐÏñÈëÇÖ¼ì²âϵͳһÑùµÄ¼ì²â¹¦ÄÜ£¬±¾ÎĽ«½éÉÜ»ùÓÚLinux netfilter/iptables¼Ü¹¹ÊµÏÖ»úÖÆºÍÀ©Õ¹¼¼Êõ,ÔÚ´Ë»ù´¡ÉÏÌá³öÁËÀ©Õ¹Æ¥ÅäÑ¡ÏîʵÏÖ·À»ðǽµÄÈëÇÖ¼ì²â¹¦ÄÜ£¬À©³äºóµÄ·À»ðǽ¿ÉÒÔÏñSnortÒ»Ñù¾ßÓÐÈëÇÖ¼ì²â¹¦ÄÜ£¬²¢Çҿɽ«Snort¹æÔòת»¯Îª·À»ðǽ¹æÔòʵÏÖ¹æÔò¼¯µÄÀ©³ä¡£

1 Linux·À»ðǽµÄÀ©Õ¹netfilter/iptablesµÄ¼¼Êõ

LinuxÖзÀ»ðǽNetfilter/IptablesϵͳÖ÷Òª°üÀ¨Á½¸ö»ù±¾×é¼þ :¶¨ÒåÔÚÄں˿ռäÖеÄͨÓÿò¼ÜNet filterºÍÊý¾Ý°üÑ¡Ôñϵͳ(Packet Selection).ÆäÖкóÕßÓÖÓÉÁ½²¿·Ö¹¹³É:ÔÚNet filter¿ò¼ÜÉ϶¨ÒåµÄÊý¾Ý½á¹¹¡°IP±í¡±(IP Tables)ºÍÔÚÓû§¿Õ¼äʵÏÖµÄÓ¦ÓóÌÐòiptables.¾ßÌå·À»ðǽ¹¤×÷Á÷³Ì¼û[1][2]¡£

ÓÉÓÚNet filter¼Ü¹¹µÄ¼ÓÈ룬¿ÉÒÔͨ¹ý¼òµ¥µÄÄÚºËÄ£¿é»¯À´ÊµÏÖй¦ÄܵÄÀ©Õ¹£¬ÔÚÏÖÓеÄNetfilter/IptablesÖпÉÒÔͨ¹ýÁ½ÖÖ·½Ê½¶ÔÏÖÓеķÀ»ðǽ½øÐÐÀ©³ä£¬Ò»ÖÖÊÇÀ©Õ¹Net filterͨ¹ý±àдÏà¹ØÄÚºËÄ£¿éµ÷ÓÃnf_register_hook()Ö±½ÓÔÚÏà¹ØµÄ¹³×ÓÉÏ×¢²á´Ó¶ø»ñµÃÐÂÌØÐÔ£¬Ò»ÖÖÊÇÀ©Õ¹IP±íͨ¹ý±àдÏà¹ØµÄÆ¥Åä±ê×¼ºÍÄ¿±êÀ´ÊµÏÖÐÂÌØÐÔ£»À©Õ¹IP±í·½Ê½ÊǶÔÏÖÓбíµÄÆ¥Å乿ÔòµÄÀ©³äÓë¾ßÌå±íÎ޹ء£À©Õ¹IP±íÐèÒª±àдÄں˺ÍÓû§Á½·½µÄ´úÂ룬ÄÚºËÄ£¿éÌṩÁËʵ¼ÊµÄÊý¾Ý°üÆ¥Å乿Ôò´úÂ룬Óû§·½´úÂëÌṩÁËIPTABLE еÄÃüÁîÐÐÑ¡ÏîµÄ¹²Ïí¿â¡£


2 Linux·À»ðǽÈëÇÖ¼ì²âÀ©Õ¹Æ¥ÅäÉè¼Æ

ĿǰÈëÇÖ¼ì²âϵͳÆÕ±é²ÉÓþ«È·µÄģʽƥÅäËã·¨£¬ÈçSnort²ÉÓûùÓÚ¹æÔòµÄ·½Ê½¶ÔÊý¾Ý°ü½øÐйæÔòÆ¥ÅäÀ´¼ì²â¶àÖÖ²»Í¬µÄÈëÇÖÐÐΪºÍ̽²â»î¶¯£¬ÕâÖÖ·½Ê½¼òµ¥¶øÓÐЧ£¬Òò´Ë¿ÉÒÔ½è¼øÕâÖÖ˼ÏëÔÚ·À»ðǽµÄÆ¥ÅäÑ¡ÏîÖмÓÈëÆ¥ÅäÑ¡ÏîÀ´¼ì²âÊý¾Ý°üÖеÄÄÚÈÝ£¬ÓÉÓÚÀ©Õ¹IP±í¾ßÓкܺõØÁé»îÐÔ£¬Îª´Ë¿ÉÒÔÑ¡ÓÃÕâÖÖ·½Ê½À©³äÆ¥Åä±ê×¼À´ÊµÏÖÈëÇÖ¼ì²âÄ£¿é¡£ÕâÖÖ·½Ê½ÐèÒª±àдÄں˺ÍÓû§¿Õ¼ä´úÂ룬Netfilter/IptablesµÄ±ê×¼»¯ÌṩÁËÁ½·½Ê¹ÓõÄÖØÒªÊý¾Ý½á¹¹£¬ÔÚʵÏÖÕâÁ½²¿·Ö´úÂëʱÖ÷ÒªÊÇÌî³äÏàÓ¦µÄÊý¾Ý½á¹¹ÄÚÈÝÈ»ºó½«ËüÃÇ×¢²á´Ó¶øÀ©Õ¹¹¦ÄÜ¡£

2.1 ÄÚºËÄ£¿éÊý¾Ý½á¹¹

еÄMATCH¹¦ÄÜ¿É×÷Ϊһ¸ö¶ÀÁ¢µÄÄ£¿é£¬ÎªÁËÄÜʹÐÂÄ£¿éÄܱ»±ðµÄÄ£¿éʹÓ㬿ÉÒÔʹÓÃiptableÌṩµÄipt-register-match()½«¸ÃÄ£¿é½øÐÐ×¢²á£¬ÐµÄMATCHÄ£¿éµÄºËÐÄÊÇipt-match½á¹¹£¬Ëü½«×÷Ϊipt-register-match()µÄ²ÎÊý×¢²áµ½MATCHÁ´±íÖб¸ÓôӶøÔö¼ÓÐµĹæÔòÆ¥ÅäÑ¡Ïî¡£

ÒýÓÃ:
Struct ipt_match
{struct list_head list;Ò»°ãÉ趨Ϊ{NULL,NULL}£¬ÓɺËÐÄʹÓÃ
const char name[];MTACH¹¦ÄܵÄÃû³Æ£¬¸ÃÃû³Æ±ØÐëÓëÄ£¿éÃûÏàÆ¥Åä
int (*match)();Ò»¸öÖ¸ÏòMTACH¹¦Äܺ¯ÊýµÄÖ¸Õ룬·µ»Ø·Ç0±íʾƥÅä
int (*check entry)();Ò»¸öÖ¸Ïò¼ì²é¹æÔò¹æ·¶µÄÖ¸Õ룬Èç¹û·µ»Ø0£¬¹æÔò²»»á¼ÓÈëiptables
void (*destroy)(); µ±Ò»¸öʹÓøÃMATCHµÄÈë¿Ú±»É¾³ýʱ£¬¸Ãº¯Êýµ÷ÓÃÒÔÊÍ·ÅËùÕ¼×ÊÔ´
struct module me ÊÇ·ñÊÇÄ£¿éµÄ¶¨Ò壬ÊÇÄ£¿éÉèÖÃΪTHIS_MODULE ·ñÔòNULL}


ÔÚ¸ÃÊý¾Ý½á¹¹ÖÐÖØÒªµÄÊÇmatch £¬check entry º¯Êý£¬MATCHº¯Êý½«ÊµÏÖ½ÓÊմӵײ㴫À´µÄÊý¾Ý°ü£¬¼ì²éÊý¾Ý°üʵÏÖÆ¥Å书ÄÜ£¬Èç¹ûÊý¾Ý°üÓëËù¶¨ÒåµÄ¹æÔòÏàͬÄÇô·µ»ØTRUE£¬Èç¹û²»³É¹¦·µ»ØFALSE²¢ÇÒ¿ÉÒÔÉèÖòÎÊý±íʾÊý¾Ý°ü¿ÉÒÔ±»Á¢¼´±»¶ªÆú¡£Check entryº¯ÊýÖ¸ÏòÒ»¸ö¼ì²é¹æÔò¹æ·¶µÄÖ¸Õ룬Èç¹û·µ»Ø0±íÃ÷ÕâÌõ¹æÔò²»ÄÜ´ÓÓû§¿Õ¼ä½ÓÊÜ¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 2 ÌõÆÀÂÛ

  1. Thisyear ÓÚ 2007-02-06 00:28:17·¢±í:

    2.4 IPTABLE²¹¶¡µÄ»úÖÆ

    ÔÚ½«Óû§¿Õ¼äºÍÄں˿ռä´úÂë±àдÍê³Éºó£¬¿ÉÒÔÖ±½ÓÐÞ¸ÄÔ´Âë²¢±àÒë°²×°£¬ÎªÁ˱ê×¼»¯ºÍ·½±ã£¬NETFILTER/IPTABLESÌṩÁËÀ©Õ¹Äں˺ÍÓû§¿Õ¼äµÄ²¹¶¡³ÌÐò£ºÓÃÓÚÄں˲¹¶¡µÄpatch-o-iptablesºÍÔÚiptablesÔ´ÂëϵÄextensionsĿ¼ÓÃÓÚiptables³ÌÐò±¾Éí²¹¶¡¡£ÔÚpatch-o-iptablesÖÐÌṩÁËÒ»¸ö¡°runme¡±½Å±¾À´ÎªºËÐÄ´ò²¹¶¡£¬°´¹¦ÄÜÐèÒªµÄÎļþÓÐÎ岿·Ö £ºÖ÷³ÌÐòÎļþ¡¢ÄÚºËÅäÖÃÎļþ²¹¶¡¡¢ÄÚºËÅäÖÃÎļþ°ïÖú²¹¶¡¡¢runme½Å±¾ÏÔʾ°ïÖúÐÅÏ¢¡¢ÄÚºËmake fileÎļþ²¹¶¡¡£iptables±¾ÉíµÄÀ©Õ¹ÉÔ΢¼òµ¥Ò»Ð©£¬ÄǾÍÊÇÔÚextensionsĿ¼ÏÂÔö¼ÓÒ»¸ölibipt_ids.cµÄÎļþ£¬È»ºóÔÚ±¾×ÓĿ¼µÄMake fileµÄPF_EXT_SLIBºêÖи½¼ÓÒ»¸öids×Ö·û´®¡£

    ͨ¹ý²¹¶¡»ò½«´úÂëÌí¼Ó½øÄں˺óÐèÖØÐ±àÒëÄÚºËÌí¼ÓÏàÓ¦µÄ¹¦ÄÜÄ£¿é£¬ÔÚÓû§¿Õ¼äÒ²±ØÐëÖØÐ±àÒëiptablesÒÔ±ãÌṩÐµĹ¦ÄÜÑ¡Ïî¡£

    2.5 Snort¹æÔòתΪIPTABLES¹æÔò

    Ìí¼ÓºÃ×Ö·ûÆ¥ÅäÄ£¿éºó£¬¾Í¿ÉÒÔͨ¹ýIPTABLES¶¨ÒåÏàÓ¦µÄ×Ö·ûÆ¥Å乿Ôò´Ó¶øÊµÏÖÈëÇÖ¼ì²â¹¦ÄÜ£¬ÈçÓÐЩÈ䳿²¡¶¾µÄÇëÇóÖаüº¬ÁËcmd.exe£¬¿ÉÒÔ±àдÈçÏµĹæÔòÀ´¶ÔÕâÑùµÄÇëÇó½øÐжªÆú£ºiptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m ids --ids "cmd.exe" ¡£

    ÕâÖÖÔËÐз½Ê½ºÍSNORTµÄ¼ì²â·½Ê½ÏàËÆ£¬²¢ÇÒSNORT µÄ¹æÔò¼°¸üÐÂËÙ¶È¿ì¿ÉÒÔ½«ËüµÄÏà¹Ø¹æÔò¼¯×ª»¯ÎªÔÚ·À»ðǽÖпÉÒÔʹÓõĹæÔò¼¯¡£ÒÔÏÂÊǽ«SnortÖÐÓÃÓÚ¼ì²âɨÃèÆ÷µÄ¹æÔòת»»Îª·À»ðǽ¹æÔòµÄʵÀý£º

    ÒýÓÃ:
    alert icmp 192.168.0.12 any -> 192.168.0.27 any
    (msg:"ICMP PING Sniffer Pro/Net Ray network scan";
    itype:8; content:"Cinco Network, Inc."; depth:32;
    classtype:misc-activity; sid:484; rev:4;)
    Iptables -A INPUT -p icmp -s 192.168.0.12 -d 192.168.0.27
    --icmp-type 8 -m ids --ids "Cinco Network,
    Inc." -j LOG --log-prefix " SID484 "
    # "ICMP PING Sniffer Pro/Net Ray network scan"
    classtype:misc-activity sid:484


    3 ½áÊøÓï

    ͨ¹ýʵÑé¸Ã·À»ðǽ¿ÉÒÔ¶Ô³£¼ûµÄÈ䳿¡¢Ì½²âɨÃè¡¢²¡¶¾µÈSNORT¹æÔò¼¯ÄÜÆ¥ÅäµÄ´ó¶àÊý¹¥»÷ÓÐÁ¼ºÃµÄµÖÓù×÷Óá£ÓÉÓÚNetfilter/iptables¾ßÓкܺõÄÁé»îÐÔ£¬Ôڸÿò¼ÜÉÏ¿ÉÒÔ·½±ãµØ¶Ô·À»ðǽ½øÐй¦ÄÜÀ©³ä¡£±¾ÎÄͨ¹ýÀ©Õ¹Æ¥ÅäÑ¡ÏîʵÏÖÈëÇÖ¼ì²âµÄ¹¦ÄÜ£¬ÃÖ²¹ÁË´«Í³µÄÁ½ÖÖÀàÐÍ·À»ðǽ²»×㣬ÓÉÓÚ¼ì²â¹¦ÄÜÔÚÄÚºËÖб£Ö¤Á˼ì²âµÄÏìÓ¦ËÙ¶È£¬Í¨¹ý½«ÏÖÓеĴóÁ¿Snort¹æÔòת»¯ÎªÏàÓ¦µÄ·À»ðǽ¹æÔò¿ÉÒÔѸËÙ¸üйæÔò¿â¼°Ê±¼ì²â¹¥»÷£¬Í¬Ê±Í¨¹ý¸Ã·½Ê½Ò²¿ÉÒÔ°´ÕÕ×ÔÉíÐèÒªÀ©Õ¹·À»ðǽ¹¦ÄÜ£¬Éè¼Æ³öÁ®¼Û¡¢°²È«¡¢ÊµÓá¢Ò×¶¨ÖƵķÀ»ðǽ¡£

  2. Thisyear ÓÚ 2007-02-06 00:27:43·¢±í:

    2.2Óû§¿Õ¼äÊý¾Ý½á¹¹

    ÔÚÄÚºËÖмÓÈëÏà¹ØµÄÄÚºËÄ£¿éÑ¡Ïîºó£¬ÎªÁËÔÚÓû§¿Õ¼äʹÓÃiptablesÈí¼þÌṩÏà¹ØµÄ¹æÔò±ØÐëΪ¸ÃÈí¼þÌṩÏà¹ØµÄÃüÁîÐÐÑ¡ÏΪÁËʹ¸÷¸öÀ©Õ¹Ä£¿éʹÓÃÒ»¸ö°æ±¾µÄiptablesÈí¼þ¶ø²»±Ø±àдÏà¹ØÀ©Õ¹µÄÌØ¶¨Èí¼þ°æ±¾£¬²ÉÓù²Ïí¿â¿ÉÒÔ½â¾ö¸ÃÎÊÌ⣬¹²Ïí¿âÓ¦¸Ã¾ßÓÐ-init()¹¦ÄÜ£¬ËüµÄ¹¦ÄܺÍÄÚºËÄ£¿é¹¦ÄÜÏàËÆ£¬ÔÚ×°ÔØÊ±±»×Ô¶¯µ÷Ó㬸ù¦Äܸù¾ÝÌí¼ÓµÄÐÂMATCHºÍÐÂTARGET²»Í¬·Ö±ðµ÷ÓÃregister-match()»òregister-target()£¬¹²Ïí¿â¿ÉÒÔÌṩ³õʼ»¯Êý¾Ý½á¹¹ºÍÌṩÏà¹ØÑ¡ÏîµÄ¹¦ÄÜ¡£±àд¹²Ïí¿âÖÐʹÓõÄÖØÒªÊý¾Ý½á¹¹ÊÇiptables_match£¬Ëü×÷Ϊ²ÎÊý´«µÝ¸øregister-match()×¢²áÏà¹ØµÄÃüÁîÐÐÆ¥ÅäÑ¡ÏîÈÃiptablesʶ±ð¸ÃÐÂÆ¥Åä¡£

    ÒýÓÃ:
    Struct iptables_match
    {struct iptables_match *next;ÓÃÓÚÐγÉÒ»¸öMATCHÁбíµÄÖ¸Õ룬³õʼ»¯ÎªNULL
    ipt_chainlabel name; MATCH¹¦ÄܵÄÃû×Ö£¬
    ±ØÐëÓë¿âº¯ÊýÃûÏàͬ±ãÓÚÖ÷³ÌÐò¸ù¾ÝMATCHÃû¼ÓÔØÏàÓ¦µÄ¶¯Ì¬Á¬½Ó¿â
    const char *version;°æ±¾ÐÅϢͨ³£±»ÉèÖÃIPTABLES_versionºê
    size_t size;¸ÃMATCHµÄÊý¾Ý´óС
    size_t userspacesize;ÓÉÓÚÄں˿ÉÄÜÐÞ¸ÄijЩÓò£¬
    ÔÚÕâÀïÌîд±»¸Ä±äÊý¾ÝÇø´óС£¬ËüÒ»°ãºÍsize´óСͬ
    void (*help)(void);´òÓ¡°ïÖúÑ¡Ïî´ó¸Ù
    void (*init)();³õʼ»¯ipt-entry-match½á¹¹
    int (*parse)();ɨÃè²¢½ÓÊÕ±¾MATCHµÄÃüÁîÐвÎÊý£¬ÕýÈ·½ÓÊÜ·µ»Ø·Ç0
    void (*final_check)();¼ì²éÊÇ·ñÇ¿ÖÆÑ¡ÏÈç--ids£©±»ÃèÊö£¬Èç¹û²»ÕýÈ·Í˳ö
    void (*print)();²éѯµ±Ç°±íÖеĹæÔòʱ£¬ÏÔʾʹÓÃÁ˵±Ç°match¹æÔòµÄ¶îÍâÐÅÏ¢
    void (*save)();PARSEµÄ·´×ª£¬±»iptable-saveµ÷ÓÃÔÙÉúmatchµÄÃüÁîÐвÎÊý
    const struct option *extra_opts;NULL½áβµÄ²ÎÊýÁÐ±í£¬ÌṩÃüÁîÐÐÆäÓàÑ¡Ïî
    /*ÒÔϲÎÊýÓÉiptablesÄÚ²¿Ê¹Óã¬Óû§²»±ØÌîд*/
    Unsigned int option_offset;
    Struct ipt_entry_match *m;
    Unsigned int mflags;
    Unsigned int used;
    }


    2.3 ÈëÇÖ¼ì²âÄ£¿éµÄʵÏÖ

    ±¾ÎĽéÉܵŦÄÜÀ©Õ¹Ö÷ÒªÊÇͨ¹ýIPTABLEÃüÁîÏò·À»ðǽ¡°IP±í¡±Ìí¼Ó×Ö·û´®Æ¥Å乿ÔòºÍÊý¾Ý°üÄÚÈÝÏàÆ¥Åä´Ó¶øÊµÏÖ¶ÔÊý¾Ý°üµÄ¼ì²â£¬ÔÚÄÚºËÖÐÐèÒªÌí¼ÓÒ»¸öids¼ì²âÆ¥ÅäÄ£¿é£¬ÔÚÓû§¿Õ¼äÃüÁîÐÐÉÏÐèÒªÌṩһ¸ö ¡°iptables -m ids -ids ¡°Æ¥ÅäÄÚÈÝ¡±¡±µÄÑ¡Ïî¡£

    ÔÚÄÚºËÄ£¿éÖÐÖ÷ÒªÊÇʵÏÖMATCHÖ¸Õ뺯Êý£¬Ôڸú¯ÊýÖÐʹÓÃÁË×Ö·û´®µÄģʽƥÅäËã·¨ÓÃÓÚ¼ì²âÊý¾Ý°üµÄÄÚÈÝ¡£Ä£Ê½Æ¥ÅäÊÇÖ¸ÔÚÎı¾Text= tlt2t3...tnÖмìË÷×Ó´®Pat=P1 P2...pn(ģʽ)µÄËùÓгöÏÖ£¬ÖøÃûµÄÆ¥ÅäËã·¨ÓÐBFËã·¨¡¢KMPËã·¨¡¢BMËã·¨¼°Ò»Ð©¸Ä½øËã·¨,»ùÓÚBMËã·¨µÄBMHËã·¨ ±»Ö¤Ã÷ÊÇÒ»ÖÖ¿ìËÙ¡¢¸ßЧµÄËã·¨£¬ÓÚÊÇÔÚÉè¼ÆÊ±²ÉÓøÃËã·¨¡£

    BMHËã·¨ÓÚ1980ÄêHorspoolÌá³öµÄ£¬¸ÃËã·¨ÔÚÆ¥ÅäµÄ¹ý³ÌÖÐģʽ´Ó×óÏòÓÒ½øÐУ¬µ«×Ö·ûµÄ±È½Ï´ÓÓÒÏò×ó½øÐУ¬ÔÚ·¢ÏÖ²»Æ¥Åäʱ£¬Ëã·¨¸ù¾ÝÔ¤ÏȼÆËãºÃµÄskipÊý×齫ģʽÓÒÒÆ£¬BMHËã·¨ÔÚ×µÄÇé¿öϸ´ÔÓ¶ÈΪO(NM)£¬ÔÚÒ»°ãÇé¿öϱÈBMÓиüºÃµÄÐÔÄÜ,ËüֻʹÓÃÒ»¸öÊý×飬¼ò»¯Á˳õʼ»¯¹ý³Ì.ÒÔÏÂÊÇÔÚmatchº¯ÊýÖÐʹÓõÄBMHËã·¨:

    ÒýÓÃ:
    Char *ids_match
    (char *pattern, char *text, int pattern_len, int text_len)
    {
    int k, right_end£¬j, i£¬*skip;
    K = right_end = pattern _len-1;
    for (i = 0; i <1024; i++) skip[i] = pattern_len;//³õʼ»¯skipÊý×é
    for (i = 0; pattern [i]; i++) skip[pattern [i]] = k - i; //¶ÔskipÊý×é½øÐÐÐÞÕý
    While (right_end < text_len){
    For (i = 0; i < pattern _len && text [right_end - i] == pattern [k - i]; i++);
    If (i == pattern _len) {
    return text+(right_end - k);//·µ»ØtextÆ¥ÅäµÄ¿ªÊ¼´¦
    }
    right_end = right_end + skip[text [right_end]];
    //ģʽÏòÓÒÒÆskip[text [right_end]]λ
    }
    Return NULL;
    }


    ¼ì²â¹¦ÄÜÖ÷ÒªÓÉmatch(const struct sk_buff *skb,const struct net_device *in, const struct net_device *out, const void *match info, int offset, const void *hdr,u_int16_t datalen,int *hotdrop)º¯ÊýʵÏÖ£¬¸Ãº¯Êý´Ó»º³åÇøskb¶ÁÈ¡ÍøÂçÊý¾Ý°ü£¬Ê¹ÓÃmatch info½ÓÊÜÀ´×ÔÓû§¿Õ¼äµÄÆ¥ÅäÄÚÈÝ£¬´ÓskbÖмÆËã³öÊý¾Ý°üµÄ´óСtlen£¬´Ómatch infoÖлñȡƥÅäÄÚÈݵĴóСmlen£¬Èç¹ûÊý¾Ý°üÄÚÈÝΪ¿Õ»òmlen>tlenÔò·µ»Ø0²»ÄܽøÐбȽϣ»·ñÔò½«ÍøÂçÊý¾Ý°üÄÚÈݺʹóСtlen¡¢match infoÖÐÊý¾Ý¼°´óСmlen×÷Ϊ²ÎÊýµ÷ÓÃids_match½øÐÐÆ¥Å䣬Ȼºó·µ»ØÆ¥Åä½á¹û¡£

    Ìî³äÓû§¿Õ¼äµÄÊý¾Ý½á¹¹Ê±£¬Òª±£Ö¤nameÓëºËÐĶÔÓ¦µÄMatchÃûÏàͬ£¬²¢ÇÒΪÁËÌṩÃüÁîÐи½¼ÓÑ¡ÏîÐèÒªÌî³äextra_optsÊý¾Ý½á¹¹Îª{"ids",1,0,'1'}£¬Ëü±íʾids´ø²ÎÊýÖµ£¬Èç¹û³öÏÖ¡°--ids ¡°Æ¥ÅäÖµ¡±¡±¾Í»á·µ»Ø¡¯1¡¯ÓÃÓÚparse()µÄ²ÎÊýÀ´¶Ô¸½¼ÓÐÅÏ¢½øÐд¦ÀíÈç¼ì²é¸½¼ÓÑ¡ÏîÖÐÊÇ·ñÓзǣ¨£¡£©ºÅ´æÔÚ£¬´ÓÃüÁîÐнâÎöµÃµ½Æ¥ÅäÄÚÈݲ¢½«ÆäÌî³äµ½´«Èëµ½ÄÚºËÄ£¿éµÄÊý¾Ý½á¹¹ÖС£