2008-07-07 22:06
PREROUTING£ºip_conntrack_defrag à ip_conntrack_in
1£¬ip_conntrack_defrag:
ͨ³£µ±IP±¨Îı»ËÍÖÁL4²ã´¦Àíʱ£¬Èç¹û¸Ã±¨ÎÄÊÇ·ÖÆ¬±¨ÎÄ£¬ÄÇô±¨ÎľͻáÏȱ»±£´æÆðÀ´£¬Ö±µ½ËùÓÐ·ÖÆ¬µ½´ïºóÖØ×é³ÉÒ»¸öÍêÕû±¨Îĺó£¬ÔÙ±»·Ö·¢µ½L4²ã¡£µ±Ã»ÓÐÆô¶¯conntrackʱ£¬netfilter¸÷HOOKµã¶Ô±¨ÎIJÙ×÷ʱ£¬²¢²»¼ì²é¸Ã±¨ÎÄÊÇ·ñ·ÖƬ£»µ«ÊÇÈç¹ûÆô¶¯conntrack¹¦ÄÜ£¬Ôò±ØÐë±£Ö¤½øÈënetfilter HOOKµãµÄ±¨ÎÄÊÇÒ»¸öÍêÕûµÄ±¨ÎÄ£¬Òò´Ëip_conntrack_defragÒ»°ã´¦ÓÚ×îǰ¶ËµÄHOOK£¬¸ºÔð½«·ÖÆ¬±¨ÎÄÖØ×é¡£
/* Èô±¨ÎÄ·ÖÆ¬£¬Ôò µ÷ÓÃip_ct_gather_frags ×é×°±¨ÎÄ£¬Èç¹ûËùÓÐ·ÖÆ¬¾ùÒѵ½´ï£¬pskbÖ¸ÏòÐÂÉú³ÉµÄ±¨ÎÄ£¬¼ÌÐøÑØ×ÅHOOKÁ´½øÐÐÏÂÒ»²½´¦Àí£»·ñÔòΪ¿Õ£¬±¨Îı»»º´æµÈ´ýÏÂÒ»·ÖƬµ½À´*/
if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
*pskb = ip_ct_gather_frags(*pskb,
hooknum == NF_IP_PRE_ROUTING ?
......
2008-07-07 22:09
3£¬init_conntrack£º
init_conntrackÓÃÓÚ´´½¨Ò»¸öеÄip_conntrack£¬²¢¶ÔÆä½øÐгõʼ»¯¡£
/*1,ÿһ¸öÁ¬½Ó°üº¬Á½¸ötuple£¬originalºÍreply£¬ip_ct_invert_tuple ¸ù¾Ý´«ÈëµÄoriginal tuple»ñÈ¡Æäreply tuple£¬Æä×îÖÕ½«µ÷ÓÃËùÊôÐÒéµÄinvert_tuple Íê³É´¦Àí*/
if (!ip_ct_invert_tuple(&repl_tuple, tuple, protocol)) {
DEBUGP("Can't invert tuple.\n");
return NULL;
}
/*2,´ÓcacheÖÐΪconntrack·ÖÅäÄڴ棬²¢½øÐÐͨÓõijõʼ»¯£¬Èç³õʼ»¯tuplehash¡¢timeoutºÍct_general£»Èç¹ûµ±Ç°Á¬½ÓÊýÒÑ´ïÉÏÏÞ£¬Ôòµ÷ÓÃearly_dropÊÍ·ÅtupleËùÔÚhashÁ´ÉϵÄδӦ´ðÏî*/
conntrack = ip_conntrack_alloc(tuple, &repl_tuple);
/*3,µ÷ÓÃËùÊôÐÒéµÄnewº¯Êý£¬¸ù¾Ý±¨ÎÄÊý¾Ý£¬³õʼ»¯conntrack£¬ºÍÐÒéÏà¹ØµÄ˽Óд¦Àí£¬½«·Åµ½¶Ô¾ßÌåÐÒétcp·ÖÎöʱÌÖÂÛ*/
if (!protocol->new(conntrack, skb)) {
ip_conntrack_free(conntrack);
return NULL;
}
/*4,expectºÍhelper¾ùºÍ¶¯Ì¬ÐÒéÏà¹Ø£¬½«ÔÚ·ÖÎöftpÐÒéʱ×öÖØµã½é ......
2008-07-07 22:09
6£¬TCP filterµÄÔÀí£º
µ±filterÊÕµ½Ä³¸öÁ¬½ÓµÄµÚÒ»¸ö±¨ÎÄʱ£¬»áΪ¸ÃÁ¬½ÓÔÚÈ«¾ÖÁ¬½Ó±íÖд´½¨Ò»¸ö±íÏ²¢Óñ¨ÎÄÖÐЯ´øµÄÔ´¡¢Ä¿µÄIPºÍ¶Ë¿ÚÕâ¸öËÄÔª×é´´½¨original tupleºÍreply tuple£¬ÕâÁ½¸ötuple·Ö±ð´Ó²»Í¬·½ÏòÀ´±êʶÕâ¸öÁ¬½Ó¡£ºóÐøµÄ±¨ÎÄ»á¸ù¾ÝÆäЯ´øµÄËÄÔª×éÕÒµ½ÏàÓ¦µÄÁ¬½Ó±íÏȻºó¸ù¾Ý±íÏîËù¼Ç¼µÄÀúʷ״̬£¬¼ì²é±¨ÎÄËùЯ´øµÄack¡¢Êý¾ÝÊÇ·ñÓÐЧ¡£
filterͨ¹ý·ÖÎö¸ÃÁ¬½ÓËùÓеÄÀúÊ·±¨ÎÄ£¬¼ÆËã³öackºÍÊý¾ÝÏàÓ¦µÄ×î´ó×îС·§Öµ£¬À´¼ì²éе½´ï±¨ÎÄackºÍÊý¾ÝµÄÓÐЧÐÔ¡£¸ÃÁ¬½ÓÏà¹ØµÄ×î´ó×îС·§ÖµÊǶ¯Ì¬±ä»¯µÄ£¬µ±Ð±¨ÎÄͨ¹ýÓÐЧÐÔ¼ì²éºó£¬·§Öµ½«Ê¹ÓÃб¨ÎÄËùЯ´øµÄÄÚÈÝÖØÐ¼ÆËã¡£ÔÚÌÖÂÛÈçºÎÈ·Á¢·§ÖµÖ®Ç°£¬ÏÈÀ´¿´¼¸ÌõÔ¼¶¨¡£¼ÙÉèAºÍBÖ®¼äµÄ±¨Îͼ¾¹ýfilter£¬ÄÇô£º
l filter¿ÉÒÔ¿´µ½A¡¢BÖ®¼äµÄËùÓб¨ÎÄÊý¾Ý£»
l filter¿ÉÒÔ¿´µ½Ã¿¸ö±¨ÎÄÖÐËùÉùÃ÷µÄ´°¿Ú´óС£»
l Èç¹ûB·¢Ë͵ı¨ÎĵÄACK±ê־λÖÃ룬ÇÒACK = n£¬ÄÇôfilter¿ÉÒÔÈÏΪBÒѽÓÊÕµ½µÄAÊý¾Ý£¬Æä³¤¶ÈÖÁÉÙΪn¡£
1£ ......
±¾ÎĵµµÄCopyleft¹éyfydzËùÓУ¬Ê¹ÓÃGPL·¢²¼£¬¿ÉÒÔ×ÔÓÉ¿½±´£¬×ªÔØ£¬×ªÔØÊ±Çë±£³ÖÎĵµµÄÍêÕûÐÔ£¬ÑϽûÓÃÓÚÈκÎÉÌÒµÓÃ;¡£
msn: yfydz_no1@hotmail.com
À´Ô´£ºhttp://yfydz.cublog.cn
1. ǰÑÔ
¶ÔIPË鯬µÄÖØ×éÊÇ·À»ðǽÌá¸ß°²È«ÐÔµÄÒ»¸öÖØÒªÊֶΣ¬Í¨¹ýÌáǰ½øÐÐË鯬֨×飬¿ÉÒÔÓÐЧ·ÀÓù¸÷ÖÖË鯬¹¥»÷£¬LinuxÄں˵ķÀ»ðǽnetfilter¾Í×Ô¶¯¶ÔIPË鯬°ü½øÐÐÁËÖØ×飬±¾ÎĽéÉÜLinuxÄÚºËÖеÄIPÖØ×é¹ý³Ì£¬Äں˴úÂë°æ±¾2.4.26¡£
2. ´¦ÀíÁ÷³Ì
ʵÏÖIPÖØ×éµÄ»ù±¾º¯ÊýΪip_defrag()£¬ÔÚnet/ipv4/ip_fragment.cÖÐʵÏÖ£¬»ù±¾¹ý³ÌÊǽ¨Á¢Ë鯬´¦Àí¶ÓÁУ¬¶ÓÁÐÖÐÿ¸ö½ÚµãÊÇÒ»¸öÁ´±í£¬Õâ¸öÁ´±í±£´æÍ¬Ò»¸öÁ¬½ÓµÄË鯬£¬µ±Ë鯬¶¼µ½´ïÖ®ºó½øÐÐÊý¾Ý°üÖØ×飬»òÕßÔÚÒ»¶¨Ê±¼ä(ȱʡ30Ãë)ÄÚËùÓÐË鯬°ü²»Äܵ½´ï¶øÊͷŵô¡£
2.1 Êý¾Ý½á¹¹
ÔÚ´¦Àí·ÖƬ°üʱ£¬½«skb°üµÄcb×ֶα£´æË鯬¿ØÖÆÐÅÏ¢struct ipfrag_skb_cb¡£
#define FRAG_CB(skb) ((struct ipfrag_skb_cb*)((skb)->cb))
struct ipfrag_skb_cb
{
struct inet_skb_parm h;
int offset;
};
ipq¶ÓÁнڵã½á¹¹£º
/* Describe an entry in the "incomplete datagrams" queue. * ......
http://tech.163.com/05/0701/10/1NIODMQS00091589.html
ÒòΪÔÚPL/SQL Öв¢Ã»ÓÐÊý×é.
ÕâÊÇż²é×ÊÁÏÕҵķ¶ÀýºÍ×Ô¼ºÐ´µÄ·¶ÀýÀ´½âÊÍÈçºÎÔÚPL/SQL ÖÐʹÓÃÊý×é. Ò²ÐíºÜ¶àÈËÒÑÖªµÀ, ²»¹ý¾ÍÊÇÈò»ÖªµÀµÄÅóÓÑÃÇÁ˽âһϰɡ£
----------------------
µ¥Î¬Êý×é
------------------------
DECLARE
TYPE
emp_ssn_array IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
best_employees
emp_ssn_array;
worst_employees emp_ssn_array;
BEGIN
best_employees(1)
:= '123456';
best_employees(2) := '888888';
worst_employees(1)
:= '222222';
worst_employees(2) := '666666';
FOR i IN
1..best_employees.count LOOP
DBMS_OUTPUT.PUT_LINE('i='|| i || ',
best_employees= ' ||best_employees(i)
|| ', worst_employees= '
||worst_employees(i));
END LOOP;
END;
---------------------- ¶à
άÊý×é
------------------------
DECLARE
TYPE
emp_type IS RECORD
( emp_id employee_table.emp_id%TYPE,
emp_name
employee_table.emp_name%TYPE,
emp_gender
employee_table.emp_gender%TYPE );
TYPE emp_type_array IS TABLE OF
emp_type ......
http://tech.163.com/05/0701/10/1NIODMQS00091589.html
ÒòΪÔÚPL/SQL Öв¢Ã»ÓÐÊý×é.
ÕâÊÇż²é×ÊÁÏÕҵķ¶ÀýºÍ×Ô¼ºÐ´µÄ·¶ÀýÀ´½âÊÍÈçºÎÔÚPL/SQL ÖÐʹÓÃÊý×é. Ò²ÐíºÜ¶àÈËÒÑÖªµÀ, ²»¹ý¾ÍÊÇÈò»ÖªµÀµÄÅóÓÑÃÇÁ˽âһϰɡ£
----------------------
µ¥Î¬Êý×é
------------------------
DECLARE
TYPE
emp_ssn_array IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
best_employees
emp_ssn_array;
worst_employees emp_ssn_array;
BEGIN
best_employees(1)
:= '123456';
best_employees(2) := '888888';
worst_employees(1)
:= '222222';
worst_employees(2) := '666666';
FOR i IN
1..best_employees.count LOOP
DBMS_OUTPUT.PUT_LINE('i='|| i || ',
best_employees= ' ||best_employees(i)
|| ', worst_employees= '
||worst_employees(i));
END LOOP;
END;
---------------------- ¶à
άÊý×é
------------------------
DECLARE
TYPE
emp_type IS RECORD
( emp_id employee_table.emp_id%TYPE,
emp_name
employee_table.emp_name%TYPE,
emp_gender
employee_table.emp_gender%TYPE );
TYPE emp_type_array IS TABLE OF
emp_type ......
--------------------------------²éѯϵͳ¿âÖÐÊÇ·ñÓп⣨Óпâ¾Íɾ³ý´Ë¿â£©----------------------------------------------------
use master
if exists(select * from databases where name='¿âÃû')
drop database ¿âÃû
__________________________ ½¨Êý¾Ý¿â½¨±íµÄ»ù±¾¸ñʽ ___________________________________________
create database ¿âÃû
on primary
(name='student1',filename='·¾¶\student1.mdf',size=10mb, filegrowth=15%), Ö÷Îļþ
(name='student2',filename='·¾¶\student2.ndf',size=10mb, filegrowth=15%) ´ËÎļþ
log on
(name='student1_log',filename='·¾¶\student1.ldf',size=1mb,filegrowth=15%,maxsize=300mb), ÈÕÖ¾Îļþ
(name='student2_log',filename='·¾¶\student2.ldf',size=1mb,filegrowth=15%,maxsize=300mb)
go
use ¿âÃû
create table ±íÃû
(ÁÐÃû1 Êý¾ÝÀàÐÍ Ö÷¼ü ÊÇ·ñÔö³¤ Ψһ  ......