ºñ¹ÐÀ» Çϳª ¸»¾¸µå¸®°Ú½À´Ï´Ù. ¹¹³ÄÇϸé, Á¦°¡ ±â¸£´Â ÇܽºÅͰ¡ ¸ðµç Äڵ带 ÀÛ¼ºÇß½À´Ï´Ù. Àú´Â ´ÜÁö Àü´ÞÇÏ´Â ¿ªÇÒ¸¸ Çß°í, ¸ðµç °èȹÀº Á¦ ¾Ö¿Ïµ¿¹°ÀÌ Çß½ÀÁÒ. ±×·¯´Ï ¹ö±×°¡ »ý±â´õ¶óµµ Àú¸¦ ¿ø¸ÁÇÏÁö ¸¶½Ã°í, ±Í¿©¿î ÅкϼþÀ̸¦ ¿ø¸ÁÇϽñ⠹ٶø´Ï´Ù.
iptables´Â ¸Þ¸ð¸® ³»¿¡ ÀÖ´Â ±ÔÄ¢ÀÇ ¸í¸íµÈ ¹è¿°ú °¢°¢ÀÇ ÈÅÀ¸·ÎºÎÅÍ ÆÐŶÀÌ Àü´ÞµÇ±â ½ÃÀÛÇØ¾ß ÇÏ´Â Á¤º¸¸¦ ´Ü¼øÈ÷ Á¦°ø¸¸ ÇÏ´Â °ÍÀÌ´Ù. ¾î¶² Å×À̺íÀÌ µî·ÏµÇ°í ³ª¸é, »ç¿ëÀÚ °ø°£Àº getsockopt()°ú setsockopt()¸¦ ÀÌ¿ëÇÏ¿© ±× ³»¿ëÀ» ÀÐ°í º¯°æÇÒ ¼ö ÀÖ´Ù.
iptables´Â ¾î¶°ÇÑ ³ÝÇÊÅÍ ÈÅ¿¡µµ µî·ÏÇÏÁö ¾ÊÀ¸¸ç, À̸¦ ¼öÇàÇÏ´Â ´Ù¸¥ ¸ðµâ¿¡ ÀÇÁ¸Çϰí ÀûÀýÈ÷ ÆÐŶÀ» ¸ðµâ¿¡ Àü´ÞÇÑ´Ù. ´Ù½Ã ¸»ÇØ, ÇϳªÀÇ ¸ðµâÀº ³ÝÇÊÅÍ ÈŰú ip_tables¿¡ µû·Îµû·Î µî·ÏÇØ¾ßÇÑ Çϰí, ÈÅÀÌ ¹ß»ýÇϸé ip_tables¸¦ È£ÃâÇÏ´Â ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÑ´Ù.
Æí¸®¼ºÀ» À§ÇØ, µ¿ÀÏÇÑ µ¥ÀÌÅÍ ±¸Á¶¸¦ »ç¿ëÇÏ¿© »ç¿ëÀÚ °ø°£¿¡ ÀÇÇÑ ±ÔÄ¢°ú Ä¿³Î³»ºÎÀÇ ±ÔÄ¢À» Ç¥ÇöÇÏ¿´´Ù. ÀÌ·¸°Ô Ç¥ÇöµÈ µ¥ÀÌÅÍ ±¸Á¶ Áß ¾ÆÁÖ ÀϺκи¸ÀÌ Ä¿³Î ³»ºÎ¿¡¼ »ç¿ëµÈ´Ù.
°¢°¢ÀÇ ±ÔÄ¢Àº ´ÙÀ½°ú °°Àº ºÎºÐÀ¸·Î ±¸¼ºµÈ´Ù.
`struct ipt_entry'
zero ¶Ç´Â ±× ÀÌ»óÀÇ `struct ipt_entry_match' ±¸Á¶·Î, °¢°¢Àº ¿©±â¿¡ Ãß°¡ °¡´ÉÇÑ µ¥ÀÌÅÍÀÇ Å©±â¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù.
`struct ipt_entry_target' ±¸Á¶: Ãß°¡ °¡´ÉÇÑ µ¥ÀÌÅÍ Å©±â º¯È °¡´É
`struct ipt_entry'´Â ´ÙÀ½°ú °°Àº Çʵ带 Æ÷ÇÔÇÑ´Ù.
`struct ipt_ip' : IP header¿¡ ´ëÇÑ ¼¼ºÎÇ׸ñÀ» Æ÷ÇÔ
`nf_cache' : ÇöÀçÀÇ ±ÔÄ¢À» °Ë»çÇØ¾ßÇÏ´Â ÆÐŶÀÇ ºÎºÐÀ» ¾Ë·ÁÁÖ´Â ºñÆ® Çʵå
`target_offset' : ipt_entry_target ±¸Á¶°¡ ½ÃÀÛÇÏ´Â ÇöÀç ±ÔÄ¢ÀÇ ½ÃÀÛÁ¡À¸·ÎºÎÅÍÀÇ offsetÀ» ¾Ë·ÁÁÖ´Â Çʵå
`next_offset' : ÇöÀç ±ÔÄ¢ÀÇ ÃÖ´ë Å©±â¸¦ ¾Ë·ÁÁÖ´Â Çʵå·Î match¿Í targetÀ» Æ÷ÇÔÇÑ´Ù. ÀÌ °Í ¿ª½Ã IPT_ALIGN ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¿© Á¤·ÄµÇ¾î¾ß ÇÑ´Ù.
`comefrom' : ÆÐŶÀÇ °æ·Î¸¦ ÃßÀûÇϱâ À§ÇØ Ä¿³ÎÀÌ »ç¿ëÇÏ´Â Çʵå
`struct ipt_counters' : ÇöÀç ±ÔÄ¢¿¡ ÀÏÄ¡ÇÏ´Â ÆÐŶ¿¡ ´ëÇÑ ¹ÙÀÌÆ® Ä«¿îÅÍ¿Í ÆÐŶÀ» Æ÷ÇÔÇÏ´Â Çʵå
`struct ipt_entry_match'¿Í `struct ipt_entry_target'Àº »ó´çÈ÷ À¯»çÇϸç, Àüü(IPT_ALIGNÀ¸·Î Á¤·ÄµÈ) ±æÀÌ Çʵå(°¢°¢ `match_size'¿Í `target_size')¿Í, match¿Í target(»ç¿ëÀÚ °ø°£¿¡ ´ëÇÑ) ¸íĪÀ» Æ÷ÇÔÇÏ´Â ±¸Á¶Ã¼, ±×¸®°í (Ä¿³Î¿¡ ´ëÇÑ) Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÑ´Ù.
Ä¿³ÎÀº ƯÁ¤ÇÑ ÈÅ¿¡ ÀÇÇØ Áö½ÃµÈ À§Ä¡¿¡¼ °üÂûÀ» ½ÃÀÛÇÏ¿©, ±×¿¡ °ü·ÃÇÑ ±ÔÄ¢À» °Ë»çÇϰí, `struct ipt_ip'ÀÇ element°¡ ÀÏÄ¡ÇÏ´Â °æ¿ì, Â÷·Ê·Î °¢°¢ÀÇ `struct ipt_entry_match'¸¦ °Ë»çÇÑ´Ù(match°¡ È£ÃâµÈ °÷°ú °ü·ÃÇÑ match functionÀ» ¼öÇàÇÑ´Ù). match functionÀÌ 0À» µ¹·ÁÁÖ´Â °æ¿ì, ÇöÀç ±ÔÄ¢¿¡ ´ëÇÑ ¹Ýº¹À» Áß´ÜÇÑ´Ù. `hotdrop' ÆÄ¶ó¹ÌÅͰ¡ 1·Î ¼³Á¤µÈ °æ¿ì, ÇöÀç ÆÐŶÀº Áï½Ã Æó±âµÈ´Ù(tcp match ÇÔ¼ö¿Í °°Àº °÷¿¡¼ Á¶±ÝÀÌ¶óµµ ¼ö»óÇÑ ÆÐŶ¿¡ ´ëÇØ »ç¿ëÇÑ´Ù).
¼öÇà¹Ýº¹ÀÌ ³¡±îÁö ÁøÇàµÈ °æ¿ì, Ä«¿îÅͰ¡ Áõ°¡Çϰí, `struct ipt_entry_target'ÀÌ °Ë»çµÈ´Ù. Ç¥ÁØ Å¸±êÀÎ °æ¿ì, `verdict' Çʵ带 Àд´Ù. `verdict' Çʵ尡 À½ÀÎ °æ¿ì ÆÐŶÀÌ °áÁ¤µÈ °ÍÀ» ÀǹÌÇÏ°í ¾çÀÎ °æ¿ì´Â À̵¿ÇؾßÇÒ offsetÀ» ÀǹÌÇÑ´Ù. ÀÀ´äÀÌ ¾çÀ̰í offsetÀÌ ´ÙÀ½ ±ÔÄ¢À» °¡¸®Å°Áö ¾ÊÀ¸¸é, `back' À̶ó´Â º¯¼ö°¡ ¼¼Æ®µÇ°í ÀÌÀüÀÇ `back' °ªÀÌ ÇöÀç ±ÔÄ¢ÀÇ `comefrom' Çʵ忡 ¼³Á¤µÈ´Ù.
ºñÇ¥ÁØ Å¸±ê¿¡ ´ëÇØ¼´Â target ÇÔ¼ö°¡ È£ÃâµÇ¾î, °áÁ¤À» ¾Ë·ÁÁÖ°Ô µÈ´Ù.(ºñÇ¥ÁØ Å¸±êÀº Á¤Àû ·çÇÁ °ËÃâ Äڵ带 À§¹ÝÇϱ⠶§¹®¿¡ À̵¿ÇÒ ¼ö ¾ø´Ù) ±× °áÁ¤Àº, ´ÙÀ½ ±ÔÄ¢À¸·Î °è¼Ó ÁøÇàÇϱâ À§Çؼ´Â IPT_CONTINUE°¡ µÉ °ÍÀÌ´Ù.
Àü ¹«ÁöÇÏ°Ô °ÔÀ¸¸¥ ³ÑÀ̶ó¼, iptables´Â ¾ó¸¶µçÁö È®Àå °¡´ÉÇÕ´Ï´Ù. ´Ù½Ã ¸»Çϸé Á¦ ¼ÕÀ» ¶°³ª ´Ù¸¥ »ç¶÷¿¡°Ô ³Ñ¾î°£, ¿ÀǼҽº ±× ÀÌ»óÀ̶ó´Â °ÅÁÒ.
iptables¸¦ È®ÀåÇÑ´Ù´Â °ÍÀº ´ÙÀ½ÀÇ µÎ ºÎºÐÀ» Æ÷ÇÔÇÑ´Ù. Áï, »õ·Î¿î ¸ðµâÀ» ÀÛ¼ºÇÏ¿© Ä¿³ÎÀ» È®ÀåÇÏ´Â °Í°ú »õ·Î¿î °øÀ¯ ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇÏ¿© »ç¿ëÀÚ Â÷¿øÀÇ ÇÁ·Î±×·¥ÀÎ iptables¸¦ È®ÀåÇÏ´Â °ÍÀÌ´Ù.
¿¹Á¦¸¦ º¸½Å »ç¶÷µéÀº ¾Ë°ÚÁö¸¸, Ä¿³Î ¸ðµâÀ» ÀÛ¼ºÇÑ´Ù´Â °Í ÀÚü´Â »ó´çÈ÷ ´Ü¼øÇÏ´Ù. ÇѰ¡Áö ¾Ë¾Æ¾ß ÇÒ °ÍÀº ¿©·¯ºÐÀÇ Äڵ尡 ÀçÁøÀÔ °¡´ÉÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾îº¸¸é, »ç¿ëÀÚ °ø°£À¸·ÎºÎÅÍ µé¾î¿À´Â ¾î¶² ÆÐŶÀÌ Á¸ÀçÇÒ ¼ö ÀÖÀ» °ÍÀ̸ç, µ¿½Ã¿¡ ¶Ç ´Ù¸¥ ÆÐŶÀÌ ÀÎÅÍ·´Æ®¿¡ ÀÇÇØ µé¾î ¿Ã ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸, Ä¿³Î 2.3.4À̻󿡼 SMP¸¦ »ç¿ëÇÒ °æ¿ì, CPU´ç ÇϳªÀÇ ÀÎÅÍ·´Æ®¿¡ ´ëÇØ ÇϳªÀÇ ÆÐŶ¸¸ Á¸ÀçÇÏ°Ô µÈ´Ù.
¿©·¯ºÐµéÀÌ ¾Ë¾Æ¾ß ÇÏ´Â ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.
¸ðµâÀÇ ÁøÀÔ Æ÷ÀÎÆ®·Î ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì À½¼ö¸¦ ³Ñ°ÜÁÖ¸ç ³ÝÇÊÅÍ¿¡ ¼º°øÀûÀ¸·Î µî·ÏÀÌ µÈ °æ¿ì 0À» µ¹·ÁÁØ´Ù.
¸ðµâÀÇ Á¾·á Æ÷ÀÎÆ®·Î ³ÝÇÊÅÍ¿¡¼ ¸ðµâÀÚü¸¦ µî·ÏÇØÁ¦ÇÑ´Ù.
»õ·Î¿î match ŸÀÔÀ» µî·ÏÇϱâ À§ÇÏ¿© »ç¿ëÇϸç, ÀÌ °ÍÀ» `struct ipt_match'·Î Àü´ÞÇØ¾ß ÇÑ´Ù. Åë»ó `struct ipt_match'´Â Á¤Àû º¯¼ö·Î Á¤ÀÇÇÑ´Ù.
»õ·Î¿î ŸÀÔÀ» µî·ÏÇϱâ À§ÇØ »ç¿ëÇϸç, ÀÌ °ÍÀ» `struct ipt_target'À¸·Î Àü´ÞÇØ¾ß ÇÑ´Ù. º¸Åë `struct ipt_target'Àº Á¤Àû º¯¼ö·Î Àü´ÞµÈ´Ù.
targetÀ» µî·ÏÇØÁ¦Çϱâ À§ÇØ »ç¿ëÇÑ´Ù.
match¸¦ µî·ÏÇØÁ¦Çϱâ À§ÇØ »ç¿ëÇÑ´Ù.
¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ »õ·Î¿î match³ª target¿¡ ´ëÇÑ »õ·Î¿î °ø°£ ³»¿¡¼ÀÇ Æí¹ý »ç¿ë(Ä«¿îÅÍ ±â´É Á¦°ø °°Àº)¿¡ ´ëÇÑ ÇѰ¡Áö °æ°í¸¦ ÇϰڴÙ. SMP ¸Ó½ÅÀÇ °æ¿ì °¢°¢ÀÇ CPU¿¡ ´ëÇÏ¿© Àüü Å×À̺íÀ» memcpy()¸¦ ÀÌ¿ëÇÏ¿© º¹»çÇÑ´Ù. Áï Áß½ÉÀÌ µÇ´Â Á¤º¸¸¦ º¸Á¸Çϱ⠹ٶõ´Ù¸é, `limit' match¿¡ »ç¿ëµÈ ¹æ¹ýÀ» ã¾ÆºÁ¾ß¸¸ ÇÒ °ÍÀÌ´Ù.
»õ·Î¿î match functionÀº ÀϹÝÀûÀ¸·Î µ¶¸³¸ðµâ·Î ÀÛ¼ºÇÑ´Ù. ¹Ù²Ù¾î ¸»Çϸé, ºñ·Ï Åë»óÀûÀ¸·Î ÇÊ¿äÇÏÁö ¾Ê´õ¶óµµ, ÀÌ·¯ÇÑ ¸ðµâ¿¡ È®À强À» Á¦°øÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀÌ´Ù. µû¶ó¼, »ç¿ëÀÚµéÀÌ Á÷Á¢ ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ ¸ðµâ°ú Åë½ÅÇÒ ¼ö ÀÖµµ·Ï ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷ÀÇ `nf_register_sockopt' ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÇϳªÀÇ ¹æ¹ýÀÌ µÉ °ÍÀÌ´Ù. ¶Ç ´Ù¸¥ ¹æ¹ýÀº ³ÝÇÊÅÍ ¸ðµâ°ú ip_tables¿¡ ±¸ÇöµÈ °Í°ú µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î, ´Ù¸¥ ¸ðµâÀÌ ÀÚ½ÅÀ» µî·ÏÇϵµ·Ï ½É¹úÀ» exportÇÏ´Â °ÍÀÌ´Ù.
¿©·¯ºÐ ÀÛ¼ºÇÑ »õ·Î¿î ÇÔ¼öÀÇ ÇÙ½ÉÀº ipt_register_match()·Î Àü´ÞµÇ´Â ipt_match ±¸Á¶Ã¼ÀÌ´Ù. ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº Çʵ带 Æ÷ÇÔÇÑ´Ù.
ÀÓÀÇÀÇ °ªÀ¸·Î ¼³Á¤µÇ´Â ÇʵåÀÌ´Ù. Áï `{ NULL, NULL }'
»ç¿ëÀÚ °ø°£¿¡¼ ÂüÁ¶µÇ´Â matchÇÔ¼öÀÇ À̸§À» ÀúÀåÇÏ´Â ÇʵåÀÌ´Ù. ÀÚµ¿ ·Îµù ±â´ÉÀÌ µ¿ÀÛÇϱâ À§Çؼ ÇÔ¼öÀÇ À̸§Àº ¸ðµâÀÇ À̸§°ú ÀÏÄ¡ÇÏ¿©¾ß ÇÑ´Ù. ¿¹¸¦ µé¸é, ÇÔ¼öÀ̸§ÀÌ ``mac''ÀÎ °æ¿ì, ¸ðµâÀ̸§Àº ¹Ýµå½Ã ``ipt_mac.o''À̾î¾ß ÇÑ´Ù.
match ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ´Â Çʵå·Î, skb, ÀÔ/Ãâ·Â ÀåÄ¡ÀÇ Æ÷ÀÎÅÍ(ÈÅ¿¡ µû¶ó µÑ Áß Çϳª´Â NULLÀÌ µÉ ¼öµµ ÀÖ´Ù), µ¿ÀÛ½Ãų ·ê¿¡ ÇØ´çÇÏ´Â match µ¥ÀÌÅÍÀÇ Æ÷ÀÎÅÍ, IP ¿ÀÇÁ¼Â(non-zero´Â non-head ÇÁ·¡±×¸ÕÆ®¸¦ ÀǹÌ), ÇÁ·ÎÅäÄÝ Çì´õ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ(°ú°ÅÀÇ IP header), µ¥ÀÌÅÍÀÇ ±æÀÌ(ÆÐŶ ±æÀÌ¿¡¼ IP Çì´õÀÇ ±æÀ̸¦ »« Å©±â) ±×¸®°í `hotdrop' º¯¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÃëÇÏ°Ô µÈ´Ù. ÆÐŶÀÌ ÀÏÄ¡Çϸé non-zero¸¦ µ¹·Á¾ß ÁÖ¾î¾ß Çϰí, 0À» µ¹·ÁÁÖ´Â °æ¿ì `hotdrop'Àº 1·Î ¼³Á¤ÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ´Â ÆÐŶÀ» ¹Ù·Î ¹ö·È´Ù´Â °ÍÀ» ¾Ë¸®±â À§ÇÑ °ÍÀÌ´Ù.
·ê¿¡ ´ëÇÑ ¼¼ºÎ¸í¼¼¸¦ È®ÀÎÇÏ´Â ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÑ´Ù. µî·ÏµÈ ÇÔ¼ö°¡ 0À» µ¹·ÁÁÖ´Â °æ¿ì, ÇöÀçÀÇ ·êÀº »ç¿ëÀڷκÎÅÍ ¹Þ¾Æµé¿©ÁöÁö ¾ÊÀ» °ÍÀÌ´Ù. ¿¹¸¦ µé¸é, ``tcp'' match ŸÀÔÀº ¿ÀÁ÷ tcp ÆÐŶ¸¸ ¹Þ¾ÆµéÀÏ °ÍÀ̰í, µû¶ó¼ ·êÀÇ `struct ipt_ip' ºÎºÐ¿¡ ÇÁ·ÎÅäÄÝÀº ¹Ýµå½Ã tcpÀ̾î¾ß ÇÑ´Ù°í ¸í½ÃµÇ¾î ÀÖÁö ¾Ê´Â ÇÑ 0ÀÌ ¸®ÅÏ µÉ °ÍÀÌ´Ù. tablename ÀÎÀÚ´Â »ç¿ëÀÚÀÇ match°¡ ¾î¶² Å×À̺íÀ» »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö¸¦ Çã°¡Çϰí, `hook_mask'´Â »ç¿ëÀÚÀÇ ·êÀÌ È£ÃâµÉ ¼ö ÀÖ´Â ÈÅ¿¡ ´ëÇÑ ºñÆ®¸Å½ºÅ©ÀÌ´Ù. ¸¸ÀÏ ¿©·¯ºÐÀÇ match°¡ ³ÝÇÊÅÍÀÇ ÀϺΠÈÅ¿¡ ´ëÇÏ¿© ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù¸é, ±× match¸¦ ÀÌ À§Ä¡¿¡¼ ¾ø¾Ù ¼ö ÀÖ´Ù.
ÇöÀçÀÇ match°¡ »èÁ¦µÉ °æ¿ì È£ÃâµÇ´Â ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇϸç, »ç¿ëÀÚ·Î ÇÏ¿©±Ý checkentry¿¡¼ µ¿ÀûÀ¸·Î ¸®¼Ò½º¸¦ Àç¹èÄ¡ÇÏ°í ¶Ç À̸¦ ¾ø¾Ù ¼ö ÀÖµµ·Ï ÇÑ´Ù.
`THIS_MODULE'·Î ¼³Á¤µÇ¸ç, ÀÌ´Â ¿©·¯ºÐÀÇ ¸ðµâ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µ¹·ÁÁØ´Ù. ¾î¶² ŸÀÔÀÇ ±ÔÄ¢ÀÌ »ý¼ºµÇ°Å³ª ¼Ò¸êµÇ´Â °æ¿ì usage-count¸¦ Áõ°¡ ȤÀº °¨¼Ò½ÃŲ´Ù. ¾î¶² ±ÔÄ¢ÀÌ ÀÌ °ÍÀ» ÂüÁ¶Çϰí ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í »ç¿ëÀÚ°¡ ¸ðµâÀ» Á¦°ÅÇϰíÀÚ ÇÏ´Â °æ¿ì, »ç¿ëÀÚ°¡ ¸ðµâÀ» Á¦°ÅÇÏÁö ¸øÇϵµ·Ï ÇÑ´Ù.
¿©·¯ºÐÀÇ Å¸±êÀÌ ÆÐŶ(Çì´õ³ª ¹Ùµð)À» º¯°æ½ÃŲ´Ù¸é, ÆÐŶÀÌ º¹Á¦µÇ´Â ½ÃÁ¡¿¡¼ ÆÐŶÀ» º¹»çÇϱâ À§ÇÏ¿© skb_unshare()¸¦ È£ÃâÇØ¾ß¸¸ ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é skbuff¿¡ º¹Á¦µÈ ÆÐŶÀÌ ÀÖ´Â ¾î¶°ÇÑ raw socketÀÌ¶óµµ º¯°æµÈ »çÇ×À» ¾Ë¾ÆÂ÷¸®°Ô µÈ´Ù.
»õ·Î¿î targetÀº Åë»óÀûÀ¸·Î ´Üµ¶ ¸ðµâ·Î ÀÛ¼ºµÈ´Ù. `New Match Functions'ÀÇ Àý¿¡¼ ¾ð±ÞÇÑ ¹Ù¿Í µ¿ÀÏÇÑ ³»¿ëÀÌ ¿©±â¼µµ Àû¿ëµÈ´Ù.
¿©·¯ºÐÀÇ »õ·Î¿î targetÀÇ ÇÙ½ÉÀº ipt_register_target()À¸·Î Àü´ÞµÇ´Â struct ipt_targetÀ¸·Î, ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº Çʵ带 °®°í ÀÖ´Ù.
ÀÓÀÇÀÇ °ªÀ¸·Î ¼³Á¤µÇ´Â ÇʵåÀÌ´Ù. Áï `{ NULL, NULL }'
»ç¿ëÀÚ °ø°£¿¡¼ ÂüÁ¶µÇ´Â target ÇÔ¼öÀÇ À̸§À» ÀúÀåÇÏ´Â ÇʵåÀÌ´Ù. ÀÚµ¿ ·Îµù ±â´ÉÀÌ µ¿ÀÛÇϱâ À§Çؼ ÇÔ¼öÀÇ À̸§Àº ¸ðµâÀÇ À̸§°ú ÀÏÄ¡ÇÏ¿©¾ß ÇÑ´Ù. ¿¹¸¦ µé¸é, ÇÔ¼öÀ̸§ÀÌ ``REJECT''ÀÎ °æ¿ì, ¸ðµâÀ̸§Àº ¹Ýµå½Ã ``ipt_REJECT.o''À̾î¾ß ÇÑ´Ù.
target ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ´Â Çʵå·Î, skbuff, ÈÅ ³Ñ¹ö, ÀÔ/Ãâ·Â ÀåÄ¡ÀÇ Æ÷ÀÎÅÍ(ÈÅ¿¡ µû¶ó µÑ Áß Çϳª´Â NULLÀÌ µÉ ¼öµµ ÀÖ´Ù), target µ¥ÀÌÅÍÀÇ Æ÷ÀÎÅÍ, Å×ÀÌºí¿¡ ÀÖ´Â ·êÀÇ À§Ä¡¸¦ °ªÀ¸·Î °®°Ô µÈ´Ù. ÆÐŶÀÌ °è¼Ó ÁøÇàÇØ¾ß ÇÑ´Ù¸é target ÇÔ¼ö´Â IPT_CONTINUE(-1)À» µ¹·ÁÁÖ°í, ±×·¸Áö ¾ÊÀº °æ¿ì´Â NF_DROP, NF_ACCEPT, NF_STOLENµîÀ» µ¹·ÁÁÖ¾î ÆÐŶÀÇ ¿î¸íÀ» °áÁ¤ÇÏ°Ô µÈ´Ù.
·ê¿¡ ´ëÇÑ ¼¼ºÎ¸í¼¼¸¦ È®ÀÎÇÏ´Â ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÑ´Ù. µî·ÏµÈ ÇÔ¼ö°¡ 0À» µ¹·ÁÁÖ´Â °æ¿ì, ÇöÀçÀÇ ·êÀº »ç¿ëÀڷκÎÅÍ ¹Þ¾Æµé¿©ÁöÁö ¾ÊÀ» °ÍÀÌ´Ù.
ÇöÀçÀÇ targetÀÌ »ç¿ëÁßÀÎ entry°¡ »èÁ¦µÉ °æ¿ì È£ÃâµÇ´Â ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇϸç, »ç¿ëÀÚ·Î ÇÏ¿©±Ý checkentry¿¡¼ µ¿ÀûÀ¸·Î ¸®¼Ò½º¸¦ Àç¹èÄ¡ÇÏ°í ¶Ç À̸¦ ¾ø¾Ù ¼ö ÀÖµµ·Ï ÇÑ´Ù.
`THIS_MODULE'·Î ¼³Á¤µÇ¸ç, ÀÌ´Â ¿©·¯ºÐÀÇ ¸ðµâ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µ¹·ÁÁØ´Ù. ¾î¶² ŸÀÔÀÇ ±ÔÄ¢ÀÌ »ý¼ºµÇ°Å³ª ¼Ò¸êµÇ´Â °æ¿ì usage-count¸¦ Áõ°¡ ȤÀº °¨¼Ò½ÃŲ´Ù. ¾î¶² ±ÔÄ¢ÀÌ ÀÌ °ÍÀ» ÂüÁ¶Çϰí ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í »ç¿ëÀÚ°¡ ¸ðµâÀ» Á¦°ÅÇϰíÀÚ ÇÏ´Â °æ¿ì, »ç¿ëÀÚ°¡ ¸ðµâÀ» Á¦°ÅÇÏÁö ¸øÇϵµ·Ï ÇÑ´Ù.
¿©·¯ºÐµéÀÇ ¸ñÀû¿¡ ¸Â´Â »õ·Î¿î tableÀ» ÀÛ¼ºÇÒ ¼ö ÀÖÀ¸¸ç, À̸¦ À§Çؼ´Â `ipt_register_table()'ÇÔ¼ö¸¦ È£ÃâÇØ¾ßÇÑ´Ù. ÀÌ ÇÔ¼ö´Â Àü´ÞÀÎÀÚ·Î `struct ipt_table'À» ¹ÞÀ¸¸ç ±× ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.
ÀÓÀÇÀÇ °ªÀ¸·Î ¼³Á¤µÇ´Â ÇʵåÀÌ´Ù. Áï `{ NULL, NULL }'
»ç¿ëÀÚ °ø°£¿¡¼ ÂüÁ¶µÇ´Â table ÇÔ¼öÀÇ À̸§À» ÀúÀåÇÏ´Â ÇʵåÀÌ´Ù. ÀÚµ¿ ·Îµù ±â´ÉÀÌ µ¿ÀÛÇϱâ À§Çؼ ÇÔ¼öÀÇ À̸§Àº ¸ðµâÀÇ À̸§°ú ÀÏÄ¡ÇÏ¿©¾ß ÇÑ´Ù. ¿¹¸¦ µé¸é, ÇÔ¼öÀ̸§ÀÌ ``nat''ÀÎ °æ¿ì, ¸ðµâÀ̸§Àº ¹Ýµå½Ã ``ipt_nat.o''À̾î¾ß ÇÑ´Ù.
`struct ipt_replace'·Î °¡µæ Âù Çʵå·Î, Å×À̺íÀ» ±³Ã¼Çϱâ À§ÇÏ¿© »ç¿ëÀÚ °ø°£¿¡¼ »ç¿ëµÈ´Ù. `counters' Æ÷ÀÎÅÍ´Â NULL·Î ¼³Á¤µÇ¾î¾ß ÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â `__initdata'·Î ¼±¾ðµÇ±â ¶§¹®¿¡ ºÎÆÃ ÈÄ¿¡´Â ÃʱâȵȴÙ.
Å×À̺í·Î ÁøÀÔÇϰíÀÚ ÇÏ´Â IPv4 ³ÝÇÊÅÍ ÈÅÀÇ ºñÆ®¸Å½ºÅ©ÀÌ´Ù. ÁøÀÔ¿£Æ®¸®°¡ À¯È¿ÇÑÁö È®ÀÎÇϰí, ipt_match¿Í ipt_targetÀÇ `checkentry()'ÇÔ¼ö¿¡ ´ëÇØ »ç¿ë °¡´ÉÇÑ ÈÅÀ» °è»êÇϱâ À§ÇØ »ç¿ëÇÑ´Ù.
Àüü Å×ÀÌºí¿¡ ´ëÇÏ¿© ÀÐ°í ¾²±â°¡ °¡´ÉÇÑ spinlockÀ̸ç, RW_LOCK_UNLOCKED·Î ÃʱâÈ µÈ´Ù.
ip_tables Äڵ忡 ÀÇÇØ ³»ºÎÀûÀ¸·Î »ç¿ëµÈ´Ù.
ÀÌÁ¦ ¿©·¯ºÐµéÀÌ Á÷Á¢ Ä¿³Î ¸ðµâÀ» ÀÛ¼ºÇß°í, »ç¿ëÀÚ °ø°£¿¡¼ ÀÌ¿¡ ´ëÇÑ ¿É¼ÇÀ» Á¶Á¤Çϱ⸦ ¿øÇÒ °ÍÀÌ´Ù. ÇÊÀÚ´Â °¢°¢ È®ÀåµÈ ¹öÀü¿¡ ´ëÇÏ¿© »õ·ÎÀÌ ÆÄ»ýµÈ ¹öÀüÀ» ¸¸µå´Â °Íº¸´Ù´Â ¾ÆÁÖ ÃÖ½ÅÀÇ 90³â´ë ±â¼úÀ» »ç¿ëÇÑ´Ù. Áï furbiesÀÌ´Ù. ½ý¸®... °øÀ¯¶óÀ̺귯¸®¸¦ ¸»ÇÏ´Â °ÍÀÌ´Ù.
»õ·Î¿î Å×À̺íÀ» »ç¿ëÇϰíÀÚ ÇÏ´Â °æ¿ì iptables¸¦ È®ÀåÇÒ ÇÊ¿ä´Â ¾ø°í, `-t' ¿É¼Ç¸¸ ÁÖ¸é µÈ´Ù.
°øÀ¯¶óÀ̺귯¸®´Â `_init()'ÇÔ¼ö¸¦ Æ÷ÇÔÇØ¾ßÇϸç, ÀÌ ÇÔ¼ö´Â ¸ðµâÀÌ ·Îµù µÇ´Â ½ÃÁ¡¿¡¼ ÀÚµ¿À¸·Î È£ÃâµÈ´Ù. ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ °øÀ¯¶óÀ̺귯¸®°¡ »õ·Î¿î match³ª »õ·Î¿î targetÀ» Æ÷ÇÔÇÏ´À³Ä¿¡ µû¶ó _init()ÇÔ¼ö°¡ `register_match()'³ª `register_target()'ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
°øÀ¯¶óÀ̺귯¸®¸¦ Á¦°øÇؾßÇÒ Çʿ䵵 ÀÖÀ¸¸ç, ±¸Á¶Ã¼ÀÇ ÀϺθ¦ ÃʱâÈÇϰųª Ãß°¡ ¿É¼ÇÀ» Á¦°øÇÏ´Â µ¥ °øÀ¯¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. ÇÊÀÚ´Â °øÀ¯¶óÀ̺귯¸®°¡ ¾Æ¹«°Íµµ ¾È ÇÒÁö¶óµµ °øÀ¯¶óÀ̺귯¸®´Â ¶óÀ̺귯¸®°¡ ¾øÀ» ¶§ ¹ß»ýÇÏ´Â ¹®Á¦¸¦ ÁÙÀÏ ¼ö Àֱ⠶§¹®¿¡ ¹Ýµå½Ã °øÀ¯¶óÀ̺귯¸®¸¦ »ç¿ëÇϱ⸦ ÁÖÀåÇÑ´Ù.
`iptables.h' Çì´õ¿¡ À¯¿ëÇÑ ÇÔ¼öµéÀÌ Á¤ÀǵǾî ÀÖÀ¸¸ç, ±×Áß ´ÙÀ½°ú °°Àº °ÍµéÀÌ »ó´çÈ÷ À¯¿ëÇÏ´Ù.
Àü´ÞÀÎÀÚ°¡ `!'ÀÎÁö °Ë»çÇϰí, ¸ÂÀ¸¸é `invert' Ç÷¢ÀÌ ¼³Á¤µÇ°í, ±×·¸Áö ¾ÊÀ¸¸é, `invert' Ç÷¢À» ¼³Á¤ÇÑ´Ù. true°¡ ¸®ÅÏµÈ °æ¿ì ¿¹Á¦¿¡¼ º¸ÀÎ ¹Ù¿Í °°ÀÌ optiond¸¦ Áõ°¡½ÃÄѾßÇÑ´Ù.
½ºÆ®¸µÀ» ÁÖ¾îÁø ¹üÀ§ ³»ÀÇ ¼ýÀÚ·Î º¯È¯ÇÑ´Ù. Çü½ÄÀÌ Àß ¸ø µÇ¾ú°Å³ª ¹üÀ§¸¦ ¹þ¾î³ª¸é, -1ÀÌ ¸®ÅϵȴÙ. `string_to_number'´Â `strtol'À» »ç¿ëÇÑ´Ù. ´Ù½Ã ¸»Çϸé, ¼±Ç๮ÀÚ¿ ``0x''´Â 16Áø¼ö¶ó´Â °ÍÀ» ÀǹÌÇϰí, ``0''Àº 8Áø¼ö¶ó´Â °ÍÀ» ÀǹÌÇÏ°Ô µÈ´Ù.
¿¡·¯°¡ °ËÃâµÈ °æ¿ì È£ÃâµÇ´Â ÇÔ¼öÀÌ´Ù. ÀϹÝÀûÀ¸·Î ù ¹øÂ° Àμö´Â `PARAMETER_PROBLEM'À̸ç, »ç¿ëÀÚ°¡ Ä¿¸Çµå ¶óÀÎÀ» Á¤È®Çϱ⠻ç¿ëÇÏÁö ¾Ê¾Ò´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ °øÀ¯¶óÀ̺귯¸®ÀÇ _init() ÇÔ¼ö´Â `register_match()'¿¡ Á¤Àû ±¸Á¶Ã¼ÀÎ `struct iptables_match'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁØ´Ù. ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº Çʵ带 Æ÷ÇÔÇÑ´Ù.
matchÀÇ ¸µÅ©µå ¸®½ºÆ®¸¦ ¸¸µé±â À§ÇØ »ç¿ëµÇ´Â Æ÷ÀÎÅÍ·Î, Ãʱ⿡´Â NULL·Î ¼³Á¤µÈ´Ù.
match ÇÔ¼öÀÇ À̸§À¸·Î, ¶óÀ̺귯¸®ÀÇ À̸§°ú ÀÏÄ¡ÇØ¾ßÇÑ´Ù.(Áï, `libipt_tcp.so'¿¡ ´ëÇØ¼´Â ``tcp''¿Í °°ÀÌ...)
ÀϹÝÀûÀ¸·Î NETFILTER_VERSION ¸ÅÅ©·Î·Î ¼³Á¤µÇ¸ç, iptables ¹ÙÀ̳ʸ®ÆÄÀÏÀÌ ½Ç¼ö·Î ¾û¶×ÇÑ °øÀ¯¶óÀ̺귯¸®¸¦ ¼±ÅÃÇÏÁö ¾Êµµ·Ï Çϱâ À§ÇÏ¿© »ç¿ëµÈ´Ù.
ÇöÀç »ç¿ëÇÏ´Â match¿¡ ´ëÇÑ match µ¥ÀÌÅÍÀÇ Å©±â·Î, Á¤È®ÇÏ°Ô Á¤·ÄÇϱâ À§Çؼ´Â IPT_ALIGN() ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¿©¾ß ÇÑ´Ù.
ÀϺΠmatch¿¡ ´ëÇØ, Ä¿³ÎÀº ÀϺΠÇʵ带 ³»ºÎÀûÀ¸·Î º¯°æÇÑ´Ù. `limit' targetÀÌ ÁÁÀº ¿¹ÀÌ´Ù. ÀÌ´Â ´Ü¼øÇÑ `memcmp()'ÇÔ¼ö·Î´Â µÎ°³ÀÇ ·êÀ» ºñ±³Çϱ⿡´Â ºÎÁ·ÇÏ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¸¸ÀÏ ÀÌ·¯ÇÑ °æ¿ì°¡ ¹ß»ýÇÏ¸é ±¸Á¶Ã¼ÀÇ ½ÃÀÛÁ¡¿¡¼ º¯°æµÇÁö ¾Ê´Â ¸ðµç Çʵ带 À§Ä¡½Ã۰í, º¯°æµÇÁö ¾ÊÀº ÇʵåÀÇ Å©±â¸¦ ¿©±â¿¡ Áý¾î³Ö°Ô µÈ´Ù. ±×·¯³ª ÀϹÝÀûÀÎ °æ¿ì, ÀÌ Çʵå´Â `size'Çʵå¿Í µ¿ÀÏÇÑ °ªÀ» °®´Â´Ù.
¿É¼ÇÀÇ »ç¿ë¹ýÀ» ȸ鿡 Ãâ·ÂÇÑ´Ù.
ipt_entry_match ±¸Á¶Ã¼¿¡ Á¸ÀçÇÏ´Â º°µµÀÇ °ø°£(¸¸ÀÏ Á¸ÀçÇÑ´Ù¸é)À» ÃʱâÈÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ°í, ¾î¶°ÇÑ nfcache ºñÆ®µµ 1·Î ¼³Á¤ÇÑ´Ù. `linux/include/netfilter_ipv4.h'ÀÇ ³»¿ëÀ» ÀÌ¿ëÇÏ¿© Ç¥ÇöÇÒ ¼ö ¾ø´Â ¾î¶² °ÍÀ» °Ë»çÇϰíÀÖ´Ù¸é, °£´ÜÈ÷ NFC_UNKNOWN ºñÆ®¿Í OR¸¦ ÃëÇÏ¸é µÈ´Ù. ÀÌ ÇÔ¼ö´Â `parse()'º¸´Ù ¸ÕÀú È£ÃâµÇ¾î¾ß ÇÑ´Ù.
Ä¿¸Çµå ¶óÀο¡ ¾Ë ¼ö ¾ø´Â ¿É¼ÇÀÌ ÁÖ¾îÁø °æ¿ì È£ÃâµÇ¸ç, ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ ¶óÀ̺귯¸®¿¡ ÁÖ¾îÁø ¿É¼ÇÀÌ Á¸ÀçÇÏ´Â °æ¿ì non-zero¸¦ ¸®ÅÏ ÇÑ´Ù. `!'ÀÌ ÀÌ¹Ì ³ªÅ¸³ °æ¿ì´Â `invert'°¡ TRUE·Î ¼³Á¤µÈ´Ù. `flags' Æ÷ÀÎÅÍ´Â ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ ¶óÀ̺귯¸®ÀÇ ¹èŸÀû »ç¿ëÀ» À§ÇÑ °ÍÀ̸ç, Ưº°È÷ ¸í½ÃµÈ ¿É¼ÇÀÇ ºñÆ®¸Å½ºÅ©¸¦ ÀúÀåÇϱâ À§ÇÏ¿© »ç¿ëÇÑ´Ù. ¿©·¯ºÐµéÀº ncfcache Çʵ带 È®½ÇÈ÷ Á¶Á¤ÇÒ ¼ö ÀÖµµ·Ï ÇØ¾ßÇϸç, ÇÊ¿äÇÑ °æ¿ì¿¡´Â `ipt_entry_match' ±¸Á¶Ã¼ÀÇ Å©±â¸¦ È®ÀåÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ´Ù¸¸ ±× Å©±â´Â ¹Ýµå½Ã IPT_ALIGN ¸ÅÅ©·Î¸¦ °ÅÃļ Àü´ÞµÇ¾î¾ß ÇÑ´Ù.
Ä¿¸Çµå ¶óÀÎÀÌ ÆÄ½ÌµÈ ÈÄ È£ÃâµÇ´Â ÇÔ¼öÀ̸ç, ¿©·¯ºÐÀÇ ¶óÀ̺귯¸®¸¦ À§ÇØ ¿¹¾àµÈ `flags' Á¤¼ö¸¦ ´Ù·ç°Ô µÈ´Ù. À̸¦ ÀÌ¿ëÇÏ¸é ¾î¶² °Á¦ÀûÀÎ ¿É¼ÇÀÌ ¸í½ÃµÇ¾ú´Â Áö È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °æ¿ì°¡ ¹ß»ýÇϸé `exit_error()'À» È£ÃâÇØ¾ß ÇÑ´Ù.
¾î¶² ·ê¿¡ ´ëÇÏ¿© ºÎ°¡ÀûÀÎ match Á¤º¸¸¦ Ãâ·ÂÇϱâ À§ÇØ chain listing Äڵ忡¼ »ç¿ëÇÏ´Â ÇÔ¼öÀÌ´Ù. »ç¿ëÀÚ°¡ `-n' Ç÷¢À» ¸í½ÃÇÑ °æ¿ì numeric flagÀÌ ¼³Á¤µÈ´Ù.
¿©·¯ºÐÀÇ ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â ºÎ°¡ ¿É¼ÇÀÇ null-terminated ¸®½ºÆ®ÀÌ´Ù. ÀÌ ¿É¼ÇÀº ÇöÀç »ç¿ë ÁßÀÎ ¿É¼Ç¿¡ ´õÇØÁ®¼ getopt_longÀ¸·Î Àü´ÞµÈ´Ù. º¸´Ù ÀÚ¼¼ÇÑ °ÍÀº man ÆäÀÌÁö¸¦ º¸´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. getopt_long¿¡ ´ëÇÑ ¸®ÅÏ °ªÀº ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ `parse()' ÇÔ¼ö¿¡ ´ëÇÑ Ã¹ ¹øÂ° ÀÎÀÚ°¡ µÈ´Ù.
¿©·¯ºÐÀÇ °øÀ¯¶óÀ̺귯¸®ÀÇ _init() ÇÔ¼ö´Â `register_target()' ÇÔ¼ö·Î Á¤ÀûÀ¸·Î ¼±¾ðµÈ `struct iptables_target'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Àü´ÞÇϸç, ÀÌ´Â ¾Õ¼ ¾ð±ÞÇÑ iptables_match ±¸Á¶Ã¼¿Í À¯»çÇÑ Çʵ带 Æ÷ÇÔÇÑ´Ù.
libiptc´Â iptable Á¦¾î ¶óÀ̺귯¸®·Î iptable Ä¿³Î ¸ðµâ¿¡¼ ·êÀ» ³ª¿Çϰí ó¸®Çϱâ À§ÇÏ¿© ¼³°èµÇ¾ú´Ù. ÀÌ ¶óÀ̺귯¸®°¡ ÇöÀç »ç¿ëµÇ°í ÀÖ´Â °÷Àº iptables ÇÁ·Î±×·¥»ÓÀÌÁö¸¸, ´Ù¸¥ ÅøÀ» °³¹ßÇÏ´Â °÷¿¡µµ ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇϱâ À§Çؼ´Â ·çÆ® ±ÇÇÑÀÌ ÇÊ¿äÇÏ´Ù.
ÀÌ ÇÔ¼ö°¡ Á¦°øÇϴ ǥÁØ targetÀº ACCEPT, DROP, QUEUE, RETURN, ±×¸®°í JUMPÀÌ´Ù. ACCEPT, DROP, QUEUE´Â NF_ACCEPT, NF_DROP°ú NF_QUEUE·Î ¹ø¿ªµÇ°í, RETURNÀº ip_tables°¡ ó¸®Çϴ Ưº°ÇÑ IPT_RETURN °ªÀ¸·Î, JUMP´Â chain nameÀ¸·ÎºÎÅÍ table³»ÀÇ ½ÇÁ¦ ¿ÀÇÁ¼ÂÀ¸·Î ¹ø¿ªµÈ´Ù.
`iptc_init()' ÇÔ¼ö°¡ È£ÃâµÇ¸é, counter¸¦ Æ÷ÇÔÇÑ Å×À̺íÀÌ ÀÐÇôÁö°í, ÀÌ Å×À̺íÀº `iptc_insert_entry()', `iptc_replace_entry()', `iptc_append_entry()', `iptc_delete_entry()', `iptc_delete_num_entry()', `iptc_flush_entries()', `iptc_zero_entries()', `iptc_create_chain()', `iptc_delete_chain()' ±×¸®°í `iptc_set_policy()' ÇÔ¼ö¿¡ ÀÇÇØ 󸮵ȴÙ.
`iptc_commit()' ÇÔ¼ö°¡ È£ÃâµÇ±â Àü±îÁö´Â Å×À̺íÀÇ º¯È°¡ ±â·ÏµÇÁö ¾Ê´Â´Ù. µû¶ó¼, ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ´Â µÎ ¸íÀÇ À¯Àú°¡ µ¿ÀÏÇÑ chainÀ» Á¶ÀÛÇϰíÀÚ Çϱâ À§ÇØ ·¹À̽º(race)¸¦ ÇÏ´Â °æ¿ì°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¸ç, À̸¦ ¸·±â À§Çؼ´Â lockingÀ» »ç¿ëÇØ¾ß ÇÏÁö¸¸, ÇöÀç´Â ±¸ÇöµÇ¾î ÀÖÁö ¾Ê´Ù.
ÇÏÁö¸¸, counters¿¡ ´ëÇØ¼´Â ·¹À̽º(race)°¡ ¹ß»ýÇÏÁö ¾ÊÀ¸¸ç, ÀÌ´Â tablesÀÇ Àбâ¿Í ¾²±â Áß¿¡ ¹ß»ýÇÏ´Â countersÀÇ Áõ°¡°¡ »õ·Î¿î table¿¡ ³ªÅ¸³ª´Â ¹æ½ÄÀ» ÀÌ¿ëÇÏ¿© counter°¡ Ä¿³Î¿¡¼ ±â·ÏµÇ±â ¶§¹®ÀÌ´Ù.
¿©±â¿¡´Â ´ÙÀ½°ú °°Àº ´Ù¾çÇÑ helper ÇÔ¼ö°¡ ÀÖ´Ù.
table ³»ÀÇ Ã¹ ¹øÂ° chainÀÇ À̸§À» ¸®ÅÏ ÇÑ´Ù.
table ³»ÀÇ ´ÙÀ½ chainÀÇ À̸§À» ¸®ÅÏÇϸç, NULLÀº ´õ ÀÌ»ó chainÀÌ ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
ÁÖ¾îÁø chain nameÀÌ builtin chain nameÀ̸é TRUE¸¦ ¸®ÅÏ ÇÑ´Ù.
ÁÖ¾îÁø chain name³»ÀÇ Ã¹ ¹øÂ° ·êÀÇ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϸç, NULLÀÎ °æ¿ì´Â chainÀÌ ºñ¾ú´Ù´Â °ÍÀ» ¶æÇÑ´Ù.
chain³»ÀÇ ´ÙÀ½ ·ê¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϸç, NULLÀÎ °æ¿ì´Â chainÀÇ ³¡À̶ó´Â °ÍÀ» ¾Ë·ÁÁØ´Ù.
ÁÖ¾îÁø ·êÀÇ targetÀ» °¡Á®¿Â´Ù. È®ÀåµÈ targetÀ̶ó¸é, ±×¿¡ ÇØ´çÇÏ´Â targetÀÇ nameÀ» µ¹·ÁÁØ´Ù. ´Ù¸¥ chainÀ¸·ÎÀÇ jumpÀÎ °æ¿ì´Â ±× chainÀÇ À̸§À» µ¹·ÁÁØ´Ù. ¶Ç °áÁ¤(DROP °°Àº)ÀÎ °æ¿ì, ±× nameÀ» µ¹·ÁÁØ´Ù. accounting-style ruleó·³ targetÀÌ ¾ø´Â °æ¿ì´Â null stringÀ» µ¹·ÁÁØ´Ù.
ÀÌ ÇÔ¼ö°¡ Ç¥ÁØ °áÁ¤(ÆÇÁ¤)¿¡ ´ëÇÏ¿© º¸´Ù È®ÀåµÈ ÇØ¼®À» Á¦°øÇϱ⠶§¹®¿¡, ipt_entry ±¸Á¶Ã¼ÀÇ `verdict' ÇʵåÀÇ °ªÀ» Á÷Á¢ »ç¿ëÇÏ´Â ´ë½Å¿¡ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.
builtin chainÀÇ Á¤Ã¥À» °¡Á®¿À°í, ±× Á¤Ã¥¿¡ ´ëÇÑ ÀûÁß Åë°èÄ¡¸¦ `counters' ÀÎÀÚ¿¡ ä¿î´Ù.
iptc ¶óÀ̺귯¸®³»ÀÇ failure code¿¡ ´ëÇÏ¿© º¸´Ù ÀÇ¹Ì ÀÖ´Â ÇØ¼®À» ¸®ÅÏ ÇÑ´Ù. ¾î¶² ÇÔ¼ö°¡ ¿¡·¯¸¦ ¹ß»ýÇÑ °æ¿ì, Ç×»ó errno°¡ ¼³Á¤µÇ¸ç, ÀÌ °ªÀº iptc_strerror() ÇÔ¼ö·Î Àü´ÞµÇ¾î ¿¡·¯ ¸Þ½ÃÁö·Î º¯È¯µÈ´Ù.
ÀÌÁ¦ Ä¿³ÎÀÇ NAT(Network Address Translation)±îÁö ¿À¼Ì±º¿ä. ¿©±â¼ Á¦°øµÇ´Â ÇϺα¸Á¶´Â È¿À²º¸´Ù´Â ¿Ïº®¼º¿¡ ÁßÁ¡À» µÎ°í ¼³°èµÈ °ÍÀ̸ç, ÇâÈÄ °³Á¶¸¦ ÅëÇØ È¿À²¼ºÀÌ ÇöÀúÇÏ°Ô Áõ°¡µÉÁöµµ ¸ð¸¨´Ï´Ù. ÇöÀç Àú´Â ÀÌ ³ÑÀÌ µ¿ÀÛÇÑ´Ù´Â °Í¸¸À¸·Îµµ ÇູÇÕ´Ï´Ù.
NAT´Â ÆÐŶÀ» ÀüÇô ó¸®ÇÏÁö ¾Ê´Â connection tracking°ú NAT ÄÚµå ÀÚü·Î ºÐ¸®µÇ¾ú´Ù. connection tracking ¿ª½Ã iptables ¸ðµâ¿¡¼ »ç¿ëÇϱâ À§ÇØ ¼³°èµÇ¾úÀ¸¸ç, µû¶ó¼ NAT°¡ °ü½ÉÀ» µÎÁö ¾Ê´Â »óÅÂ(state)¿¡ ´ëÇØ¼ ¹Ì¹¦ÇÑ Â÷À̸¦ º¸ÀÌ°Ô µÈ´Ù.
¿¬°áÃßÀû(connection tracking)Àº ¿ì¼± ¼øÀ§°¡ ³ôÀº NF_IP_LOCAL_OUT°ú NF_IP_PRE_ROUTING ÈÅÀ¸·Î ÈÅÅ· µÇ¸ç, ÀÌ´Â ÆÐŶÀÌ ½Ã½ºÅÛÀ¸·Î ÁøÀÔÇϱâ Àü ±× ÆÐŶÀ» »ìÆìº¸±â À§ÇÔÀÌ´Ù.
skb¿¡ ÀÖ´Â nfct Çʵå´Â struct ip_conntrackÀÇ ³»ºÎ¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀ̸ç, ¹è¿ infos[] Áß ÇÑ °÷¿¡ Á¸ÀçÇÑ´Ù. Áï, ÀÌ ¹è¿³»ÀÇ ¾î¶² ¿ä¼Ò¸¦ °¡¸®Å°°Ô ÇÔÀ¸·Î½á skbÀÇ »óŸ¦ ¸»ÇÒ ¼ö ÀÖ´Ù. ´Ù½Ã ¸»ÇØ, ÀÌ Æ÷ÀÎÅÍ´Â state structure¿Í ±× »óÅ¿¡ ´ëÇÑ skbÀÇ °ü°è ¸ðµÎ¸¦ ¾Ë·ÁÁÖ°Ô µÈ´Ù.
`nfct' Çʵ带 ÃßÃâÇÏ´Â ÃÖ¼±ÀÇ ¹æ¹ýÀº `ip_conntrack_get()'À» È£ÃâÇÏ´Â °ÍÀ¸·Î, `nfct' ÇÊÆ®°¡ ¼¼Æ®µÇ¾î ÀÖÀ¸¸ç connection Æ÷ÀÎÅ͸¦ µ¹·ÁÁÖ°í ±×·¸Áö ¾ÊÀº °æ¿ì´Â NULLÀ» µ¹·ÁÁÖ¸ç, ÇöÀçÀÇ ¿¬°á¿¡ ´ëÇÑ ÆÐŶÀÇ °ü°è¸¦ Ç¥ÇöÇÏ´Â ctinfoÀ» ä¿î´Ù. `nfct'ÀÇ °ªµéÀº ¼öÄ¡È(enumerate)µÇ¾î ÀÖÀ¸¸ç, ´ÙÀ½°ú °°Àº °ªÀ» °®´Â´Ù.
¿ø·¡ ¹æÇâ¿¡ ´ëÇÏ¿© established connectionÀÇ ÀϺÎÀÎ ÆÐŶÀÌ´Ù.
connection¿¡ °ü·ÃµÈ ÆÐŶÀ¸·Î, ¿ø·¡ÀÇ ¹æÇâÀ¸·Î Àü´ÞµÇ°í ÀÖ´Ù.
»õ·Î¿î connectionÀ» »ý¼ºÇϰíÀÚ ÇÏ´Â ÆÐŶÀÌ´Ù.(ºÐ¸íÈ÷, ¿ø·¡ ÁøÇà¹æÇâ¿¡ Á¸ÀçÇÑ´Ù)
established connection¿¡ °ü·ÃµÈ ÆÐŶÀ¸·Î, ÀÀ´ä¹æÇâ(reply direction)À¸·Î ÇâÇϰí ÀÖ´Ù.
connection¿¡ °ü·ÃµÈ ÆÐŶÀ¸·Î, ÀÀ´ä¹æÇâ(reply direction)À¸·Î ÇâÇϰí ÀÖ´Ù.
ÀÌ ¹æ½ÄÀº ¿©·¯ °¡Áö ÇÁ·ÎÅäÄݰú ¼·Î ´Ù¸¥ ¸ÊÇΠŸÀÔÀ» Á¶ÀýÇϱâ À§ÇÏ¿© ¼³°èµÈ °ÍÀ¸·Î, ¸ÊÇΠŸÀÔ Áß ÀϺδ ºÎÇϺлê(load-balancing)À̳ª fail-over ¸ÊÆØ ŸÀÔó·³ »ó´çÈ÷ ±¸Ã¼ÀûÀÎ °Íµµ ÀÖ´Ù.
³»ºÎÀûÀ¸·Î´Â, connection trackingÀº ÀÏÄ¡ÇÏ´Â ·êÀ̳ª bindingÀ» °Ë»öÇϱâ Àü¿¡ ÆÐŶÀ» ``tuple''·Î º¯È¯½ÃŲ´Ù. ¿©±â¼ ``tuple''À̶õ ÆÐŶ Áß °ü½ÉÀÇ ´ë»óÀÌ µÇ´Â ºÎºÐÀ» ¸»ÇÑ´Ù. ``tuple''Àº ó¸® °¡´ÉÇÑ ºÎºÐ°ú ±×·¸Áö ¸øÇÑ ºÎºÐÀ¸·Î ±¸ºÐµÇ¸ç, °¢°¢ ``src''¿Í ``dst''¶ó°í ÇÑ´Ù. ÀÌ´Â Source NATÀÇ ÀÔÀå¿¡¼ ù ¹øÂ° ÆÐŶ¿¡ ´ëÇÑ °üÁ¡ÀÌ´Ù. µ¿ÀÏÇÑ ¹æÇâ¿¡ ÀÖ¾î µ¿ÀÏÇÑ ÆÐŶ ½ºÆ®¸²ÀÇ °¢ ÆÐŶ¿¡ ´ëÇÑ tupleÀº ¸ðµÎ µ¿ÀÏÇÏ´Ù.
¿¹¸¦ µé¾îº¸¸é, TCP ÆÐŶÀÇ tupleÀº ó¸® °¡´ÉÇÑ ºÎºÐÀ» Æ÷ÇÔÇÏ´Â µ¥ ÀÌ´Â source IP¿Í source PORTÀ̸ç, ó¸® ºÒ°¡´ÉÇÑ ºÎºÐÀº ¸ñÀûÁö IP¿Í ¸ñÀûÁö portÀÌ´Ù. ó¸® °¡´ÉÇÑ ºÎºÐ°ú ±×·¸Áö ¸øÇÑ ºÎºÐÀº ¹Ýµå½Ã °°Àº ŸÀÔÀ̾î¾ß ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ´Ù½Ã ¸»Çϸé ICMP ÆÐŶÀÇ tupleÀº source IP¿Í ICMP port °°Àº ó¸® °¡´ÉÇÑ ºÎºÐÀ» Æ÷ÇÔÇϸç, ó¸® ºÒ°¡´ÉÇÑ ºÎºÐÀº ¸ñÀûÁö IP¿Í ICMP ŸÀÔ°ú ÄÚµåÀÌ´Ù.
°¢°¢ÀÇ ÆÐŶÀº inverse¸¦ °¡Áö°í ÀÖÀ¸¸ç, ÀÌ´Â ½ºÆ®¸²¿¡ ÀÖ¾î¼ ÀÀ´äÆÐŶÀÇ tupleÀÌ´Ù. À̸¦Å׸é, icmp id°¡ 12345À̰í 192.168.1.1¿¡¼ 1.2.3.4·Î °¡´Â ICMP ping ÆÐŶÀÇ inverse´Â icmp id 12345À̰í 1.2.3.4¿¡¼ 192.168.1.1ÀÌ µÈ´Ù.
`struct ip_conntrack_tuple'·Î Ç¥ÇöµÇ´Â tupleÀº ³Î¸® »ç¿ëµÇ¸ç, ½ÇÁ¦·Î ÆÐŶÀÌ µé¾î¿À´Â ÈŰú µð¹ÙÀ̽º¸¦ Æ÷ÇÔÇÏ¿© ÆÐŶ¿¡ ´ëÇÑ ¿ÏÀüÇÑ Á¤º¸¸¦ Á¦°øÇÑ´Ù.
´ëºÎºÐÀÇ tupleÀº `struct ip_conntrack_tuple_hash'¿¡ Æ÷ÇԵǸç, ´õºí¸µÅ©µå ¸®½ºÆ®¿Í tupleÀÌ Æ÷ÇÔµÈ connection¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Ãß°¡ÇÑ´Ù.
connectionÀº `struct ip_conntrack'¿¡ ÀÇÇØ Ç¥ÇöµÇ¸ç, ÀÌ ±¸Á¶Ã¼´Â `struct ip_conntrack_tuple_hash'Çʵ带 µÎ°³ Æ÷ÇÔÇÑ´Ù. Çϳª´Â ¿øº» ÆÐŶ¿¡ ´ëÇÑ ¹æÇâ(tuplehash[IP_CT_DIR_ORIGINAL])À̸ç, ´Ù¸¥ Çϳª´Â ÀÀ´ä¹æÇâ¿¡ ´ëÇÑ ÆÐŶ(tuplehash[IP_CT_DIR_REPLY])¿¡ ´ëÇÑ °ÍÀÌ´Ù.
¾Æ¹«Æ°, NAT Äڵ尡 Çϴ ù ¹øÂ° ÀÏÀº skbuffÀÇ nfct Çʵ带 ÂüÁ¶ÇÏ¿© connection tracking ÄÚµå·Î tupleÀ» ÃßÃâÇÒ ¼ö ÀÖ´Â Áö È®ÀÎÇϰí ÀÌ¹Ì Á¸ÀçÇÏ´Â connectionÀ» ã´Â °ÍÀÌ´Ù. À̰ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â ÇöÀç connectionÀÌ »õ·ÎÀÌ ½ÃµµµÈ °ÍÀÎÁö ¾Æ´ÑÁö, ±×¸®°í ¾î¶² ¹æÇâÀÎÁö¸¦ ¾Ë·Á ÁÖ´Â °ÍÀÌ´Ù. ¿©±â¼ ÈÄÀÚÀÎ °æ¿ì, ±×·¯´Ï±î ÀÌ¹Ì ¿¬°áÀÌ µÈ »óŶó¸é, ÀÌÀü¿¡ °áÁ¤µÈ 󸮹æ¹ýÀÌ Àû¿ëµÈ´Ù.
»õ·Î¿î connectionÀÌ ½ÃÀ۵Ǹé, Ç¥ÁØ iptable ÁøÇà ¸ÞÄ¿´ÏÁòÀ» ÀÌ¿ëÇÏ¿© tuple¿¡ ´ëÇÑ ·êÀ» `nat' table¿¡¼ °Ë»öÇÑ´Ù. ÀÌ ¶§ ·êÀÌ ÀÏÄ¡ÇÏ´Â °æ¿ì, º¸ÅëÀÇ °æ¿ì ÁøÇà¹æÇâ°ú ÀÀ´ä¹æÇâ ¸ðµÎ¿¡ ´ëÇÏ¿© 󸮸¦ ÃʱâÈÇÑ´Ù. Áï, ±â´ëÇϰí ÀÖ´Â ÀÀ´äÀÌ º¯°æµÇ¾î ¹ö·È´Ù´Â °ÍÀ» connection-tracking Äڵ尡 ¾Ë ¼ö ÀÖ°Ô µÈ´Ù. ±×¸®°í ³ª¼ ¾Õ¼ ¾ð±ÞÇÑ ¹Ù¿Í °°ÀÌ Ã³¸®µÈ´Ù.
¸¸ÀÏ Àû¿ëÇÒ ·êÀÌ ¾ø´Â °æ¿ì `null' ¹ÙÀεùÀÌ »ý¼ºµÈ´Ù. ÀÌ ¹ÙÀεùÀÌ ÆÐŶ°ú ¸ÊÇεÇÁö ¾ÊÁö¸¸, ±âÁ¸ÀÇ ´Ù¸¥ ½ºÆ®¸²°ú ¸ÊÇεÇÁö ¾Êµµ·Ï ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¾î¶² °æ¿ì´Â null ¹ÙÀεùÀÌ »ý¼ºµÉ ¼ö ¾ø´Â °æ¿ìµµ ¹ß»ýÇϸç ÀÌ °æ¿ì´Â null ¹ÙÀεùÀ» ±âÁ¸ÀÇ ½ºÆ®¸²À¸·Î ÀÌ¹Ì ¸ÊÇÎÀ» ÇØ¹ö·È±â ¶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ °æ¿ì´Â Á¤»óÀûÀÎ `null' ¹ÙÀεùÀ̶ó ÇÏ´õ¶óµµ per-protocolÀ¸·Î À̸¦ »õ·Î ¸ÊÇÎÇØ¾ß ÇÒ °ÍÀÌ´Ù.
NAT targetÀº 'nat' Å×ÀÌºí ³»¿¡¼¸¸ »ç¿ëÇÑ´Ù´Â °Í¸¸ Á¦¿ÜÇϸé, ¿©Å¸ÀÇ iptables target extension°ú »ó´çÈ÷ À¯»çÇÏ´Ù. SNAT¿Í DNAT ¸ðµÎ ºÎ°¡ µ¥ÀÌÅͷμ `struct ip_nat_multi_range'¸¦ ÃëÇϰí, ÀÌ µ¥ÀÌÅÍ´Â ¸ÊÇÎÀ¸·Î ¹ÙÀεù ÇÏ´Â ÁÖ¼ÒÀÇ ¹üÀ§¸¦ ¸í½ÃÇÏ°Ô µÈ´Ù. ¹üÀ§ ¿ä¼ÒÀÎ `struct ip_nat_range'´Â ÃÖ¼Ò/ÃÖ´ë IP¿Í ÃÖ´ë/ÃÖ¼Ò ÇÁ·ÎÅäÄÝ °ª(¿¹:TCP Æ÷Æ®)À¸·Î ±¸¼ºµÈ´Ù. Ç÷¢À» À§ÇÑ °ø°£µµ ÀÖÀ¸¸ç, ¾î¶² Ç÷¢Àº IPÁÖ¼Ò°¡ ¸ÊÆØµÉ ¼ö ÀÖ´Â Áö ¾ø´ÂÁö ¾Ë·ÁÁÖ°í, ¾î¶² °ÍÀº ¹üÀ§ÀÇ protocol-specific ºÎºÐÀÌ À¯È¿ÇÑÁö ¾Ë·ÁÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù.
´ÙÁß ¹üÀ§´Â `struct ip_nat_range'ÀÇ ¹è¿À̸ç, ¹üÀ§¸¦ ``1.1.1.1-1.1.1.2 ports 50-55 AND 1.1.1.3 port 80''°ú °°ÀÌ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
»õ·Î¿î ÇÁ·ÎÅäÄÝÀ» ±¸ÇöÇÑ´Ù´Â °ÍÀº tupleÀÇ Ã³¸®°¡´É ºÎºÐ°ú ±×·¸Áö ¸øÇÑ ºÎºÐÀ» °áÁ¤ÇÏ´Â °ÍÀÌ´Ù. tuple¿¡ Æ÷ÇÔµÈ ¸ðµç °ÍÀº ½ºÆ®¸²À» ±¸º°ÇÒ ¼ö Àִ Ư¼ºÀ» °¡Áö°í ÀÖ´Ù. tupleÀÇ Ã³¸®°¡´ÉºÎºÐÀº NAT¸¦ Àû¿ëÇÒ ¼ö ÀÖ´Â ºÎºÐÀ¸·Î TCPÀÎ °æ¿ì´Â ¼Ò½º Æ÷Æ®°¡ µÇ¸ç, ICMPÀÎ °æ¿ì´Â icmp ID°¡ µÈ´Ù. Áï, ½ºÆ®¸² ±¸º°ÀÚ·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ¸»ÀÌ´Ù. ó¸® ºÒ°¡´ÉÇÑ ºÎºÐÀº ÆÐŶÀÇ ³ª¸ÓÁö ºÎºÐÀ¸·Î ½ºÆ®¸²À» ±¸º°ÇÒ ¼ö ÀÖÁö¸¸, À̰ÍÀ» ¸¶À½´ë·Î ó¸®ÇÒ ¼ö ¾ø´Ù. (¿¹: TCP ¸ñÀûÁö Æ÷Æ®, ICMP ŸÀÔ)
ÇѰ¡Áö°¡ °áÁ¤µÇ¾úÀ¸¸é, connection tracking Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ°í, `ip_conntrack_register_protocol()'·Î Àü´ÞÇϱâ À§ÇÏ¿© `ip_conntrack_protocol' ±¸Á¶Ã¼¸¦ ´Ù·ç¾î¾ß ÇÒ °ÍÀÌ´Ù.
`struct ip_conntrack_protocol'ÀÇ Çʵå´Â ´ÙÀ½°ú °°´Ù.
{ NULL, NULL }·Î ¼³Á¤ÇÑ´Ù. ¸®½ºÆ®¸¦ È®º¸ÇÑ´Ù.
ÇÁ·ÎÅäÄÝ ¹øÈ£À̸ç ÀÚ¼¼ÇÑ °ÍÀº `/etc/protocols'¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.
»ç¿ëÀÚ°¡ º¸°Ô µÉ ÇÁ·ÎÅäÄÝ ¸íĪÀÌ´Ù. `/etc/protocols'¿¡ ÀÖ´Â ¸íĪÀ» »ç¿ëÇÏ´Â °ÍÀÌ Á¦ÀÏ ÁÁÀ» °ÍÀÌ´Ù.
ÁÖ¾îÁø ÆÐŶ¿¡ ´ëÇÑ tupleÀÇ ÇÁ·ÎÅäÄÝ »ó¼¼ºÎºÐÀ» ä¿ì´Â ÇÔ¼öÀÌ´Ù. `datah'¶ó´Â Æ÷ÀÎÅÍ´Â IP Çì´õÀÇ ½ÃÀۺκÐÀ» °¡¸®Å°¸ç, datalenÀº ÆÐŶÀ» ±æÀÌÀÌ´Ù. ÆÐŶÀÌ Çì´õ Á¤º¸¸¦ ÀúÀåÇϱ⿡ ÃæºÐÈ÷ ±æÁö ¾ÊÀ¸¸é, 0À» µ¹·ÁÁØ´Ù. datalenÀº ÃÖ¼Ò 8¹ÙÀÌÆ®ÀÌ´Ù.
tupleÀÇ ÇÁ·ÎÅäÄÝ »ó¼¼ºÎºÐÀ» ´Ü¼øÈ÷ ÆÐŶ¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î º¯°æÇÏ´Â µ¥ »ç¿ëÇÑ´Ù.
tupleÀÇ ÇÁ·ÎÅäÄÝ »ó¼¼ºÎºÐÀ» Ãâ·ÂÇÏ´Â µ¥ »ç¿ëÇÏ´Â ÇÔ¼ö·Î, sprintf() ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. »ç¿ëµÈ ¹öÅÍ Ä³¸¯ÅÍÀÇ ¼ö°¡ ¸®ÅϵȴÙ. /proc ¿£Æ®¸®¿¡ ´ëÇÑ »óŸ¦ Ãâ·ÂÇϱâ À§ÇØ »ç¿ëÇϱ⵵ ÇÑ´Ù.
conntrack ±¸Á¶Ã¼ÀÇ °ø°³µÇÁö ¾ÊÀº ºÎºÐÀ» Ãâ·ÂÇÏ´Â µ¥ »ç¿ëÇÏ´Â ÇÔ¼ö·Î, °£È¤ /proc¿¡ ÀÖ´Â »óŸ¦ Ãâ·ÂÇϱâ À§ÇØ »ç¿ëÇϱ⵵ ÇÑ´Ù.
established connectionÀÇ ÀϺθ¦ º¸°íÀÚ ÇÒ ¶§ È£ÃâÇÏ´Â ÇÔ¼öÀÌ´Ù. conntrack ±¸Á¶Ã¼, IP Çì´õ, ±æÀÌ ±×¸®°í ctinfo¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò°Ô µÈ´Ù. ÆÐŶ¿¡ ´ëÇÑ ÆÇ°á·Î Åë»ó NF_ACCEPT¸¦ µ¹·ÁÁÖ¸ç, connectionÀÌ À¯È¿ÇÏÁö ¾ÊÀº ÆÐŶ¿¡ ´ëÇØ¼´Â -1À» µ¹·ÁÁØ´Ù. ¿øÇÑ´Ù¸é ÀÌ ÇÔ¼ö ³»ºÎ¿¡¼ connectionÀ» Á¦°ÅÇÒ ¼öµµ ÀÖÁö¸¸, ·¹À̽º(race)¸¦ ¹æÁöÇϱâ À§Çؼ´Â ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» »ç¿ëÇØ¾ß¸¸ ÇÑ´Ù.
if (del_timer(&ct->timeout)) ct->timeout.function((unsigned long)ct); |
ÆÐŶÀÌ ÃÖÃÊ·Î ¿¬°áÀ» ¸ÎÀ» ¶§ È£ÃâµÇ´Â ÇÔ¼ö·Î, ctinfo ÀÎÀÚ´Â ¾ø´Ù. ±× ÀÌÀ¯´Â ÃÖÃÊÀÇ ÆÐŶÀº Á¤ÀÇ¿¡ ÀÇÇØ ctinfo IP_CT_NEWÀ̱⠶§¹®ÀÌ´Ù. ¿¬°áÀ» ¸Î´Âµ¥ ½ÇÆÐÇϸé 0À» µ¹·ÁÁÖ°í, ¼º°øÇÑ °æ¿ì´Â ¼ø°£ÀûÀ¸·Î connection timeoutÀ» µ¹·ÁÁØ´Ù.
Äڵ带 ÀÛ¼ºÇÏ°í »õ·Î¿î ÇÁ·ÎÅäÄÝ¿¡ ´ëÇÑ ÃßÀûÀ» Å×½ºÆ® ÇßÀ¸¸é, ÀÌÁ¦´Â NAT¿¡°Ô ÀÌ·¯ÇÑ °ÍÀ» ¾î¶»°Ô ÇØ¼®ÇÒ °ÍÀÎÁö¸¦ ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. ´Ù½Ã ¸»ÇÏ¸é »õ·Î¿î ¸ðµâÀ» ÀÛ¼ºÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. Áï, NAT Äڵ忡 ´ëÇÑ È®Àå ¹× `ip_nat_protocol_register()'·Î Àü´ÞÇϰíÀÚ ÇÏ´Â `ip_nat_protocol' ±¸Á¶Ã¼¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.
{ NULL, NULL }·Î ¼³Á¤ÇÑ´Ù. ¸®½ºÆ®¸¦ È®º¸ÇÑ´Ù.
»ç¿ëÀÚ°¡ º¸°Ô µÉ ÇÁ·ÎÅäÄÝ ¸íĪÀÌ´Ù. »ç¿ëÀÚ °ø°£¿¡ ÀÚµ¿À¸·Î ·Îµù µÇ±â À§Çؼ´Â `/etc/protocols'¿¡ ÀÖ´Â ¸íĪÀ» »ç¿ëÇÏ´Â °ÍÀÌ Á¦ÀÏ ÁÁ´Ù.
ÇÁ·ÎÅäÄÝ ¹øÈ£À̸ç ÀÚ¼¼ÇÑ °ÍÀº `/etc/protocols'¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.
connection trackingÀÇ pkt_to_tuple ÇÔ¼öÀÇ ´Ù¸¥ ¹ÝÂÊÀ¸·Î, ``tuple_to_pkt''¶ó°í »ý°¢Çصµ ¹«¹æÇÏ´Ù. ¾à°£ ´Ù¸£°Ô °í·ÁÇØ¾ß ÇÒ Á¡Àº ´ÙÀ½°ú °°´Ù. IP Çì´õÀÇ ½ÃÀÛÀ§Ä¡¿¡ ´ëÇÑ Æ÷ÀÎÅÍ¿Í Àüü ÆÐŶÀÇ ±æÀ̸¦ ¾ò´Â´Ù´Â Á¡À¸·Î, ÀϺΠÇÁ·ÎÅäÄÝ(UDP, TCP)ÀÌ IP Çì´õ¸¦ ¾Ë¾Æ¾ß ÇÒ Çʿ䰡 Àֱ⠶§¹®ÀÌ´Ù. ÆÐŶ Àüü°¡ ¾Æ´Ñ tuple(Áï, ``src'' Çʵå)·ÎºÎÅÍ ip_nat_tuple_manip Çʵå¿Í ¼öÇàÇϰíÀÚ Çϴ ó¸®¿¡ ´ëÇÑ Å¸ÀÔÀ» ¹Þ¾Æ¿À°Ô µÈ´Ù.
ÁÖ¾îÁø ÆÐŶÀÇ Ã³¸® °¡´ÉÇÑ ºÎºÐÀÌ ÁÖ¾îÁø ¹üÀ§¿¡ ¼ÓÇØÀÖ´Â Áö¸¦ ¾Ë·ÁÁÖ´Â ÇÔ¼öÀÌ´Ù. bit tricky ÇÔ¼ö·Î, tuple¿¡ Àû¿ëÇÒ Ã³¸® ŸÀÔ(manipulation type)À» µ¹·ÁÁÖ¸ç, ¹üÀ§¸¦ ¾î¶»°Ô ÇØ¼®ÇÒ °ÍÀÎ °¡, Áï ó¸®ÇϰíÀÚ ÇÏ´Â °ÍÀÌ ¼Ò½º ¹üÀ§ÀÎÁö ¸ñÀûÁö ¹üÀ§Àΰ¡ ÇÏ´Â °¡¸¦ ¾Ë·ÁÁØ´Ù.
±âÁ¸ÀÇ ¸ÊÇÎÀÌ ¿Ã¹Ù¸¥ ¹üÀ§¿¡ ¼ÓÇØ ÀÖ´Â Áö È®ÀÎÇÏ´Â µ¥ »ç¿ëµÇ¸ç, ¶ÇÇÑ ÀüÇô ó¸®ÇÒ Çʿ䰡 ¾ø´Â Áö È®ÀÎÇÏ´Â µ¥ »ç¿ëÇÑ´Ù.
NATÀÇ ÇÙ½ÉÀÌ µÇ´Â ÇÔ¼öÀÌ´Ù. tuple°ú ¹üÀ§°¡ ÁÖ¾îÁö¸é, tupleÀÇ per-protocol ºÎºÐÀ» ÀÌ ¹üÀ§¿¡ ¼ÓÇÏ´Â tuple·Î º¯°æÇϰí, ÀÌ °ÍÀ» À¯ÀÏÇϰÔ(unique) ¸¸µé¾î¹ö¸°´Ù. ÁÖ¾îÁø ¹üÀ§¿¡¼ »ç¿ëÇÏÁö ¾Ê´Â tupleÀ» ã¾Æ³»Áö ¸øÇÑ °æ¿ì 0À» ¸®ÅÏ ÇÑ´Ù. ¶ÇÇÑ ip_nat_used_tuple()¿¡ ÇÊ¿äÇÑ conntrack ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ¾ò¾î³½´Ù.
Åë»óÀÇ ¹æ¹ýÀº tuple¿¡ ´ëÇÏ¿© `ip_nat_used_tuple()'À» È®ÀÎÇÏ¸é¼ false°¡ ¸®ÅÏ µÉ ¶§±îÁö ¹üÀ§¿¡¼ tupleÀÇ per-protocol ºÎºÐÀ» ¹Ýº¹ÇÑ´Ù.
null-mappingÀÎ °æ¿ì´Â ÀÌ¹Ì È®ÀÎÀÌ µÈ °ÍÀ¸·Î, ÁÖ¾îÁø ¹üÀ§ ¹Û¿¡ Àְųª, ÀÌ¹Ì ÃëÇØÁø °æ¿ìÀÌ´Ù.
IP_NAT_RANGE_PROTO_SPECIFIED°¡ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é, »ç¿ëÀÚ°¡ NAPT°¡ ¾Æ´Ï¶ó NAT¸¦ ¼öÇàÇϰí ÀÖ´Â °ÍÀ» ÀǹÌÇÑ´Ù. Áï, ¹üÀ§ ³»¿¡¼ ¹«¾ùÀΰ¡¸¦ ÇÑ´Ù´Â °ÍÀÌ´Ù. ¸ÊÇÎÀÌ ÇÊ¿äÇÏÁö ¾Ê´Ù¸é, 0À» µ¹·ÁÁØ´Ù.
¹®ÀÚ¹öÆÛ¿Í ¹üÀ§°¡ ÁÖ¾îÁø °æ¿ì, ±× ¹üÀ§ÀÇ per-protocol ºÎºÐÀ» Ãâ·ÂÇϰí, »ç¿ëµÈ ¹öÆÛÀÇ ±æÀ̸¦ µ¹·ÁÁØ´Ù. IP_NAT_RANGE_PROTO_SPECIFIED Ç÷¢ÀÌ ÁÖ¾îÁø ¹üÀ§¿¡ ´ëÇØ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é È£ÃâµÇÁö ¾Ê´Â´Ù.
¸Å¿ì Èï¹Ì·Î¿î ºÎºÐÀ¸·Î, »õ·Î¿î ¸ÊÇΠŸÀÔÀ» Á¦°øÇÏ´Â »õ·Î¿î NAT targetÀ» ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ±âº» ÆÐŰÁö¿¡´Â Ãß°¡ targetÀº MASQUERADE¿Í REDIRECTÀ¸·Î »õ·Î¿î NAT targetÀ» ÀÛ¼ºÇϱ⿡ ÃæºÐÇϸ® ¸¸Å ½±°Ô ¼³¸íµÇ¾î ÀÖ´Ù.
À§ÀÇ µÎ targetÀº ´Ù¸¥ iptables targetó·³ ÀÛ¼ºµÇ¾î ÀÖÁö¸¸, ³»ºÎÀûÀ¸·Î´Â connectionÀ» ÃßÃâÇϰí `ip_nat_setup_info()'¸¦ È£ÃâÇÑ´Ù.
connection tracking¿¡ ´ëÇÑ protocol helper´Â connection code°¡ ´ÙÁß ³×Æ®¿÷ connectionÀ» »ç¿ëÇÏ´Â ÇÁ·ÎÅäÄÝÀ» ¾Ë¾ÆÂ÷¸®°í Ãʱ⠿¬°á¿¡ °ü·ÃµÈ `child' connectionÀ» Ç¥½ÃÇÒ ¼ö ÀÖµµ·Ï Çϸç, ÀϹÝÀûÀ¸·Î ÀÌ¿Í °°Àº °úÁ¤Àº data stream ¿ÜºÎÀÇ °ü·ÃµÈ ÁÖ¼Ò¸¦ ÀÐÀ½À¸·Î½á ¼öÇàµÈ´Ù.
NAT¿¡ ´ëÇÑ protocol helper´Â ´ÙÀ½°ú °°Àº µÎ °¡Áö ÀÛ¾÷À» ¼öÇàÇÑ´Ù. ù °·Î´Â NAT Äڵ尡 µ¥ÀÌÅÍ ½ºÆ®¸²À» Æ÷ÇÔÇÏ´Â ÁÖ¼Ò¸¦ º¯°æÇϵµ·Ï µ¥ÀÌÅÍ ½ºÆ®¸²À» ó¸®ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. µÎ ¹øÂ°·Î´Â µ¥ÀÌÅÍ ½ºÆ®¸²ÀÌ µé¾î¿Ã ¶§ ±×¿Í ¿¬°üµÈ connection¿¡ ´ëÇÏ¿© ¿ø·¡ÀÇ connectionÀ» ±âÃÊ·Î ÇÏ¿© NAT¸¦ ¼öÇàÇÑ´Ù.
connection tracking ¸ðµâÀÇ ÀÓ¹«´Â ¾î¶² ÆÐŶÀÌ ÀÌ¹Ì ÀÌ·ç¾îÁø connection¿¡ ¼ÓÇØ ÀÖ´Â Áö¸¦ ¸í½ÃÇÏ´Â °ÍÀ¸·Î, ´ÙÀ½°ú °°Àº ÀÏÀ» ÇÑ´Ù.
¿ì¸® ¸ðµâÀÌ ¾î¶² ÆÐŶ¿¡ °ü½ÉÀ» °¡Áö°í ÀÖ´Â °¡¸¦ netfilter¿¡°Ô ¾Ë·ÁÁØ´Ù.(´ëºÎºÐÀÇ helper´Â ƯÁ¤ÇÑ Æ÷Æ®¿¡ ´ëÇØ ÀÛ¾÷À» ÇÑ´Ù.)
netfilter¿¡ ÇÔ¼ö¸¦ µî·ÏÇÑ´Ù. ¾Õ¼ ¾ð±ÞÇÑ ¹üÁÖ¿¡ ¼ÓÇÏ´Â ¸ðµç ÆÐŶ¿¡ ´ëÇÏ¿© µî·ÏµÈ ÇÔ¼ö°¡ È£ÃâµÈ´Ù.
µî·ÏµÈ °÷À¸·ÎºÎÅÍ È£ÃâµÇ´Â `ip_conntrack_expect_related()' ÇÔ¼ö´Â netfilter¿¡°Ô ¿¬°üµÈ connectionÀ» ¿¹ÃøÇÒ ¼ö ÀÖµµ·Ï ¾Ë·ÁÁØ´Ù.
¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ Ä¿³Î ¸ðµâÀÇ init ÇÔ¼ö´Â `struct ip_conntrack_helper'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °¡Áö°í `ip_conntrack_helper_register()' ÇÔ¼ö¸¦ È£ÃâÇØ¾ß¸¸ ÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº Çʵ带 °¡Áö°í ÀÖ´Ù.
¸µÅ©µå ¸®½ºÆ®¿¡ ´ëÇÑ Çì´õ·Î, ³ÝÇÊÅͰ¡ ³»ºÎÀûÀ¸·Î ´Ù·ç´Â ¸®½ºÆ®ÀÌ´Ù. `{ NULL, NULL}'·Î ÃʱâȽÃŲ´Ù.
`struct ip_conntrack_tuple'·Î, ¿ì¸®°¡ ÀÛ¼ºÇÑ conntrack helper ¸ðµâÀÌ °ü½ÉÀ» °®´Â ÆÐŶÀ» ¸í½ÃÇÑ °ÍÀÌ´Ù.
¿ª½Ã `struct ip_conntrack_tuple'À̸ç, tupleÀÇ ¾î´À ºñÆ®°¡ À¯È¿ÇÑÁö¸¦ ¸í½ÃÇϰí ÀÖ´Â ¸Å½ºÅ©ÀÌ´Ù.
tuple+mask¿¡ ºÎÇÕÇÏ´Â °¢ ÆÐŶ¿¡ ´ëÇÏ¿© ³ÝÇÊÅͰ¡ È£ÃâÇØ¾ßÇÏ´Â ÇÔ¼öÀÌ´Ù.
#define FOO_PORT 111 static int foo_nat_expected(struct sk_buff **pksb, unsigned int hooknum, struct ip_conntrack *ct, struct ip_nat_info *info, struct ip_conntrack *master, struct ip_nat_info *masterinfo, unsigned int *verdict) /* called whenever a related packet (as specified in the connection tracking module) arrives params: pksb packet buffer hooknum HOOK the call comes from (POST_ROUTING, PRE_ROUTING) ct information about this (the related) connection info &ct->nat.info master information about the master connection masterinfo &master->nat.info verdict what to do with the packet if we return 1. { /* Check that this was from foo_expect, not ftp_expect, etc */ /* Then just change ip/port of the packet to the masqueraded values (read from master->tuplehash), to map it the same way, call ip_nat_setup_info, set *verdict, return 1. */ } static int foo_help(struct ip_conntrack *ct, struct ip_nat_info *info, enum ip_conntrack_info ctinfo, unsigned int hooknum, struct sk_buff **pksb) /* called for the packet causing related packets params: ct information about tracked connection info (STATE: related, new, established, ... ) hooknum HOOK the call comes from (POST_ROUTING, PRE_ROUTING) pksb packet buffer */ { /* extract information about future related packets (you can share information with the connection tracking's foo_help). Exchange address/port with masqueraded values, insert tuple about related packets */ } static struct ip_nat_expect foo_expect = { { NULL, NULL }, foo_nat_expected }; static struct ip_nat_helper hlpr; static int __init(void) { int ret; if ((ret = ip_nat_expect_register(&foo_expect)) == 0) { memset(&hlpr, 0, sizeof(struct ip_nat_helper)); hlpr.list = { NULL, NULL }; hlpr.tuple.dst.protonum = IPPROTO_TCP; hlpr.tuple.dst.u.tcp.port = htons(FOO_PORT); hlpr.mask.dst.protonum = 0xFFFF; hlpr.mask.dst.u.tcp.port = 0xFFFF; hlpr.help = foo_help; ret = ip_nat_helper_register(hlpr); if (ret != 0) ip_nat_expect_unregister(&foo_expect); } return ret; } static void __exit(void) { ip_nat_expect_unregister(&foo_expect); ip_nat_helper_unregister(&hlpr); } |
NAT helper ¸ðµâÀº ƯÁ¤ ÀÀ¿ëÇÁ·Î±×·¥¿¡ ÀûÇÕÇÑ NAT Çڵ鸵À» ¼öÇàÇÑ´Ù. ÀÌ ÇÔ¼ö´Â µ¥ÀÌÅÍ¿¡ ´ëÇÑ on-the-fly 󸮸¦ Æ÷ÇÔÇϰí ÀÖ´Ù. FTPÀÇ Æ÷Æ® ¸í·ÉÀ» °í·ÁÇØº¸ÀÚ. ÀÌ ¶§, Ŭ¶óÀÌ¾ðÆ®´Â ¼¹ö¿¡°Ô ¾î¶² IP¿Í Æ÷Æ®·Î ¿¬°áÀ» ÇØ¾ß ÇÏ´Â °¡¸¦ ¹°¾îº¸°Ô µÇ°í, FTP Á¦¾î ¿¬°á¿¡¼ PORT ¸í·ÉÀÌ ¼öÇàµÈ ÈÄ FTP helper ¸ðµâÀº IP/port¸¦ ±³Ã¼ÇÑ´Ù.
TCP¸¦ ´Ù·ç´Â °æ¿ì´Â »ç¹µ º¹ÀâÇØÁø´Ù. ÀÌÀ¯´Â ÆÐŶ Å©±â°¡ º¯Çϱ⠶§¹®ÀÌ´Ù. FTPÀÇ ¿¹¸¦ ´Ù½Ã µé¾îº¸¸é, PORT ¸í·ÉÀÌ ¼öÇàµÈ ÈÄ IP/port tupleÀ» ³ªÅ¸³»´Â ½ºÆ®¸µÀÇ ±æÀ̰¡ º¯ÇÒ °ÍÀÌ´Ù. °á±¹ ÆÐŶ Å©±â°¡ º¯°æµÇ¸é, NAT ¹Ú½ºÀÇ ÁÂÃø°ú ¿ìÃø°£¿¡ syn/ackÀÇ Â÷À̰¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. ¿¹¸¦ µé¾îº¸¸é, ÆÐŶÀ» 4 octet¸¸Å È®ÀåÇß´Ù¸é, ÀÌÈÄ °è¼ÓµÇ´Â ÆÐŶÀÇ TCP sequence number¿¡ ¾Õ¼ È®Àå½ÃŲ ¸¸ÅÀÇ offset¸¦ ´õÇØ¾ß¸¸ ÇÑ´Ù.
¿¬°üµÈ ¸ðµç ÆÐŶ¿¡ ´ëÇÏ¿© Ưº°ÇÑ NAT 󸮰¡ ÇÊ¿äÇÑ °æ¿ìµµ ÀÖ´Ù. ´Ù½Ã±Ý FTP¸¦ ¿¹·Î µé¾îº¸ÀÚ. control connectionÀÇ PORT¸í·ÉÀ» ¼öÇàÇϴ Ŭ¶óÀÌ¾ðÆ®¿¡ ÀÇÇØ ¾ò¾îÁø IP/port¿¡ ´ëÇØ DATA connectionÀÇ ¸ðµç ÀÔ·Â ÆÐŶÀº Á¤»óÀûÀÎ table lookupÀ» °ÅÄ¡´Â °Íº¸´Ù´Â ¹Ýµå½Ã NATµÇ¾î¾ß¸¸ ÇÑ´Ù.
¿¬°üµÈ connectionÀ» À¯¹ßÇÏ´Â ÆÐŶ¿¡ ´ëÇÑ callback(foo_help)
¿¬°üµÈ ¸ðµç ÆÐŶ¿¡ ´ëÇÑ callback(foo_nat_expected)
¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ nat helper ¸ðµâÀÇ `init()' ÇÔ¼ö´Â `struct ip_nat_helper'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ÇÏ¿© `ip_nat_helper_register()' ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ÀÎÀÚ°¡ µÇ´Â ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº ¸â¹ö º¯¼ö¸¦ Æ÷ÇÔÇÑ´Ù.
netfilter¿¡¼ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ´Â list Çì´õ·Î { NULL, NULL }·Î ÃʱâȽÃŲ´Ù.
`struct ip_conntrack_tuple'·Î, ¿ì¸®°¡ ÀÛ¼ºÇÑ NAT helper°¡ °ü½ÉÀ» °®´Â ÆÐŶÀ» ¸í½ÃÇÑ °ÍÀÌ´Ù.
`struct ip_conntrack_tuple'À̸ç, tupleÀÇ ¾î´À ºñÆ®°¡ À¯È¿ÇÑÁö¸¦ netfilter¿¡°Ô ¾Ë·ÁÁØ´Ù.
tuple+mask¿¡ ºÎÇÕÇÏ´Â °¢ ÆÐŶ¿¡ ´ëÇÏ¿© È£ÃâÇØ¾ßÇÏ´Â ÇÔ¼öÀÌ´Ù.
NAT help·Î ±¸º°ÀÌ µÇ´Â À¯ÀÏÇÑ name
ÀÌ»óÀº connection tracking helper¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ý°ú ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. ÀÌÁ¦ ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ ¸ðµâÀº `ip_nat_register()' ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¿¹ÃøµÇ´Â ÀÓÀÇÀÇ connectionÀÇ NAT¸¦ ó¸®ÇÒ Áغñ°¡ µÇ¾î ÀÖ´Ù°í ¸»ÇÒ ¼ö ÀÖ´Ù. À̶§, `ip_nat_register()' ÇÔ¼ö´Â `struct ip_nat_expect'¸¦ ÀÎÀÚ·Î ÃëÇÏ°Ô µÇ¸ç, ±× ¸â¹ö º¯¼ö´Â ´ÙÀ½°ú °°´Ù.
netfilter¿¡¼ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ´Â list Çì´õ·Î { NULL, NULL }·Î ÃʱâȽÃŲ´Ù.
¿¹°ßµÈ connection¿¡ ´ëÇÏ¿© NAT¸¦ ¼öÇàÇÏ´Â ÇÔ¼öÀÌ´Ù. connectionÀ» ó¸®Çϸé true¸¦ ¸®ÅÏÇϰí, ´ÙÀ½¿¡ µî·ÏµÈ expect ÇÔ¼ö°¡ È£ÃâµÇ¾î ÆÐŶÀ» ó¸®ÇÒ ¼ö ÀÖ´Â Áö °Ë»çÇÏ°Ô µÈ´Ù. true°¡ ¸®ÅÏµÈ °æ¿ì, ÀÌ ÇÔ¼ö´Â ¹Ýµå½Ã ÆÇ°á(verdict)À» ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù.
#define FOO_PORT 111 static int foo_nat_expected(struct sk_buff **pksb, unsigned int hooknum, struct ip_conntrack *ct, struct ip_nat_info *info, struct ip_conntrack *master, struct ip_nat_info *masterinfo, unsigned int *verdict) /* called whenever a related packet (as specified in the connection tracking module) arrives params: pksb packet buffer hooknum HOOK the call comes from (POST_ROUTING, PRE_ROUTING) ct information about this (the related) connection info &ct->nat.info master information about the master connection masterinfo &master->nat.info verdict what to do with the packet if we return 1. { /* Check that this was from foo_expect, not ftp_expect, etc */ /* Then just change ip/port of the packet to the masqueraded values (read from master->tuplehash), to map it the same way, call ip_nat_setup_info, set *verdict, return 1. */ } static int foo_help(struct ip_conntrack *ct, struct ip_nat_info *info, enum ip_conntrack_info ctinfo, unsigned int hooknum, struct sk_buff **pksb) /* called for the packet causing related packets params: ct information about tracked connection info (STATE: related, new, established, ... ) hooknum HOOK the call comes from (POST_ROUTING, PRE_ROUTING) pksb packet buffer */ { /* extract information about future related packets (you can share information with the connection tracking's foo_help). Exchange address/port with masqueraded values, insert tuple about related packets */ } static struct ip_nat_expect foo_expect = { { NULL, NULL }, foo_nat_expected }; static struct ip_nat_helper hlpr; static int __init(void) { int ret; if ((ret = ip_nat_expect_register(&foo_expect)) == 0) { memset(&hlpr, 0, sizeof(struct ip_nat_helper)); hlpr.list = { NULL, NULL }; hlpr.tuple.dst.protonum = IPPROTO_TCP; hlpr.tuple.dst.u.tcp.port = htons(FOO_PORT); hlpr.mask.dst.protonum = 0xFFFF; hlpr.mask.dst.u.tcp.port = 0xFFFF; hlpr.help = foo_help; ret = ip_nat_helper_register(hlpr); if (ret != 0) ip_nat_expect_unregister(&foo_expect); } return ret; } static void __exit(void) { ip_nat_expect_unregister(&foo_expect); ip_nat_helper_unregister(&hlpr); } |
Netfiler´Â »ó´çÈ÷ ´Ü¼øÇϸç, ¾Õ Àý¿¡¼ ²Ï »ó¼¼È÷ ¼³¸íÇÏ¿´´Ù. ±×·¯³ª, °£È¤ NAT³ª ip_tables ÇϺΠ±¸Á¶°¡ Á¦°øÇÏ´Â °Í ÀÌ¿ÜÀÇ °Í ¶Ç´Â ¿©·¯ºÐµéÀÌ ÀüºÎ ¹Ù²Ù°í ½ÍÀº °Í¿¡ ´ëÇÏ¿© ¾Ë¾Æº¼ Çʿ䰡 ÀÖ´Ù.
¹Ì·¡ÀÇ À̾߱Ⱑ µÇ°ÚÁö¸¸, netfilter°¡ ÁöÇâÇϰí ÀÖ´Â Áß¿äÇÑ ÀïÁ¡ Áß Çϳª´Â ij½³ÀÌ´Ù. °¢°¢ÀÇ skb´Â `nfcache' Çʵ带 °¡Áö°í ÀÖÀ¸¸ç, ÀÌ´Â Çì´õÀÇ ¾î¶² Çʵ带 °Ë»çÇÏ°í ÆÐŶÀ» º¯°æÇÒ °ÍÀÎÁö ¸» °ÍÀÎÁö¿¡ ´ëÇÑ ºñÆ® ¸Å½ºÅ©ÀÌ´Ù. °¢°¢ÀÇ ÈÅÀÌ ±×¿Í ¿¬°üµÈ ºñÆ®¿¡ ´ëÇÑ netfilterÀÇ OR¸¦ 0À¸·Î ¸¸µå´Â °ÍÀÌ ¾ÆÀ̵ð¾î·Î, ÀÌ·¸°Ô ÇÔÀ¸·Î½á ÆÐŶÀÌ netfilter¸¦ °ÅÃÄ¾ß ÇÒ ÀÌÀ¯°¡ ÀüÇô ¾ø´Ù´Â °ÍÀ» ¾Ë¾ÆÂ÷¸± ¼ö ÀÖ´Â ¾ÆÁÖ ÈǸ¢ÇÑ Ä³½¬ ½Ã½ºÅÛÀ» ÇâÈÄ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
°¡Àå Áß¿äÇÑ ºñÆ®´Â NFC_ALTERD¿Í NFC_UNKNOWNÀ¸·Î, NFC_ALTERED´Â ÆÐŶÀÌ º¯°æµÇ¾ú´Ù´Â °ÍÀ» ÀǹÌÇϸç ÀÌ ºñÆ®´Â º¯°æµÈ ÆÐŶÀ» ´Ù½Ã ¶ó¿ìÆÃÇϱâ À§ÇØ IPv4ÀÇ NF_IP_LOCAL_OUT ÈÅ¿¡ ´ëÇÏ¿© ÀÌ¹Ì Àû¿ëµÇ¾ú´Ù. NFC_UNKNOWNÀº, Ç¥ÇöÇÒ ¼ö ¾ø´Â ¾î¶² Ư¼ºÀÌ °ËÃâµÇ¾î ij½³ÀÌ ¼öÇàµÇÁö ¾Ê¾Ò´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¸¸ÀÏ ÀǽÉÀÌ °¡´Â °æ¿ì°¡ ¹ß»ýÇϸé, ¿©·¯ºÐÀÇ ÈÅ ³»ºÎ¿¡ ÀÖ´Â skbÀÇ nfcache Çʵ忡 ´ëÇØ NFC_UNKNOWN Ç÷¢À» ¼³Á¤Çϱ⸸ ÇÏ¸é µÈ´Ù.
Ä¿³Î ³»ºÎ¿¡¼ ÆÐŶÀ» ÁÙÀ̰ųª Á¶°¢³»±â À§Çؼ´Â `nf_register_hook' ÇÔ¼ö¿Í `nf_unregister_hook' ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ÀÌµé °¢°¢Àº ´ÙÀ½°ú °°Àº Çʵ带 Æ÷ÇÔÇÏ´Â `struct nf_hook_ops'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ÃëÇÑ´Ù.
¸µÅ©µå ¸®½ºÆ®·Î `{ NULL, NULL }'·Î ¼³Á¤µÈ´Ù.
ÆÐŶÀÌ ÀÌ ÈÅ Æ÷ÀÎÆ®¿¡ °É¸®¸é È£ÃâµÇ´Â ÇÔ¼ö·Î, NF_ACCEPT, NF_DROP ¶Ç´Â NF_QUEUE Áß Çϳª¸¦ ¹Ýµå½Ã ¸®ÅÏ ÇØ¾ß ÇÑ´Ù. NF_ACCEPTÀÎ °æ¿ì´Â ÇöÀçÀÇ Æ÷ÀÎÅÍ ´ÙÀ½¿¡ ¿À´Â ÈÅÀÌ È£ÃâµÈ´Ù. NF_DROPÀÎ °æ¿ì´Â ÆÐŶÀÌ DROPµÇ°í, NF_QUEUEÀÎ °æ¿ì´Â ´ë±â¿·Î µé¾î °£´Ù. skb Æ÷ÀÎÅÍ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µ¹·Á ¹Þ¾Æ¼ ¿øÇÏ´Â °æ¿ì¿¡´Â skb¸¦ ÀüºÎ ¹Ù²Ù¾î ¹ö¸± ¼öµµ ÀÖ´Ù.
ÇöÀç´Â »ç¿ëÇÏÁö ¾Ê°í ÀÖ´Ù. ij½¬°¡ Áö¿öÁö´Â °æ¿ì ÆÐŶ ÀûÁß·üÀ» Àü´ÞÇϱâ À§ÇØ ¼³°èµÇ¾úÀ¸³ª, ÀüÇô ±¸ÇöµÉ ÀÏÀÌ ¾øÀ» °ÍÀÌ´Ù. ±×³É NULL·Î ¼³Á¤Çϱ⠹ٶõ´Ù.
ÇÁ·ÎÅäÄÝ ÆÐ¹Ð¸®, Áï IPv4¿¡ ´ëÇØ¼´Â `PF_INET'ÀÌ µÈ´Ù.
°ü½ÉÀ» °¡Áö°í ÀÖ´Â ÈÅÀÇ ¼ö, Áï `NF_IP_LOCAL_OUT'ÀÌ´Ù.
ip_queue¿¡ ÀÇÇØ »ç¿ëµÇ´Â ÀÎÅÍÆäÀ̽º·Î, ÁÖ¾îÁø ÇÁ·ÎÅäÄÝ¿¡ ´ëÇÏ¿© ´ë±âµÈ ÆÐŶÀ» ó¸®Çϱâ À§ÇØ µî·ÏÇÒ ¼ö ÀÖ´Ù. ÆÐŶÀ» ó¸®ÇÏ´Â °ÍÀ» ¹æÁöÇÒ ¼ö ÀÖ´Ù´Â °Í¸¸ »©°í´Â ÈÅÀ» µî·ÏÇÏ´Â °Í°ú À¯»çÇÑ Àǹ̸¦ °¡Áö¸ç, ÈÅÀÌ `NF_QUEUE'·Î ÀÀ´äÇÏ´Â ÆÐŶÀ» È®Àθ¸ ÇÒ ¼ö ÀÖ´Ù.
´ë±âµÈ ÆÐŶ¿¡ ´ëÇÑ °ü½ÉÀ» µî·ÏÇϱâ À§ÇØ »ç¿ëÇÏ´Â µÎ°³ÀÇ ÇÔ¼ö´Â `nf_register_queue_handle()'°ú `nf_unregister_queue_handler()'ÀÌ´Ù. ¿©·¯ºÐÀÌ µî·ÏÇϰíÀÚ ÇÏ´Â ÇÔ¼ö´Â `nf_register_queue_handler()' ÇÔ¼ö·Î Àü´ÞµÇ´Â `void *' Æ÷ÀÎÅÍ¿Í ÇÔ²² È£ÃâµÈ´Ù.
ÇÁ·ÎÅäÄÝÀ» ó¸®Çϱâ À§ÇØ µî·ÏµÈ ÇÔ¼ö°¡ ¾ø´Â °æ¿ì´Â, NF_QUEUE¸¦ ¸®ÅÏ ÇÏ´Â °ÍÀº NF_DROP¸¦ ¸®ÅÏÇÏ´Â °Í°ú ¸¶Âù°¡Áö°¡ µÈ´Ù.
´ë±âµÈ ÆÐŶ¿¡ ´ëÇÑ °ü½ÉÀ» µî·ÏÇßÀ¸¸é, ÆÐŶÀÌ Å¥À× µÇ±â ½ÃÀÛÇÑ´Ù. ÀÌÁ¦ Å¥À× µÈ ÆÐŶÀ» °¡Áö°í ¹«¾ùÀ» ÇÏ´ø ±×°Ç ¿©·¯ºÐµéÀÇ ¸¾ÀÌÁö¸¸, 󸮰¡ ³¡³ °æ¿ì¿¡´Â ¹Ýµå½Ã `nf_reject()' ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù(´Ü¼øÈ÷ kfree_skb()¸¦ È£ÃâÇØ¼´Â ¾È µÈ´Ù). skb¸¦ Àç µµÀÔÇÏ´Â °æ¿ì´Â, Å¥À× µÈ ÆÐŶÀ» skb, Å¥À× µÈ ÆÐŶ¿¡ ÇÒ´çµÈ `struct nf_info'¿Í ÆÇ°á(verdict)À» Àü´ÞÇÑ´Ù. ±× ÀÌÀ¯´Â, NF_DROPÀº ÆÐŶÀ» DROP½Ãų °ÍÀ̰í, NF_ACCEPT´Â ÈÅÀ» ÅëÇØ °è¼Ó ¹Ýº¹µÇµµ·Ï ÇÒ °ÍÀ̰í, NF_QUEUE´Â ÆÐŶÀ» ´Ù½Ã ´ë±â ½Ãų °ÍÀ̰í NF_REPEAT´Â ÆÐŶÀ» ´ë±â½ÃŲ ÈÅÀÌ ¶Ç ´Ù½Ã °Ë»çÇϵµ·Ï ¸¸µé °ÍÀ̱⠶§¹®ÀÌ´Ù(ÀÌ ¶§, ¹«ÇÑ·çÇÁ¿¡ ºüÁöÁö ¾Êµµ·Ï Á¶½ÉÇÒ °Í).
`struct nf_info'¸¦ »ìÆìº¸¸é, ÆÐŶ¿¡ ´ëÇÑ ºÎ°¡ÀûÀÎ Á¤º¸, Áï ÆÐŶÀÌ Á¸ÀçÇß´ø ÀÎÅÍÆäÀ̽º¿Í ÈÅ °°Àº °ÍÀ» ¾òÀ» ¼ö ÀÖ´Ù.
NetfilterÀÇ ±¸¼º¿ä¼ÒµéÀÌ »ç¿ëÀÚ°ø°£°ú »óÈ£ÀÛ¿ëÀ» ÇÊ¿ä·Î ÇÑ´Ù´Â °ÍÀº ¾ÆÁÖ ´ç¿¬ÇÑ ÀÏÀÌ´Ù. ¹æ¹ýÀº setsockopt ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇÏ¿© ÀÌ·± ÀÛ¿ëÀ» ±¸ÇöÇÒ ¼ö ÀÖ´Ù. ¿©±â¼ ÁÖÀÇÇÒ Á¡Àº °¢ ÇÁ·ÎÅäÄÝÀÌ ÀÌÇØÇÏÁö ¸øÇÏ´Â setsockopt ³Ñ¹ö¿¡ ´ëÇØ Nf_setsockop()¸¦ È£ÃâÇÒ ¼ö ÀÖµµ·Ï °¢ ÇÁ·ÎÅäÄÝÀÌ ¼öÁ¤µÇ¾î¾ß¸¸Çϸç, ÀÌ´Â IPv4±îÁö À̰í, IPv6¿Í DECnetÀº ÀÌ¹Ì º¯°æµÇ¾î ÀÖ´Ù.
ÃÖ±Ù¿¡ ¾Ë·ÁÁø ±â¼úÀ» »ç¿ëÇϸé, nf_register_sockopt() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© `struct nf_sockopt_ops'¸¦ µî·ÏÇϸç, ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº Çʵå·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
¸µÅ©µå ¸®½ºÆ®¸¦ »ç¿ëÇϱâ À§ÇÑ °ÍÀ¸·Î, `{ NULL, NULL }'·Î ¼³Á¤µÈ´Ù.
ó¸®ÇØ¾ß ÇÒ getsockoptÀÇ °³¼öÀÇ ¹üÀ§¸¦ ÁöÁ¤ÇÑ´Ù. Áï 0°ú 0À» »ç¿ëÇϸé ó¸®ÇØ¾ß ÇÒ getsockoptÀÇ °³¼ö°¡ ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
»ç¿ëÀÚµéÀÌ ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ getsockopt Áß Çϳª¸¦ È£ÃâÇÑ °æ¿ì È£ÃâµÇ´Â ÇÔ¼öÀÌ´Ù. ÀÌ ÇÔ¼ö ³»ºÎ¿¡¼ »ç¿ëÀÚµéÀÌ NET_ADMINÀÇ ±ÇÇÑÀ» °¡Áö°í ÀÖ´Â Áö È®ÀÎÇØ¾ß ÇÑ´Ù.
³ª¸ÓÁö µÎ°³ÀÇ Çʵå´Â ³»ºÎÀûÀ¸·Î »ç¿ëµÈ´Ù.
libipq ¶óÀ̺귯¸®¿Í `ip_queue' ¸ðµâÀ» »ç¿ëÇϸé, Ä¿³Î¿¡¼ ÇÒ ¼ö ÀÖ´Â ´ëºÎºÐÀÇ °ÍµéÀ» »ç¿ëÀÚ °ø°£¿¡¼ ¼öÇàÇÒ ¼ö ÀÖ´Ù. À̰ÍÀÌ ´ÙÀ½°ú °°Àº °ÍÀ» ÀǹÌÇÑ´Ù. ¼Óµµ¿¡ ´ëÇÑ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù¸é, »ç¿ëÀÚ °ø°£¿¡¼ ¿ÏÀüÈ÷ ¿©·¯ºÐµé¸¸ÀÇ Äڵ带 °³¹ßÇÒ ¼ö ÀÖ´Ù. °³¹ßÇϰíÀÚ ÇÏ´Â ¿©·¯ºÐµéÀÌ Å« ´ë¿ªÀ» ÇÊÅ͸µ ÇϰíÀÚ ÇÏÁö¸¸ ¾Ê´Â´Ù¸é, Ä¿³Î ³»ºÎÀÇ ÆÐŶ ¸Í±Û¸µ¿¡ ºñÇØ ÀÌ ¹æ¹ýÀÌ ¿ùµîÇÏ´Ù´Â °ÍÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù.
netfilter ÃÊâ±â¿¡, ÇÊÀÚ´Â iptablesÀÇ Ãʱ⠹öÀüÀ» Æ÷ÆÃ ÇÏ¿© À̸¦ Áõ¸íÇÏ¿´´Ù. netfilter´Â, °³¹ßÀÚµéÀÌ ¿øÇÏ´Â ¾ð¾î°¡ ¹«¾ùÀÌ´ø °£¿¡, °³¹ßÀÚ ÀÚ½ÅÀÇ ÄÚµå¿Í °íÈ¿À²ÀÇ ³Ý¸Í±Û¸µ ¸ðµâÀ» °³¹ßÇϰíÀÚ ÇÏ´Â »ç¶÷µé¿¡°Ô ¿ÀÇ µÇ¾î ÀÖ´Ù.