· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Docbook Sgml/Netfilter-hacking-TRANS

You are not allowed to 'fullsearch'


Linux netfilter Hacking HOWTO

Linux netfilter Hacking HOWTO

Rusty Russell

ÐÝí­æÚÞÈ

º» ¹®¼­¿¡¼­´Â, ¸ÕÀú ¸®´ª½º¿¡ ´ëÇÑ ³ÝÇÊÅÍ ¾ÆÅ°ÅØó¿Í À̸¦ ÆÄÇìÄ¡´Â ¹æ¹ý, ±×¸®°í ³ÝÇÊÅÍÀÇ ÃÖ»óÀ§¿¡ Á¸ÀçÇÏ´Â ÀϺΠÁß¿äÇÑ ½Ã½ºÅÛ, Áï ÆÐŶ ÇÊÅ͸µ, Ä¿³Ø¼Ç Æ®·¢Å· ±×¸®°í NAT(Network Address Translation)µî¿¡ ´ëÇÏ¿© ±â¼úÇÏ°íÀÚ ÇÑ´Ù.

고친 과정
고침 0.22001-02-1고친이 kenji
¹®ÀåÀ» º¸´Ù ¸Å²ô·´°Ô ¼öÁ¤ÇÏ¿´½À´Ï´Ù.
고침 0.12001-01-20고친이 kenji
ÃÖÃÊ ¹ø¿ª

1. ¼­¹®

º» ¹®¼­´Â ¿©Çà°úµµ °°À¸¸ç, ÀϺκÐÀº ¾ÆÁÖ ½±°Ô ¿©ÇàÇÒ ¼ö ÀÖ°í ¶Ç ´Ù¸¥ ºÎºÐ¿¡¼­´Â µ¶ÀÚ ¿©·¯ºÐ ½º½º·Î ±æÀ» ã¾Æ¾ß ÇÒ °ÍÀÌ´Ù. ÇÊÀÚ°¡ µ¶ÀÚ¿¡°Ô ÇÒ ¼ö ÀÖ´Â ÃÖ»óÀÇ Ãæ°í´Â ¾ÆÁÖ Å« ¸Ó±×ÀÜ¿¡ Ä¿Çdzª ÇÖÃÝÄݸ´À» °¡µæ ´ã¾Æ Æí¾ÈÇÑ ÀÇÀÚ¿¡ ¾É¾Æ À§Ç轺·± ±æÀ» °¡±â Àü¿¡ º»¹®ÀÇ ³»¿ëÀ» ³ÝÆ®¿÷ ÇØÅ·À̶ó´Â ¾ÆÁÖ À§Ç轺·¯¿î ¼¼»ó¿¡ ºÎÇÕ½ÃÄÑ ±íÀÌ »ý°¢ÇØ º¸¶ó´Â °Í ¹Û¿¡ ¾ø´Ù.

³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷ÀÇ ÃÖ»óÀ§¿¡ ÀÖ´Â ³»ºÎ±¸Á¶ÀÇ »ç¿ë¹ýÀ» º¸´Ù Àß ÀÌÇØÇϱâ À§Çؼ­´Â, Packet Filtering HOWTO¿Í NAT HOWTO¸¦ Àо´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. Ä¿³Î ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò°íÀÚ ÇÑ´Ù¸é Rusty's Unreliable Guide to Kernel Hacking°ú Rusty's Unreliable Guide to Kernel LockingÀ» Âü°íÇϱ⠹ٶõ´Ù.

(C) 2000 Paul `Rusty' Russell. Licensed under the GNU GPL.


1.1. ³ÝÇÊÅÍ(netfilter)¶õ ¹«¾ùÀΰ¡?

³ÝÇÊÅʹ ǥÁØ Berkeley socket interfaceÀÇ ¿ÜºÎ¿¡ Á¸ÀçÇÏ´Â packet mangling(ÆÐŶÀ» Å丷³»´Â ÀÏ)¿¡ ´ëÇÑ ÇÁ·¹ÀÓ¿÷À¸·Î, Å©°Ô ³× ºÎºÐÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ¸ÕÀú °¢°¢ÀÇ ÇÁ·ÎÅäÄÝÀº "hooks"¶ó´Â °ÍÀ» Á¤ÀÇÇϸç, ÀÌ´Â ÆÐŶ ÇÁ·ÎÅäÄÝ ½ºÅÃÀÇ packet's traversal¿¡ ÀÖ´Â Àß Á¤ÀÇµÈ Æ÷ÀÎÅ͸¦ ÀǹÌÇÑ´Ù. ÀÌ·¯ÇÑ Æ÷ÀÎÅÍ¿¡¼­, °¢°¢ÀÇ ÇÁ·ÎÅäÄÝÀº ÆÐŶ°ú Èųѹö(hook number)¸¦ ÀÌ¿ëÇÏ¿© ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷À» È£ÃâÇÏ°Ô µÈ´Ù.

µÎ ¹ø°·Î, Ä¿³ÎÀÇ ÀϺκÐÀº °¢ ÇÁ·ÎÅäÄÝ¿¡ ´ëÇÏ¿© ´Ù¸¥ hookÀ» °¨½ÃÇϵµ·Ï µî·ÏÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ ÆÐŶÀÌ ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷À» Åë°úÇÒ ¶§, ´©°¡ ±× ÇÁ·ÎÅäÄÝ°ú ÈÅÀ» µî·ÏÇß´ÂÁö È®ÀÎÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ °ÍÀÌ µî·ÏµÇ¾î ÀÖ´Ù¸é, µî·ÏµÈ ¼ø¼­´ë·Î ÆÐŶÀ» °Ë»çÇÏ°í, ÆÐŶÀ» ¹«½ÃÇϰųª(NF_DROP), Åë°ú½ÃÅ°°í(NF_ACCEPT), ¶Ç´Â ÆÐŶ¿¡ ´ëÇÑ °ÍÀ» Àؾî¹ö¸®µµ·Ï ³ÝÇÊÅÍ¿¡°Ô Áö½ÃÇϰųª(NF_STOLEN), »ç¿ëÀÚ °ø°£¿¡ ÆÐŶÀ» ´ë±â½ÃÅ°µµ·Ï(queuing) ³ÝÇÊÅÍ¿¡°Ô ¿äûÇÑ´Ù(NF_QUEUE).

¼¼ ¹ø° ºÎºÐÀº ´ë±âµÈ ÆÐŶÀ» »ç¿ëÀÚ °ø°£À¸·Î º¸³»±â À§ÇØ Á¦¾îÇÏ´Â °ÍÀ¸·Î ÀÌ·¯ÇÑ ÆÐŶÀº ºñµ¿±â¹æ½ÄÀ¸·Î 󸮵ȴÙ.

¸¶Áö¸· ºÎºÐÀº ÄÚµå¿Í ¹®¼­¿¡ ±â·ÏµÈ ÁÖ¼®¹®À¸·Î ±¸¼ºµÇ¾î ÀÖÀ¸¸ç, ÀÌ´Â ¾î¶°ÇÑ ½ÇÇèÀû ÇÁ·ÎÁ§Æ®¿¡ ´ëÇؼ­µµ µµ¿òÀÌ µÇ´Â ºÎºÐÀÌ´Ù. ³Ý ÇÊÅÍÀÇ ¸ðÅä´Â ´ÙÀ½°ú °°´Ù.

				``±×·¡¼­... KDEº¸´Ù ¾ó¸¸Å­ ÁÁ´Ù´Â °ÅÁÒ?''
			

ÀÌ·¯ÇÑ Àú¼öÁØ ÇÁ·¹ÀÓ¿÷°ú ´õºÒ¾î, ´Ù¾çÇÑ ¸ðµâÀÌ ÀÛ¼ºµÇ¾úÀ¸¸ç, ÀÌ´Â ÀÌÀü ¹öÀüÀÇ Ä¿³Î¿¡ ´ëÇÏ¿© À¯»çÇÑ ±â´É, È®Àå °¡´ÉÇÑ NAT½Ã½ºÅÛ ±×¸®°í È®Àå °¡´ÉÇÑ ÆÐŶ ÇÊÅ͸µ ½Ã½ºÅÛÀ» Á¦°øÇÑ´Ù.


1.1.1. Ä¿³Î 2.0°ú 2.2¿¡¼­ÀÇ ¹®Á¦Á¡?

  1. »ç¿ëÀÚ °ø°£À» Åë°úÇÏ´Â ÆÐŶ¿¡ ´ëÇÏ¿© ¾î¶°ÇÑ ÇϺα¸Á¶µµ ¸¸µé¾îÁ® ÀÖÁö ¾ÊÀ¸¸ç ±× ÀÌÀ¯´Â ´ÙÀ½°ú °°´Ù.

    • Ä¿³Î¼öÁØ¿¡¼­ ÄÚµùÇÏ´Â °ÍÀÌ ¾î·Æ´Ù

    • ¹Ýµå½Ã C/C++·Î Ä¿³Î ¼öÁØÀÇ ÄÚµùÀÌ µÇ¾î¾ß ÇÑ´Ù.

    • µ¿Àû ÇÊÅ͸µ Á¤Ã¥ÀÌ Ä¿³Î¿¡ Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù.

    • Ä¿³Î 2.2¿¡¼­´Â ³Ý¸µÅ©¸¦ °Åó »ç¿ëÀÚ °ø°£À¸·Î ÆÐŶÀ» º¹»çÇÏ´Â ¹æ¹ýÀ» Á¦½ÃÇÏ¿´À¸³ª, ÀçÀü¼Û ÆÐŶÀÌ ´À¸®°í `sanity' check¿¡ Áö¹èµÈ´Ù. ¿¹¸¦ µé¸é, ÀçÀü¼Û ÆÐŶÀÌ ±âÁ¸ÀÇ ÀÎÅÍÆäÀ̽º·Î µé¾î¿Àµµ·Ï ¿äûÇÏ´Â °ÍÀÌ ºÒ°¡´ÉÇÏ´Ù.

  2. Åõ¸íÇÑ ÇÁ¶ô½Ã ±¸ÇöÀÌ ¾î·Æ´Ù.

    • ±× ÁÖ¼Ò¿Í ¿¬°üµÈ ¼ÒÄÏÀÌ Á¸ÀçÇÏ´Â Áö ¾Ë¾Æº¸±â À§ÇØ ¸ðµç ÆÐŶÀ» »ìÆ캻´Ù.

    • Root´Â ¿ÜºÎ ÁÖ¼Ò¿Í ¿¬°áµÇ´Â °ÍÀ» Çã°¡ÇØ¾ß ÇÑ´Ù.

    • ·ÎÄÿ¡¼­ »ý¼ºµÈ ÆÐŶÀ» ¸®´ÙÀÌ·ºÆ®ÇÒ ¼ö ¾ø´Ù.

    • REDIRECT´Â UDP¿¡ ´ëÇÑ ÀÀ´äÀ» ó¸®ÇÏÁö ¸ø ÇÑ´Ù. ¿¹¸¦ µé¸é, UDP ÆÐŶÀ» 1153À¸·ÎÀÇ ¸®´ÙÀÌ·ºÆ®°¡ µ¿ÀÛÀ» ÇÏÁö ¾Ê´Â °æ¿ìµµ ÀÖÀ¸¸ç, ÀÌ´Â ÀϺΠŬ¶óÀ̾ðÆ®°¡ 53¹ø Æ÷Æ®°¡ ¾Æ´Ñ ´Ù¸¥ °÷À¸·ÎºÎÅÍ µé¾î¿À´Â ÀÀ´äÀ» ½È¾îÇϱ⠶§¹®ÀÌ´Ù.

    • REDIRECT´Â tcp/upd Æ÷Æ® Àç¹èÄ¡¿¡ ´ëÇÏ¿© °ü¿©ÇÏÁö ¾Ê´Â´Ù. Áï, »ç¿ëÀÚ°¡ REDIRECT ·ê¿¡ ÀÇÇØ °áÁ¤µÈ Æ÷Æ®¸¦ ¾ò¾î¿Í¾ß ÇÑ´Ù.

    • Ä¿³Î 2.1 ½Ã¸®Áî °³¹ß±â°£ Áß ÃÖ¼Ò µÎ ¹ø Á¤µµ ÁߴܵǾú´Ù.

    • Äڵ尡 »ó´çÈ÷ ÁöÀúºÐÇÏ´Ù. Ä¿³Î 2.2.1¿¡¼­ #ifdef CONFIG_IP_TRANSPARENT_PROXYÀÇ »ç¿ë Åë°è¸¦ º¸¸é, 11°³ÀÇ ÆÄÀÏ¿¡ 34¹ø ³ªÅ¸³­´Ù. CONFIG_IP_FIREWALL°ú ºñ±³ÇØ º¸¸é, 5°³ÀÇ ÆÄÀÏ¿¡ 10¹ø¸¸ ³ªÅ¸³­´Ù.

  3. ÀÎÅÍÆäÀ̽º ¾îµå·¹½º¿Í º°°³·Î ÆÐŶÇÊÅÍ ·êÀ» ¸¸µå´Â °ÍÀÌ ºÒ°¡´ÉÇÏ´Ù.

    • ÀÎÅÍÆäÀ̽º¸¦ °ÅÃÄ¿À´Â ÆÐŶÀÌ ·ÎÄÿ¡¼­ »ý¼ºµÈ °ÍÀÎÁö ·ÎÄÃÀ» µé¾î¿À´Â °ÍÀÎÁö ±¸ºÐÇϱâ À§Çؼ­ ¹Ýµå½Ã ·ÎÄà ÀÎÅÍÆäÀ̽ºÀÇ ÁÖ¼Ò¸¦ ¾Ë¾Æ¾ß ÇÑ´Ù.

    • ¸®´ÙÀÌ·º¼ÇÀ̳ª ¸Å½ºÄ¿·¹À̵ùÀÇ °æ¿ì´Â Á¤º¸°¡ ÃæºÐÇÏÁö ¾Ê´Ù..

    • Æ÷¿öµù üÀθ¸ÀÌ ¿ÜºÎ·Î ÇâÇÏ´Â ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. ³×Æ®¿÷ ±¸¼º¿¡ ´ëÇÑ Áö½ÄÀ» ÀÌ¿ëÇÏ¿© ¾î´À ÀÎÅÍÆäÀ̽º·ÎºÎÅÍ ÆÐŶÀÌ µé¾î¿À´ÂÁö ¾Ë°í ÀÖ¾î¾ß¸¸ ÇÑ´Ù.

  4. ¸Å½ºÄ¿·¹À̵ùÀÌ ÇÊÅ͸µ¿¡ Æ÷ÇԵǾî ÀÖ´Ù:

    ÇÊÅ͸µ°ú ¸Å½ºÄ¿·¹À̵ù°£ÀÇ »óÈ£ÀÛ¿ëÀÌ ¹æÈ­º® ±¸ÃàÀ» º¹ÀâÇÏ°Ô ¸¸µç´Ù:

    • ÀÔ·Â ÇÊÅ͸µÀÎ °æ¿ì, ÀÀ´ä ÆÐŶÀÌ ¹Ú½º ÀÚü¸¦ ÇâÇÏ´Â °ÍÀ¸·Î ³ªÅ¸³­´Ù.

    • µð¸Å½ºÄ¿·¹À̵å(demasqueraded)µÇ´Â ÆÐŶÀÌ Æ÷¿öµå ÇÊÅ͸µ¿¡¼­´Â ÀüÇô ³ªÅ¸³ªÁö ¾Ê´Â´Ù.

    • Ãâ·Â ÇÊÅ͸µ¿¡¼­´Â ÆÐŶÀÌ ·ÎÄà ¹Ú½º·ÎºÎÅÍ µé¾î¿À´Â °Íó·³ º¸ÀδÙ.

  5. Æ÷Æ® Æ÷¿öµù, ¶ó¿ìÆðú QoS¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Â TOS ó¸®, ¸®´ÙÀÌ·ºÆ®, ICMP µµ´ÞºÒ°¡(unreachable)°ú ¸¶Å©(mark) µîÀÌ ÆÐŶ ÇÊÅ͸µ Äڵ忡 Æ÷ÇԵǾî ÀÖ´Ù.

  6. ipchains ÄÚµå´Â ¸ðµâÈ­µÇ¾î ÀÖÁöµµ ¾Ê°í È®ÀåÇÒ ¼öµµ ¾ø´Ù. (¿¹: MAC ¾îµå·¹½º ÇÊÅ͸µ, ¿É¼Ç ÇÊÅ͸µ µî)

  7. ÇϺα¸Á¶°¡ ºÒÃæºÐÇϱ⠶§¹®¿¡ ´Ù¸¥ ±â¼úÀ» ³¶ºñÇÏ°Ô ¸¸µé¾ú´Ù.

    • per-protocol ¸ðµâÀ» ´õÇÑ ¸Å½ºÄ¿·¹À̵ù

    • ¶ó¿ìÆà Äڵ忡 ÀÇÇÑ ºü¸¥ Á¤Àû NAT(per-protocol 󸮸¦ Æ÷ÇÔÇÏÁö ¾Ê¾Ò´Ù).

    • Æ÷Æ® Æ÷¿öµù, ¸®´ÙÀÌ·ºÆ®, ÀÚµ¿ Æ÷¿öµù

    • The Linux NAT and Virtual Server Projects.

  8. CONFIG_NET_FASTROUTE¿Í ÆÐŶ ÇÊÅ͸µ°£ÀÇ È£È¯¼º °á¿©:

    • Æ÷¿öµå ÆÐŶÀº ¼¼ °³ÀÇ Ã¼ÀÎÀ» °ÅÃÄ Àü´ÞµÈ´Ù.

    • ÀÌ·¯ÇÑ Ã¼ÀÎÀ» ¹«½ÃÇÏ°í Áö³ª°£ °æ¿ì ¾Ë·ÁÁÙ ¹æ¹ýÀÌ ¾ø´Ù.

  9. ¶ó¿ìÆà ÇÁ·ÎÅؽº·Î ÀÎÇØ ¹ö·ÁÁø ÆÐŶÀ» °üÂûÇÒ ¼ö ¾ø´Ù. (Áï, Source Address Verification)

  10. ÆÐŶ ÇÊÅ͸µ ·ê¿¡ ´ëÇÏ¿© ÀÚµ¿À¸·Î Ä«¿îÅ͸¦ Àо ¹æ¹ýÀÌ ¾ø´Ù.

  11. CONFIG_IP_ALWAYS_DEFRAGÀº ÄÄÆÄÀÏÇÒ ¶§ ÁÖ´Â ¿É¼ÇÀÌ¶ó¼­ ÀϹÝÀûÀÎ ¸ñÀûÀ¸·Î ¿øÇÏ´Â Ä¿³ÎÀ» ¹èÆ÷ÆÇÀ» ¸¸µé±â°¡ ¾î·Æ´Ù.


1.1.2. ´©±¸½ÃÁÒ?

³ª´Â ÀÌ·± ÁþÀ» Çϸ®¸¸Å­ ¹Ùº¸½º·¯¿î »ç¶÷ÀÌ´Ù. ipchainsÀÇ °øµ¿ÀúÀÚÀÌ°í ÇöÀç ¸®´ª½º Ä¿³Î IP ¹æÈ­º®ÀÇ ¸ÞÀÎÅͳʷμ­, ÇöÀçÀÇ ½Ã½ºÅÛ ¶§¹®¿¡ »ç¶÷µéÀÌ ¸¹Àº ¹®Á¦¸¦ °Ý¾ú´Ù´Â °Í »Ó¸¸ ¾Æ´Ï¶ó ±×µéÀÌ ½ÃµµÇÏ°í ÀÖ´Â °ÍÀÌ Á¡Á¡ ´õ ³ëÃâµÇ°í ÀÖ´Ù´Â °ÍÀ» ¾Ë¾Ò´Ù.


1.1.3. ±×°Ô ¿Ö ÆøÁÖÇÏÁÒ?

ÀÌ~~¾ß!, Áö³­ ÁÖ¿¡ ÀÌ ¹®¼­¸¦ ºÃ¾î¾ß ÇÏ´Â °Çµ¥...

»ç½Ç ³ª´Â ¿ì¸® ¸ðµÎ°¡ µÇ±â ¿øÇÏ´Â ±×·± ÈǸ¢ÇÑ ÇÁ·Î±×·¡¸Ó°¡ ¾Æ´Ï°í, ½Ã°£, Àåºñ ±×¸®°í ¿µ°¨µµ ºÎÁ·Çؼ­ ½Ã³ª¸®¿À Àüü¸¦ ÃæºÐÈ÷ Å×½ºÆ® Çغ¸Áö ¸øÇß´Ù. ±×Àú ³»°¡ Çغ» °ÍÀ̶ó°í´Â ¿©·¯ºÐµéÀÌ Âü¿©Çϱ⸦ ¹Ù¶ó´Â ¸¶À½¿¡¼­ ¸¸µç testsuite¸¦ µ¹¸®´Â °ÍÀÌ °íÀÛÀ̾ú´Ù.


2. ¾îµð¼­ ÃֽŠ¹öÀüÀ» ±¸ÇÏÁÒ?

ÃÖ½ÅÀÇ HOWTO, userspace tools ±×¸®°í testsuite¸¦ °¡Áö°í ÀÖ´Â CVS ¼­¹ö°¡ samba.org¿¡ ÀÖ´Ù. Åë»óÀûÀÎ ºê¶ó¿ì¡ ¹æ¹ýÀ¸·Î´Â, À¥ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÃÖ½ÅÀÇ ¼Ò½º¸¦ ¾òÀ¸·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù:

  1. anoymous·Î SAMBA CVS ¼­¹ö¿¡ ·Î±×ÀÎÇÑ´Ù:

    
cvs -d :pserver:cvs@cvs.samba.org:/cvsroot login
    					

  2. Æнº¿öµå¸¦ ¹°¾îº¸¸é `cvs'¶ó°í Ä£´Ù.

  3. ´ÙÀ½ ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© Äڵ带 üũÇÑ´Ù:

    
cvs -d :pserver:cvs@cvs.samba.org:/cvsroot co netfilter
    					

  4. ÃֽŠ¹öÀüÀ¸·Î ¾÷µ¥ÀÌÆ®ÇÏ·Á¸é, ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

    					
    cvs update -d -P
    					


3. ³ÝÇÊÅÍ ¾ÆÅ°ÅØó

³ÝÇÊÅÍ´Â ´ÜÁö ÇÁ·ÎÅäÄÝ ½ºÅÃÀÇ ´Ù¾çÇÑ Æ÷ÀÎÆ®¿¡ Á¸ÀçÇÏ´Â ÈÅÀÇ ¿¬¼ÓÀÏ »ÓÀÌ´Ù. ÀÌ»óÀûÀÎ IPv4ÀÇ ÁøÇà°æ·Î ´ÙÀ̾î±×·¥Àº ´ÙÀ½°ú °°´Ù.

A Packet Traversing the Netfilter System:
   --->[1]--->[ROUTE]--->[3]--->[4]--->
                 |            ^
                 |            |
                 |         [ROUTE]
                 v            |
                [2]          [5]
                 |            ^
                 |            |
                 v            |
ÆÐŶÀº ±×¸²ÀÇ ÁÂÃøÀ¸·ÎºÎÅÍ µé¾î¿Í¼­ ´Ü¼øÇÑ µ¥ÀÌÅÍ Ã¼Å©(Áï, µ¥ÀÌÅÍ°¡ Àß·È´ÂÁö, ȤÀº IP üũ ¼¶ÀÇ ÀÌ»óÀ¯¹«, µÚÁ×¹ÚÁ× µÇÁö´Â ¾Ê¾Ò´Â Áö µî)¸¦ °ÅÃÄ, ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷ÀÇ NF_IP_PRE_ROUTING[1] ÈÅÀ¸·Î Àü´ÞµÈ´Ù.

´ÙÀ½À¸·Î, ÆÐŶÀº ¶ó¿ìÆà ÄÚµå·Î µé¾î°¡¸ç, ¿©±â¼­ ÆÐŶÀÌ ´Ù¸¥ ÀÎÅÍÆäÀ̽º·Î ÇâÇÏ´ÂÁö ¶Ç´Â ·ÎÄà ÇÁ·Î¼¼½º·Î ÇâÇÏ´ÂÁö °áÁ¤µÈ´Ù. ÆÐŶÀÌ ¶ó¿ìÆÃµÉ ¼ö ¾ø´Â °æ¿ì, ¶ó¿ìÆà ÄÚµå´Â ÆÐŶÀ» ¹ö¸®±âµµ ÇÑ´Ù.

¸¸ÀÏ ÆÐŶÀÇ ¸ñÀûÁö°¡ µé¾î¿Â ¹Ú½º¶ó¸é, ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷Àº ÆÐŶÀ» ÇÁ·Î¼¼½º·Î Àü´ÞÇϱâ Àü¿¡ NF_IP_LOCAL_IN [2] ÈÅÀ» ´Ù½Ã Çѹø È£ÃâÇÏ°Ô µÈ´Ù.

¸¸ÀÏ ´Ù¸¥ ÀÎÅÍÆäÀ̽º·Î Àü´ÞÇÏ°íÀÚ ÇÑ´Ù¸é, ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷Àº NF_IP_FORWARD [3] ÈÅÀ» È£ÃâÇÑ´Ù.

±×¸®°í ³ª¼­ ÆÐŶÀÌ ³ÝÆ®¿÷ ¶óÀÎÀ¸·Î º¸³»Áö±â Àü¿¡ ¸¶Áö¸· ³ÝÇÊÅÍ ÈÅÀÎ NF_IP_POST_ROUTING [4] ÈÅÀ¸·Î Àü´ÞµÈ´Ù.

·ÎÄÿ¡¼­ »ý¼ºµÈ ÆÐŶ¿¡ ´ëÇؼ­´Â NF_IP_LOCAL_OUT [5] ÈÅÀÌ È£ÃâµÈ´Ù. ÀÌ ¶§, ÀÌ ÈÅÀÌ È£ÃâµÈ ÈÄ ¶ó¿ìÆÃÀÌ ¹ß»ýÇÏ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ½ÇÁ¦·Î´Â ¶ó¿ìÆà Äڵ尡 ¼Ò½º IP ÁÖ¼Ò¿Í ¸î °¡Áö IP ¿É¼ÇÀ» È®ÀÎÇϱâ À§ÇØ ¶ó¿ìÆà Äڵ尡 ¸ÕÀú È£ÃâÀÌ µÈ´Ù. Áï, ¶ó¿ìÆÃÀ» º¯°æÇÏ°íÀÚ ÇÑ´Ù¸é, NAT Äڵ忡 µÇ¾î ÀÖ´Â °Íó·³ ¿©·¯ºÐ ½º½º·Î `skb->dst' Çʵ带 º¯°æÇؾ߸¸ ÇÑ´Ù.


3.1. ³ÝÇÊÅÍÀÇ ±âÃÊ

ÀÌ Àý¿¡¼­´Â IPv4¿¡ ´ëÇÑ ³ÝÇÊÅÍÀÇ ¿¹¸¦ º¸ÀÏ °ÍÀ̸ç, À̸¦ ÅëÇØ ¿©·¯ºÐµéÀº °¢°¢ÀÇ ÈÅÀÌ µ¿ÀÛÇÏ´Â ½ÃÁ¡À» ÀÌÇØÇÏ°Ô µÉ °ÍÀÌ´Ù. ÀÌ °ÍÀÌ ¹Ù·Î ³ÝÇÊÅÍÀÇ ±âÃÊÀÌ´Ù.

Ä¿³Î ¸ðµâÀº ¾Õ¼­ ¾ð±ÞÇÑ ¾î¶°ÇÑ ÈÅ¿¡ ´ëÇؼ­ ÀÀ´äÇÒ ¼ö ÀÖµµ·Ï µî·ÏÇÒ ¼ö ÀÖÀ¸¸ç, ¾î¶² ÇÔ¼ö¸¦ µî·ÏÇÑ ¸ðµâÀº ÈÅ ³»¿¡¼­ ÇÔ¼öÀÇ ¿ì¼±¼øÀ§¿¡ ´ëÇÏ¿© ¹Ýµå½Ã ¸í½ÃÇÏ¿©¾ß ÇÑ´Ù. ÄÚ¾î ³×Æ®¿öÅ· ÄÚµå·ÎºÎÅÍ ³ÝÇÊÅÍ ÈÅÀÌ È£ÃâµÇ´Â °æ¿ì, °¢ Æ÷ÀÎÆ®¿¡ µî·ÏµÈ °¢°¢ÀÇ ¸ðµâÀº ¿ì¼±¼øÀ§¿¡ µû¶ó È£ÃâÀÌ µÇ°í, ÆÐŶÀ» ÀÚÀ¯·ÎÀÌ ´Ù·ê ¼ö ÀÖ´Ù. ¸ðµâÀº ³ÝÇÊÅÍ¿¡°Ô ´ÙÀ½ÀÇ ´Ù¼¸ °¡Áö µ¿ÀÛÀ» Çϵµ·Ï ¿äûÇÑ´Ù.

  1. NF_ACCEPT: º¸Åëó·³ °è¼Ó ÁøÇà½ÃŲ´Ù.

  2. NF_DROP: ÆÐŶÀ» ¹ö¸°´Ù. Áï °è¼Ó ÁøÇà½ÃÅ°Áö ¾Ê´Â´Ù.

  3. NF_STOLEN: ÆÐŶÀ» Á¢¼öÇÏ°Ú´Ù. Áï °è¼Ó ÁøÇà½ÃÅ°Áö ¾Ê´Â´Ù.

  4. NF_QUEUE: ÆÐŶÀ» Å¥·Î º¸³½´Ù.(º¸Åë »ç¿ëÀÚ °ø°£¿¡¼­ÀÇ Ã³¸®¸¦ ¸ñÀûÀ¸·Î ÇÑ´Ù.)

  5. NF_REPEAT: ÇöÀç ÈÅÀ» ´Ù½Ã È£ÃâÇÑ´Ù.

³ÝÇÊÅÍÀÇ ´Ù¸¥ ºÎºÐÀº µÚ¿¡ ³ª¿À´Â Ä¿³Î ºÎºÐ¿¡¼­ ´Ù·ç±â·Î ÇÑ´Ù.

ÀÌ»ó°ú °°Àº °ÍÀÌ ±âÃÊ°¡ µÇ¾î, ÀúÀÚµéÀº ´ÙÀ½ µÎ Àý¿¡ º¸ÀÎ °Í°ú °°Àº º¹ÀâÇÑ ÆÐŶ 󸮸¦ ¸¸µé ¼ö ÀÖ´Ù.


3.2. ÆÐŶ ¼±ÅÃ: IP Tables

IP tableÀ» È£ÃâÇÏ´Â ÆÐŶ ¼±Åà ½Ã½ºÅÛÀº ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷À» ±â¹ÝÀ¸·Î ±¸¼ºµÇ¾úÀ¸¸ç, ÀÌ´Â È®À强À» °¡Áö°í ipchains·ÎºÎÅÍ Á÷Á¢ ¹°·Á¹ÞÀº À¯»êÀÌ´Ù.(ipchains´Â ipfwadmÀ¸·ÎºÎÅÍ ¹°·Á¹Þ°í, ipfwadmÀº BSDÀÇ ipfw IIRC·ÎºÎÅÍ ¹°·Á¹Þ¾Ò´Ù.) Ä¿³Î ¸ðµâÀº »õ·Î¿î Å×À̺íÀ» µî·ÏÇÒ ¼ö ÀÖÀ¸¸ç, ÀÓÀÇÀÇ ÆÐŶÀÌ ÁÖ¾îÁø Å×À̺íÀ» Åë°úÇϵµ·Ï ¿äûÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ÆÐŶ ¼±Åà ¹æ¹ýÀº ÆÐŶ ÇÊÅ͸µ(Áï `ÇÊÅÍ' Å×À̺í), ³×Æ®¿÷ ÁÖ¼Ò º¯È¯(`nat' Å×À̺í) ±×¸®°í Á¾ÇÕÀûÀÎ pre-route ÆÐŶ mangling(`mangling' Å×À̺í')¿¡ »ç¿ëÇÑ´Ù.

³ÝÇÊÅÍ¿¡ µî·ÏµÈ ÈÅÀº ´ÙÀ½°ú °°´Ù.(¿©±â¼­´Â °¢°¢ÀÇ ÇÔ¼ö°¡ ½ÇÁ¦·Î È£ÃâµÇ´Â ¼ø¼­·Î °¢°¢ÀÇ ÈÅ¿¡ ÀÖ´Â ÇÔ¼ö¿Í °°ÀÌ º¸¿´´Ù.)

   --->PRE------>[ROUTE]--->FWD---------->POST------>
       Conntrack    |       Filter   ^    NAT (Src)
       Mangle       |                |    Conntrack
       NAT (Dst)    |             [ROUTE]
       (QDisc)      v                |
                    IN Filter       OUT Conntrack
                    |  Conntrack     ^  Mangle
                    |                |  NAT (Dst)
                    v                |  Filter
		

3.2.1. ÆÐŶ ÇÊÅ͸µ

`filter'¶ó´Â Å×À̺íÀº ÆÐŶÀ» Àý´ë·Î º¯°æ½ÃÅ°Áö ¾Ê°í ´ÜÁö °É·¯³»±â¸¸ ÇÑ´Ù.

ipchains¿Í ºñ±³ÇßÀ» ¶§, iptables filterÀÇ ÀåÁ¡ Áß Çϳª´Â ÀÛ°í ºü¸£´Ù´Â °ÍÀ̸ç, NF_IP_LOCAL_IN°ú NF_IP_FORWARD, NF_IP_LOCAL_OUT ½ÃÁ¡¿¡¼­ ³ÝÇÊÅÍ·Î ÈÅÅ·µÈ´Ù. ÀÌ´Â, ÁÖ¾îÁø ÆÐŶ¿¡ ´ëÇÏ¿© À̸¦ ÇÊÅ͸µ ÇÏ´Â À§Ä¡°¡ ¿ÀÁ÷ Çϳª »ÓÀ̶ó´Â °ÍÀ» ÀǹÌÇÑ´Ù. °á±¹ »ç¿ëÀÚµéÀÌ ipchains¸¦ »ç¿ëÇÑ °Íº¸´Ù ´õ ´Ü¼øÇÏ°Ô ¸¸µé¸ç, ¶ÇÇÑ ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷ÀÌ NF_IP_FORWARD ÈÅ¿¡ ´ëÇÏ¿© ÀԷ°ú Ãâ·Â ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù´Â »ç½ÇÀº ´Ù¾çÇÑ ÇÊÅ͸µÀÌ ÈξÀ ´Ü¼øÇØÁø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.

ÁÖ: ÇÊÀÚ´Â ¾÷±×·¹À̵åÀÇ ÇÊ¿ä ¾øÀÌ ±âÁ¸ÀÇ ipfwadm°ú ipchains¸¦ »ç¿ë °¡´ÉÇϵµ·Ï ³ÝÇÊÅÍÀÇ ÃÖ»óÀ§¿¡ ¸ðµâ·Î¼­ ipchains¿Í ipfwadmÀÇ Ä¿³ÎºÎºÐÀ» Æ÷Æà ÇÏ¿´´Ù.


3.2.2. NAT

ÀÌ´Â `nat' Å×À̺íÀÇ ¿µ¿ªÀ¸·Î, µÎ °¡ÁöÀÇ ³ÝÇÊÅÍ ÈÅÀ¸·Î ÆÐŶÀ» Àü´ÞÇÑ´Ù. Áï, non-local ÆÐŶ¿¡ ´ëÇØ, °¢°¢ ¸ñÀûÁö¿Í ¼Ò½º Àüȯ¿¡ ´ëÇÏ¿© NF_IP_PRE_ROUTING°ú NF_IP_POST_ROUTING ÈÅÀÌ ¿Ïº®ÇÏ°Ô µ¿ÀÛÇÑ´Ù. CONFIG_IP_NF_NAT_LOCALÀÌ Á¤ÀÇµÈ °æ¿ì, NF_IP_LOCAL_OUT°ú NF_IP_LOCAL_IN ÈÅÀÌ ·ÎÄà ÆÐŶÀÇ ¸ñÀûÁö¸¦ ÀüȯÇϱâ À§ÇØ »ç¿ëµÈ´Ù.

ÀÌ Å×À̺íÀº `filter' Å×À̺í°ú´Â ¾à°£ ´Ù¸£¸ç, »õ·Î¿î Ä¿³Ø¼ÇÀÇ Ã¹ ¹ø° ÆÐŶ¸¸ÀÌ Å×À̺í·Î Àü´ÞµÈ´Ù. µû¶ó¼­ ÀÌ¿Í °°Àº Àü´ÞÀÇ °á°ú´Â µ¿ÀÏÇÑ Ä¿³Ø¼Ç¿¡ À־ ÇâÈÄ Àü´ÞµÇ´Â ¸ðµç ÆÐŶ¿¡ Àû¿ëµÈ´Ù.


3.2.3. ¸Å½ºÄ¿·¹À̵ù, Æ÷Æ® Æ÷¿öµù, Åõ¸íÇÑ ÇÁ¶ô½Ã

ÇÊÀÚ´Â NAT¸¦ Ãâ¹ßÁö NAT(Áï ù ¹ø° ÆÐŶÀÌ Ãâ¹ßÁö¸¦ º¯°æÇÏ´Â °æ¿ì)¿Í ¸ñÀûÁö NAT(ù ¹ø° ÆÐŶÀÌ ¸ñÀûÁö¸¦ º¯°æÇÏ´Â °æ¿ì)·Î ±¸ºÐÇÏ¿´´Ù.

¸Å½ºÄ¿·¹À̵ùÀº Ãâ¹ßÁö NATÀÇ Æ¯º°ÇÑ °æ¿ìÀ̸ç, Æ÷Æ® Æ÷¿öµù°ú Åõ¸íÇÑ ÇÁ¶ô½Ã´Â ¸ñÀûÁö NATÀÇ Æ¯º°ÇÑ °æ¿ìÀÌ´Ù. ÀÌ¿Í °°Àº °ÍÀº ¼­·Î µ¶¸³ÀûÀÎ ¿£Æ¼Æ¼¸¦ °¡Áö°í NAT ÇÁ·¹ÀÓ¿÷À» ÀÌ¿ëÇÏ¿© ±¸ÇöµÇ¾ú´Ù.


3.2.4. ÆÐŶ ¸Í±Û¸µ(packet mangling)

ÆÐŶ ¸Í±Û¸µ Å×À̺í(`mangling' table)Àº ÆÐŶÀÇ Á¤º¸¸¦ ½ÇÁ¦·Î º¯°æÇϱâ À§ÇØ »ç¿ëµÇ¸ç, NF_IP_PRE_ROUTING°ú NF_IP_LOCAL_OUT ½ÃÁ¡¿¡¼­ ³ÝÇÊÅÍ·Î ÈÅÅ·µÈ´Ù.


3.3. ¿¬°á ÃßÀû

¿¬°áÃßÀû(connection tracking)Àº NATÀÇ ±âº»ÀÌÁö¸¸, ¸ðµâ·Î ºÐ¸®µÇ¾î ±¸ÇöµÈ´Ù. ÀÌ´Â ¿¬°áÃßÀûÀ» ´Ü¼øÇÏ°í ¸íÈ®ÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÆÐŶ ÇÊÅ͸µ Äڵ忡 ´ëÇÑ È®À强À» Á¦°øÇÑ´Ù.(`state' ¸ðµâ)


3.4. ±×ÀÌ¿Ü Ãß°¡µÈ »çÇ×

»õ·Î¿î À¯¿¬¼º ¶§¹®¿¡ Á¤¸»·Î ¹«¼­¿î ÀÏÀ» °ÞÀ» ±âȸ°¡ ¸¹¾ÆÁ³Áö¸¸, ´Ù¸¥ »ç¶÷µéÀÌ Çâ»óµÈ Äڵ带 ÀÛ¼ºÇϰųª ±âÁ¸ÀÇ Äڵ带 ¿ÏÀüÈ÷ ´ëüÇØ ¹ö¸± ¼ö ÀÖ´Â ±âȸ ¿ª½Ã ¸¹¾ÆÁ³´Ù.


1. ÇÁ·Î±×·¡¸ÓµéÀ» À§ÇÑ Á¤º¸

ºñ¹ÐÀ» Çϳª ¸»¾¸µå¸®°Ú½À´Ï´Ù. ¹¹³ÄÇϸé, Á¦°¡ ±â¸£´Â ÇܽºÅÍ°¡ ¸ðµç Äڵ带 ÀÛ¼ºÇß½À´Ï´Ù. Àú´Â ´ÜÁö Àü´ÞÇÏ´Â ¿ªÇÒ¸¸ Çß°í, ¸ðµç °èȹÀº Á¦ ¾Ö¿Ïµ¿¹°ÀÌ Çß½ÀÁÒ. ±×·¯´Ï ¹ö±×°¡ »ý±â´õ¶óµµ Àú¸¦ ¿ø¸ÁÇÏÁö ¸¶½Ã°í, ±Í¿©¿î ÅкϼþÀ̸¦ ¿ø¸ÁÇϽñ⠹ٶø´Ï´Ù.


1.1. ip_tablesÀÇ ÀÌÇØ

iptables´Â ¸Þ¸ð¸® ³»¿¡ ÀÖ´Â ±ÔÄ¢ÀÇ ¸í¸íµÈ ¹è¿­°ú °¢°¢ÀÇ ÈÅÀ¸·ÎºÎÅÍ ÆÐŶÀÌ Àü´ÞµÇ±â ½ÃÀÛÇØ¾ß ÇÏ´Â Á¤º¸¸¦ ´Ü¼øÈ÷ Á¦°ø¸¸ ÇÏ´Â °ÍÀÌ´Ù. ¾î¶² Å×À̺íÀÌ µî·ÏµÇ°í ³ª¸é, »ç¿ëÀÚ °ø°£Àº getsockopt()°ú setsockopt()¸¦ ÀÌ¿ëÇÏ¿© ±× ³»¿ëÀ» ÀÐ°í º¯°æÇÒ ¼ö ÀÖ´Ù.

iptables´Â ¾î¶°ÇÑ ³ÝÇÊÅÍ ÈÅ¿¡µµ µî·ÏÇÏÁö ¾ÊÀ¸¸ç, À̸¦ ¼öÇàÇÏ´Â ´Ù¸¥ ¸ðµâ¿¡ ÀÇÁ¸ÇÏ°í ÀûÀýÈ÷ ÆÐŶÀ» ¸ðµâ¿¡ Àü´ÞÇÑ´Ù. ´Ù½Ã ¸»ÇØ, ÇϳªÀÇ ¸ðµâÀº ³ÝÇÊÅÍ ÈÅ°ú ip_tables¿¡ µû·Îµû·Î µî·ÏÇؾßÇÑ ÇÏ°í, ÈÅÀÌ ¹ß»ýÇϸé ip_tables¸¦ È£ÃâÇÏ´Â ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÑ´Ù.


1.1.1. ip_tablesÀÇ µ¥ÀÌÅÍ ±¸Á¶

Æí¸®¼ºÀ» À§ÇØ, µ¿ÀÏÇÑ µ¥ÀÌÅÍ ±¸Á¶¸¦ »ç¿ëÇÏ¿© »ç¿ëÀÚ °ø°£¿¡ ÀÇÇÑ ±ÔÄ¢°ú Ä¿³Î³»ºÎÀÇ ±ÔÄ¢À» Ç¥ÇöÇÏ¿´´Ù. ÀÌ·¸°Ô Ç¥ÇöµÈ µ¥ÀÌÅÍ ±¸Á¶ Áß ¾ÆÁÖ ÀϺκи¸ÀÌ Ä¿³Î ³»ºÎ¿¡¼­ »ç¿ëµÈ´Ù.

°¢°¢ÀÇ ±ÔÄ¢Àº ´ÙÀ½°ú °°Àº ºÎºÐÀ¸·Î ±¸¼ºµÈ´Ù.

  1. `struct ipt_entry'

  2. zero ¶Ç´Â ±× ÀÌ»óÀÇ `struct ipt_entry_match' ±¸Á¶·Î, °¢°¢Àº ¿©±â¿¡ Ãß°¡ °¡´ÉÇÑ µ¥ÀÌÅÍÀÇ Å©±â¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù.

  3. `struct ipt_entry_target' ±¸Á¶: Ãß°¡ °¡´ÉÇÑ µ¥ÀÌÅÍ Å©±â º¯È­ °¡´É

±ÔÄ¢ÀÇ º¯È­ °¡´ÉÇÑ Æ¯¼ºÀº È®À强¿¡ ´ëÇÏ¿© »ó´çÇÑ À¯¿¬¼ºÀ» Á¦°øÇϸç, ƯÈ÷ °¢°¢ÀÇ match ȤÀº Ÿ±êÀÌ ÀÓÀÇ Å©±âÀÇ µ¥ÀÌÅ͸¦ Àü´ÞÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ¹Ý¸é ÀÌ´Â ¸î °¡Áö ÇÔÁ¤À» ¸¸µé°Ô µÇ´Â µ¥, ¹Ýµå½Ã Á¤·Ä(alignment)¿¡ ÁÖÀÇÇؾ߸¸ ÇÑ´Ù. `ip_entry'¿Í `ipt_entry_match', `ipt_entry_target' ±¸Á¶°¡ Å©±â º¯°æÀÌ Æí¸®Çϵµ·Ï ÇÏ°í, IPT_ALIGN() ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¿© ÀåºñÀÇ ÃÖ´ë Á¤·Ä(alignment)±îÁö ¸ðµç µ¥ÀÌÅ͵éÀ» ¸ðÀ¸´Â °Í µîÀ» È®½ÇÇÏ°Ô ÇÔÀ¸·Î½á Á¤·ÄÀ» ±¸ÇöÇÏ¿´´Ù.

`struct ipt_entry'´Â ´ÙÀ½°ú °°Àº Çʵ带 Æ÷ÇÔÇÑ´Ù.

  1. `struct ipt_ip' : IP header¿¡ ´ëÇÑ ¼¼ºÎÇ׸ñÀ» Æ÷ÇÔ

  2. `nf_cache' : ÇöÀçÀÇ ±ÔÄ¢À» °Ë»çÇؾßÇÏ´Â ÆÐŶÀÇ ºÎºÐÀ» ¾Ë·ÁÁÖ´Â ºñÆ® Çʵå

  3. `target_offset' : ipt_entry_target ±¸Á¶°¡ ½ÃÀÛÇÏ´Â ÇöÀç ±ÔÄ¢ÀÇ ½ÃÀÛÁ¡À¸·ÎºÎÅÍÀÇ offsetÀ» ¾Ë·ÁÁÖ´Â Çʵå

  4. `next_offset' : ÇöÀç ±ÔÄ¢ÀÇ ÃÖ´ë Å©±â¸¦ ¾Ë·ÁÁÖ´Â Çʵå·Î match¿Í targetÀ» Æ÷ÇÔÇÑ´Ù. ÀÌ °Í ¿ª½Ã IPT_ALIGN ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¿© Á¤·ÄµÇ¾î¾ß ÇÑ´Ù.

  5. `comefrom' : ÆÐŶÀÇ °æ·Î¸¦ ÃßÀûÇϱâ À§ÇØ Ä¿³ÎÀÌ »ç¿ëÇÏ´Â Çʵå

  6. `struct ipt_counters' : ÇöÀç ±ÔÄ¢¿¡ ÀÏÄ¡ÇÏ´Â ÆÐŶ¿¡ ´ëÇÑ ¹ÙÀÌÆ® Ä«¿îÅÍ¿Í ÆÐŶÀ» Æ÷ÇÔÇÏ´Â Çʵå

`struct ipt_entry_match'¿Í `struct ipt_entry_target'Àº »ó´çÈ÷ À¯»çÇϸç, Àüü(IPT_ALIGNÀ¸·Î Á¤·ÄµÈ) ±æÀÌ Çʵå(°¢°¢ `match_size'¿Í `target_size')¿Í, match¿Í target(»ç¿ëÀÚ °ø°£¿¡ ´ëÇÑ) ¸íĪÀ» Æ÷ÇÔÇÏ´Â ±¸Á¶Ã¼, ±×¸®°í (Ä¿³Î¿¡ ´ëÇÑ) Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÑ´Ù.


1.1.2. ip_tablesÀÇ »ç¿ë°ú ÁøÇà

Ä¿³ÎÀº ƯÁ¤ÇÑ ÈÅ¿¡ ÀÇÇØ Áö½ÃµÈ À§Ä¡¿¡¼­ °üÂûÀ» ½ÃÀÛÇÏ¿©, ±×¿¡ °ü·ÃÇÑ ±ÔÄ¢À» °Ë»çÇÏ°í, `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°¡ µÉ °ÍÀÌ´Ù.


1.2. iptables È®ÀåÇϱâ

Àü ¹«ÁöÇÏ°Ô °ÔÀ¸¸¥ ³ÑÀ̶ó¼­, iptables´Â ¾ó¸¶µçÁö È®Àå °¡´ÉÇÕ´Ï´Ù. ´Ù½Ã ¸»Çϸé Á¦ ¼ÕÀ» ¶°³ª ´Ù¸¥ »ç¶÷¿¡°Ô ³Ñ¾î°£, ¿ÀǼҽº ±× ÀÌ»óÀ̶ó´Â °ÅÁÒ.

iptables¸¦ È®ÀåÇÑ´Ù´Â °ÍÀº ´ÙÀ½ÀÇ µÎ ºÎºÐÀ» Æ÷ÇÔÇÑ´Ù. Áï, »õ·Î¿î ¸ðµâÀ» ÀÛ¼ºÇÏ¿© Ä¿³ÎÀ» È®ÀåÇÏ´Â °Í°ú »õ·Î¿î °øÀ¯ ¶óÀ̺귯¸®¸¦ ÀÛ¼ºÇÏ¿© »ç¿ëÀÚ Â÷¿øÀÇ ÇÁ·Î±×·¥ÀÎ iptables¸¦ È®ÀåÇÏ´Â °ÍÀÌ´Ù.


1.2.1. Ä¿³Î

¿¹Á¦¸¦ º¸½Å »ç¶÷µéÀº ¾Ë°ÚÁö¸¸, Ä¿³Î ¸ðµâÀ» ÀÛ¼ºÇÑ´Ù´Â °Í ÀÚü´Â »ó´çÈ÷ ´Ü¼øÇÏ´Ù. ÇÑ°¡Áö ¾Ë¾Æ¾ß ÇÒ °ÍÀº ¿©·¯ºÐÀÇ Äڵ尡 ÀçÁøÀÔ °¡´ÉÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾îº¸¸é, »ç¿ëÀÚ °ø°£À¸·ÎºÎÅÍ µé¾î¿À´Â ¾î¶² ÆÐŶÀÌ Á¸ÀçÇÒ ¼ö ÀÖÀ» °ÍÀ̸ç, µ¿½Ã¿¡ ¶Ç ´Ù¸¥ ÆÐŶÀÌ ÀÎÅÍ·´Æ®¿¡ ÀÇÇØ µé¾î ¿Ã ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸, Ä¿³Î 2.3.4À̻󿡼­ SMP¸¦ »ç¿ëÇÒ °æ¿ì, CPU´ç ÇϳªÀÇ ÀÎÅÍ·´Æ®¿¡ ´ëÇØ ÇϳªÀÇ ÆÐŶ¸¸ Á¸ÀçÇÏ°Ô µÈ´Ù.

¿©·¯ºÐµéÀÌ ¾Ë¾Æ¾ß ÇÏ´Â ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.

init_module()

¸ðµâÀÇ ÁøÀÔ Æ÷ÀÎÆ®·Î ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì À½¼ö¸¦ ³Ñ°ÜÁÖ¸ç ³ÝÇÊÅÍ¿¡ ¼º°øÀûÀ¸·Î µî·ÏÀÌ µÈ °æ¿ì 0À» µ¹·ÁÁØ´Ù.

cleanup_module()

¸ðµâÀÇ Á¾·á Æ÷ÀÎÆ®·Î ³ÝÇÊÅÍ¿¡¼­ ¸ðµâÀÚü¸¦ µî·ÏÇØÁ¦ÇÑ´Ù.

ipt_register_match()

»õ·Î¿î match ŸÀÔÀ» µî·ÏÇϱâ À§ÇÏ¿© »ç¿ëÇϸç, ÀÌ °ÍÀ» `struct ipt_match'·Î Àü´ÞÇØ¾ß ÇÑ´Ù. Åë»ó `struct ipt_match'´Â Á¤Àû º¯¼ö·Î Á¤ÀÇÇÑ´Ù.

ipt_register_target()

»õ·Î¿î ŸÀÔÀ» µî·ÏÇϱâ À§ÇØ »ç¿ëÇϸç, ÀÌ °ÍÀ» `struct ipt_target'À¸·Î Àü´ÞÇØ¾ß ÇÑ´Ù. º¸Åë `struct ipt_target'Àº Á¤Àû º¯¼ö·Î Àü´ÞµÈ´Ù.

ipt_unregister_target()

targetÀ» µî·ÏÇØÁ¦Çϱâ À§ÇØ »ç¿ëÇÑ´Ù.

ipt_unregister_match()

match¸¦ µî·ÏÇØÁ¦Çϱâ À§ÇØ »ç¿ëÇÑ´Ù.

¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ »õ·Î¿î match³ª target¿¡ ´ëÇÑ »õ·Î¿î °ø°£ ³»¿¡¼­ÀÇ Æí¹ý »ç¿ë(Ä«¿îÅÍ ±â´É Á¦°ø °°Àº)¿¡ ´ëÇÑ ÇÑ°¡Áö °æ°í¸¦ ÇÏ°Ú´Ù. SMP ¸Ó½ÅÀÇ °æ¿ì °¢°¢ÀÇ CPU¿¡ ´ëÇÏ¿© Àüü Å×À̺íÀ» memcpy()¸¦ ÀÌ¿ëÇÏ¿© º¹»çÇÑ´Ù. Áï Áß½ÉÀÌ µÇ´Â Á¤º¸¸¦ º¸Á¸Çϱ⠹ٶõ´Ù¸é, `limit' match¿¡ »ç¿ëµÈ ¹æ¹ýÀ» ã¾ÆºÁ¾ß¸¸ ÇÒ °ÍÀÌ´Ù.


1.2.1.1. »õ·Î¿î Match ÇÔ¼ö

»õ·Î¿î match functionÀº ÀϹÝÀûÀ¸·Î µ¶¸³¸ðµâ·Î ÀÛ¼ºÇÑ´Ù. ¹Ù²Ù¾î ¸»Çϸé, ºñ·Ï Åë»óÀûÀ¸·Î ÇÊ¿äÇÏÁö ¾Ê´õ¶óµµ, ÀÌ·¯ÇÑ ¸ðµâ¿¡ È®À强À» Á¦°øÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀÌ´Ù. µû¶ó¼­, »ç¿ëÀÚµéÀÌ Á÷Á¢ ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ ¸ðµâ°ú Åë½ÅÇÒ ¼ö ÀÖµµ·Ï ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷ÀÇ `nf_register_sockopt' ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÇϳªÀÇ ¹æ¹ýÀÌ µÉ °ÍÀÌ´Ù. ¶Ç ´Ù¸¥ ¹æ¹ýÀº ³ÝÇÊÅÍ ¸ðµâ°ú ip_tables¿¡ ±¸ÇöµÈ °Í°ú µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î, ´Ù¸¥ ¸ðµâÀÌ ÀÚ½ÅÀ» µî·ÏÇϵµ·Ï ½É¹úÀ» exportÇÏ´Â °ÍÀÌ´Ù.

¿©·¯ºÐ ÀÛ¼ºÇÑ »õ·Î¿î ÇÔ¼öÀÇ ÇÙ½ÉÀº ipt_register_match()·Î Àü´ÞµÇ´Â ipt_match ±¸Á¶Ã¼ÀÌ´Ù. ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº Çʵ带 Æ÷ÇÔÇÑ´Ù.

list

ÀÓÀÇÀÇ °ªÀ¸·Î ¼³Á¤µÇ´Â ÇʵåÀÌ´Ù. Áï `{ NULL, NULL }'

name

»ç¿ëÀÚ °ø°£¿¡¼­ ÂüÁ¶µÇ´Â matchÇÔ¼öÀÇ À̸§À» ÀúÀåÇÏ´Â ÇʵåÀÌ´Ù. ÀÚµ¿ ·Îµù ±â´ÉÀÌ µ¿ÀÛÇϱâ À§Çؼ­ ÇÔ¼öÀÇ À̸§Àº ¸ðµâÀÇ À̸§°ú ÀÏÄ¡ÇÏ¿©¾ß ÇÑ´Ù. ¿¹¸¦ µé¸é, ÇÔ¼öÀ̸§ÀÌ ``mac''ÀÎ °æ¿ì, ¸ðµâÀ̸§Àº ¹Ýµå½Ã ``ipt_mac.o''À̾î¾ß ÇÑ´Ù.

match

match ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ´Â Çʵå·Î, skb, ÀÔ/Ãâ·Â ÀåÄ¡ÀÇ Æ÷ÀÎÅÍ(ÈÅ¿¡ µû¶ó µÑ Áß Çϳª´Â NULLÀÌ µÉ ¼öµµ ÀÖ´Ù), µ¿ÀÛ½Ãų ·ê¿¡ ÇØ´çÇÏ´Â match µ¥ÀÌÅÍÀÇ Æ÷ÀÎÅÍ, IP ¿ÀÇÁ¼Â(non-zero´Â non-head ÇÁ·¡±×¸ÕÆ®¸¦ ÀǹÌ), ÇÁ·ÎÅäÄÝ Çì´õ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ(°ú°ÅÀÇ IP header), µ¥ÀÌÅÍÀÇ ±æÀÌ(ÆÐŶ ±æÀÌ¿¡¼­ IP Çì´õÀÇ ±æÀ̸¦ »« Å©±â) ±×¸®°í `hotdrop' º¯¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÃëÇÏ°Ô µÈ´Ù. ÆÐŶÀÌ ÀÏÄ¡Çϸé non-zero¸¦ µ¹·Á¾ß ÁÖ¾î¾ß ÇÏ°í, 0À» µ¹·ÁÁÖ´Â °æ¿ì `hotdrop'Àº 1·Î ¼³Á¤ÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ´Â ÆÐŶÀ» ¹Ù·Î ¹ö·È´Ù´Â °ÍÀ» ¾Ë¸®±â À§ÇÑ °ÍÀÌ´Ù.

checkentry

·ê¿¡ ´ëÇÑ ¼¼ºÎ¸í¼¼¸¦ È®ÀÎÇÏ´Â ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÑ´Ù. µî·ÏµÈ ÇÔ¼ö°¡ 0À» µ¹·ÁÁÖ´Â °æ¿ì, ÇöÀçÀÇ ·êÀº »ç¿ëÀڷκÎÅÍ ¹Þ¾Æµé¿©ÁöÁö ¾ÊÀ» °ÍÀÌ´Ù. ¿¹¸¦ µé¸é, ``tcp'' match ŸÀÔÀº ¿ÀÁ÷ tcp ÆÐŶ¸¸ ¹Þ¾ÆµéÀÏ °ÍÀÌ°í, µû¶ó¼­ ·êÀÇ `struct ipt_ip' ºÎºÐ¿¡ ÇÁ·ÎÅäÄÝÀº ¹Ýµå½Ã tcpÀ̾î¾ß ÇÑ´Ù°í ¸í½ÃµÇ¾î ÀÖÁö ¾Ê´Â ÇÑ 0ÀÌ ¸®ÅÏ µÉ °ÍÀÌ´Ù. tablename ÀÎÀÚ´Â »ç¿ëÀÚÀÇ match°¡ ¾î¶² Å×À̺íÀ» »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö¸¦ Çã°¡ÇÏ°í, `hook_mask'´Â »ç¿ëÀÚÀÇ ·êÀÌ È£ÃâµÉ ¼ö ÀÖ´Â ÈÅ¿¡ ´ëÇÑ ºñÆ®¸Å½ºÅ©ÀÌ´Ù. ¸¸ÀÏ ¿©·¯ºÐÀÇ match°¡ ³ÝÇÊÅÍÀÇ ÀϺΠÈÅ¿¡ ´ëÇÏ¿© ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù¸é, ±× match¸¦ ÀÌ À§Ä¡¿¡¼­ ¾ø¾Ù ¼ö ÀÖ´Ù.

destroy

ÇöÀçÀÇ match°¡ »èÁ¦µÉ °æ¿ì È£ÃâµÇ´Â ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇϸç, »ç¿ëÀÚ·Î ÇÏ¿©±Ý checkentry¿¡¼­ µ¿ÀûÀ¸·Î ¸®¼Ò½º¸¦ Àç¹èÄ¡ÇÏ°í ¶Ç À̸¦ ¾ø¾Ù ¼ö ÀÖµµ·Ï ÇÑ´Ù.

me

`THIS_MODULE'·Î ¼³Á¤µÇ¸ç, ÀÌ´Â ¿©·¯ºÐÀÇ ¸ðµâ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µ¹·ÁÁØ´Ù. ¾î¶² ŸÀÔÀÇ ±ÔÄ¢ÀÌ »ý¼ºµÇ°Å³ª ¼Ò¸êµÇ´Â °æ¿ì usage-count¸¦ Áõ°¡ ȤÀº °¨¼Ò½ÃŲ´Ù. ¾î¶² ±ÔÄ¢ÀÌ ÀÌ °ÍÀ» ÂüÁ¶ÇÏ°í ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í »ç¿ëÀÚ°¡ ¸ðµâÀ» Á¦°ÅÇÏ°íÀÚ ÇÏ´Â °æ¿ì, »ç¿ëÀÚ°¡ ¸ðµâÀ» Á¦°ÅÇÏÁö ¸øÇϵµ·Ï ÇÑ´Ù.


1.2.1.2. »õ·Î¿î Targets

¿©·¯ºÐÀÇ Å¸±êÀÌ ÆÐŶ(Çì´õ³ª ¹Ùµð)À» º¯°æ½ÃŲ´Ù¸é, ÆÐŶÀÌ º¹Á¦µÇ´Â ½ÃÁ¡¿¡¼­ ÆÐŶÀ» º¹»çÇϱâ À§ÇÏ¿© skb_unshare()¸¦ È£ÃâÇؾ߸¸ ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é skbuff¿¡ º¹Á¦µÈ ÆÐŶÀÌ ÀÖ´Â ¾î¶°ÇÑ raw socketÀÌ¶óµµ º¯°æµÈ »çÇ×À» ¾Ë¾ÆÂ÷¸®°Ô µÈ´Ù.

»õ·Î¿î targetÀº Åë»óÀûÀ¸·Î ´Üµ¶ ¸ðµâ·Î ÀÛ¼ºµÈ´Ù. `New Match Functions'ÀÇ Àý¿¡¼­ ¾ð±ÞÇÑ ¹Ù¿Í µ¿ÀÏÇÑ ³»¿ëÀÌ ¿©±â¼­µµ Àû¿ëµÈ´Ù.

¿©·¯ºÐÀÇ »õ·Î¿î targetÀÇ ÇÙ½ÉÀº ipt_register_target()À¸·Î Àü´ÞµÇ´Â struct ipt_targetÀ¸·Î, ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº Çʵ带 °®°í ÀÖ´Ù.

list

ÀÓÀÇÀÇ °ªÀ¸·Î ¼³Á¤µÇ´Â ÇʵåÀÌ´Ù. Áï `{ NULL, NULL }'

name

»ç¿ëÀÚ °ø°£¿¡¼­ ÂüÁ¶µÇ´Â target ÇÔ¼öÀÇ À̸§À» ÀúÀåÇÏ´Â ÇʵåÀÌ´Ù. ÀÚµ¿ ·Îµù ±â´ÉÀÌ µ¿ÀÛÇϱâ À§Çؼ­ ÇÔ¼öÀÇ À̸§Àº ¸ðµâÀÇ À̸§°ú ÀÏÄ¡ÇÏ¿©¾ß ÇÑ´Ù. ¿¹¸¦ µé¸é, ÇÔ¼öÀ̸§ÀÌ ``REJECT''ÀÎ °æ¿ì, ¸ðµâÀ̸§Àº ¹Ýµå½Ã ``ipt_REJECT.o''À̾î¾ß ÇÑ´Ù.

target

target ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÏ´Â Çʵå·Î, skbuff, ÈÅ ³Ñ¹ö, ÀÔ/Ãâ·Â ÀåÄ¡ÀÇ Æ÷ÀÎÅÍ(ÈÅ¿¡ µû¶ó µÑ Áß Çϳª´Â NULLÀÌ µÉ ¼öµµ ÀÖ´Ù), target µ¥ÀÌÅÍÀÇ Æ÷ÀÎÅÍ, Å×ÀÌºí¿¡ ÀÖ´Â ·êÀÇ À§Ä¡¸¦ °ªÀ¸·Î °®°Ô µÈ´Ù. ÆÐŶÀÌ °è¼Ó ÁøÇàÇØ¾ß ÇÑ´Ù¸é target ÇÔ¼ö´Â IPT_CONTINUE(-1)À» µ¹·ÁÁÖ°í, ±×·¸Áö ¾ÊÀº °æ¿ì´Â NF_DROP, NF_ACCEPT, NF_STOLENµîÀ» µ¹·ÁÁÖ¾î ÆÐŶÀÇ ¿î¸íÀ» °áÁ¤ÇÏ°Ô µÈ´Ù.

checkentry

·ê¿¡ ´ëÇÑ ¼¼ºÎ¸í¼¼¸¦ È®ÀÎÇÏ´Â ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇÑ´Ù. µî·ÏµÈ ÇÔ¼ö°¡ 0À» µ¹·ÁÁÖ´Â °æ¿ì, ÇöÀçÀÇ ·êÀº »ç¿ëÀڷκÎÅÍ ¹Þ¾Æµé¿©ÁöÁö ¾ÊÀ» °ÍÀÌ´Ù.

destroy

ÇöÀçÀÇ targetÀÌ »ç¿ëÁßÀÎ entry°¡ »èÁ¦µÉ °æ¿ì È£ÃâµÇ´Â ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ÀúÀåÇϸç, »ç¿ëÀÚ·Î ÇÏ¿©±Ý checkentry¿¡¼­ µ¿ÀûÀ¸·Î ¸®¼Ò½º¸¦ Àç¹èÄ¡ÇÏ°í ¶Ç À̸¦ ¾ø¾Ù ¼ö ÀÖµµ·Ï ÇÑ´Ù.

me

`THIS_MODULE'·Î ¼³Á¤µÇ¸ç, ÀÌ´Â ¿©·¯ºÐÀÇ ¸ðµâ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µ¹·ÁÁØ´Ù. ¾î¶² ŸÀÔÀÇ ±ÔÄ¢ÀÌ »ý¼ºµÇ°Å³ª ¼Ò¸êµÇ´Â °æ¿ì usage-count¸¦ Áõ°¡ ȤÀº °¨¼Ò½ÃŲ´Ù. ¾î¶² ±ÔÄ¢ÀÌ ÀÌ °ÍÀ» ÂüÁ¶ÇÏ°í ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í »ç¿ëÀÚ°¡ ¸ðµâÀ» Á¦°ÅÇÏ°íÀÚ ÇÏ´Â °æ¿ì, »ç¿ëÀÚ°¡ ¸ðµâÀ» Á¦°ÅÇÏÁö ¸øÇϵµ·Ï ÇÑ´Ù.


1.2.1.3. »õ·Î¿î Tables

¿©·¯ºÐµéÀÇ ¸ñÀû¿¡ ¸Â´Â »õ·Î¿î tableÀ» ÀÛ¼ºÇÒ ¼ö ÀÖÀ¸¸ç, À̸¦ À§Çؼ­´Â `ipt_register_table()'ÇÔ¼ö¸¦ È£ÃâÇؾßÇÑ´Ù. ÀÌ ÇÔ¼ö´Â Àü´ÞÀÎÀÚ·Î `struct ipt_table'À» ¹ÞÀ¸¸ç ±× ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.

list

ÀÓÀÇÀÇ °ªÀ¸·Î ¼³Á¤µÇ´Â ÇʵåÀÌ´Ù. Áï `{ NULL, NULL }'

name

»ç¿ëÀÚ °ø°£¿¡¼­ ÂüÁ¶µÇ´Â table ÇÔ¼öÀÇ À̸§À» ÀúÀåÇÏ´Â ÇʵåÀÌ´Ù. ÀÚµ¿ ·Îµù ±â´ÉÀÌ µ¿ÀÛÇϱâ À§Çؼ­ ÇÔ¼öÀÇ À̸§Àº ¸ðµâÀÇ À̸§°ú ÀÏÄ¡ÇÏ¿©¾ß ÇÑ´Ù. ¿¹¸¦ µé¸é, ÇÔ¼öÀ̸§ÀÌ ``nat''ÀÎ °æ¿ì, ¸ðµâÀ̸§Àº ¹Ýµå½Ã ``ipt_nat.o''À̾î¾ß ÇÑ´Ù.

table

`struct ipt_replace'·Î °¡µæ Âù Çʵå·Î, Å×À̺íÀ» ±³Ã¼Çϱâ À§ÇÏ¿© »ç¿ëÀÚ °ø°£¿¡¼­ »ç¿ëµÈ´Ù. `counters' Æ÷ÀÎÅÍ´Â NULL·Î ¼³Á¤µÇ¾î¾ß ÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â `__initdata'·Î ¼±¾ðµÇ±â ¶§¹®¿¡ ºÎÆà ÈÄ¿¡´Â ÃʱâÈ­µÈ´Ù.

valid_hooks

Å×À̺í·Î ÁøÀÔÇÏ°íÀÚ ÇÏ´Â IPv4 ³ÝÇÊÅÍ ÈÅÀÇ ºñÆ®¸Å½ºÅ©ÀÌ´Ù. ÁøÀÔ¿£Æ®¸®°¡ À¯È¿ÇÑÁö È®ÀÎÇÏ°í, ipt_match¿Í ipt_targetÀÇ `checkentry()'ÇÔ¼ö¿¡ ´ëÇØ »ç¿ë °¡´ÉÇÑ ÈÅÀ» °è»êÇϱâ À§ÇØ »ç¿ëÇÑ´Ù.

lock

Àüü Å×ÀÌºí¿¡ ´ëÇÏ¿© ÀÐ°í ¾²±â°¡ °¡´ÉÇÑ spinlockÀ̸ç, RW_LOCK_UNLOCKED·Î ÃʱâÈ­ µÈ´Ù.

private

ip_tables Äڵ忡 ÀÇÇØ ³»ºÎÀûÀ¸·Î »ç¿ëµÈ´Ù.


1.2.2. »ç¿ëÀÚ°ø°£ µµ±¸(Userpace Tool)

ÀÌÁ¦ ¿©·¯ºÐµéÀÌ Á÷Á¢ Ä¿³Î ¸ðµâÀ» ÀÛ¼ºÇß°í, »ç¿ëÀÚ °ø°£¿¡¼­ ÀÌ¿¡ ´ëÇÑ ¿É¼ÇÀ» Á¶Á¤Çϱ⸦ ¿øÇÒ °ÍÀÌ´Ù. ÇÊÀÚ´Â °¢°¢ È®ÀåµÈ ¹öÀü¿¡ ´ëÇÏ¿© »õ·ÎÀÌ ÆÄ»ýµÈ ¹öÀüÀ» ¸¸µå´Â °Íº¸´Ù´Â ¾ÆÁÖ ÃÖ½ÅÀÇ 90³â´ë ±â¼úÀ» »ç¿ëÇÑ´Ù. Áï furbiesÀÌ´Ù. ½ý¸®... °øÀ¯¶óÀ̺귯¸®¸¦ ¸»ÇÏ´Â °ÍÀÌ´Ù.

»õ·Î¿î Å×À̺íÀ» »ç¿ëÇÏ°íÀÚ ÇÏ´Â °æ¿ì iptables¸¦ È®ÀåÇÒ ÇÊ¿ä´Â ¾ø°í, `-t' ¿É¼Ç¸¸ ÁÖ¸é µÈ´Ù.

°øÀ¯¶óÀ̺귯¸®´Â `_init()'ÇÔ¼ö¸¦ Æ÷ÇÔÇؾßÇϸç, ÀÌ ÇÔ¼ö´Â ¸ðµâÀÌ ·Îµù µÇ´Â ½ÃÁ¡¿¡¼­ ÀÚµ¿À¸·Î È£ÃâµÈ´Ù. ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ °øÀ¯¶óÀ̺귯¸®°¡ »õ·Î¿î match³ª »õ·Î¿î targetÀ» Æ÷ÇÔÇÏ´À³Ä¿¡ µû¶ó _init()ÇÔ¼ö°¡ `register_match()'³ª `register_target()'ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

°øÀ¯¶óÀ̺귯¸®¸¦ Á¦°øÇؾßÇÒ ÇÊ¿äµµ ÀÖÀ¸¸ç, ±¸Á¶Ã¼ÀÇ ÀϺθ¦ ÃʱâÈ­Çϰųª Ãß°¡ ¿É¼ÇÀ» Á¦°øÇÏ´Â µ¥ °øÀ¯¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. ÇÊÀÚ´Â °øÀ¯¶óÀ̺귯¸®°¡ ¾Æ¹«°Íµµ ¾È ÇÒÁö¶óµµ °øÀ¯¶óÀ̺귯¸®´Â ¶óÀ̺귯¸®°¡ ¾øÀ» ¶§ ¹ß»ýÇÏ´Â ¹®Á¦¸¦ ÁÙÀÏ ¼ö Àֱ⠶§¹®¿¡ ¹Ýµå½Ã °øÀ¯¶óÀ̺귯¸®¸¦ »ç¿ëÇϱ⸦ ÁÖÀåÇÑ´Ù.

`iptables.h' Çì´õ¿¡ À¯¿ëÇÑ ÇÔ¼öµéÀÌ Á¤ÀǵǾî ÀÖÀ¸¸ç, ±×Áß ´ÙÀ½°ú °°Àº °ÍµéÀÌ »ó´çÈ÷ À¯¿ëÇÏ´Ù.

chech_inverse()

Àü´ÞÀÎÀÚ°¡ `!'ÀÎÁö °Ë»çÇÏ°í, ¸ÂÀ¸¸é `invert' Ç÷¢ÀÌ ¼³Á¤µÇ°í, ±×·¸Áö ¾ÊÀ¸¸é, `invert' Ç÷¢À» ¼³Á¤ÇÑ´Ù. true°¡ ¸®ÅÏµÈ °æ¿ì ¿¹Á¦¿¡¼­ º¸ÀÎ ¹Ù¿Í °°ÀÌ optiond¸¦ Áõ°¡½ÃÄѾßÇÑ´Ù.

string_to_number()

½ºÆ®¸µÀ» ÁÖ¾îÁø ¹üÀ§ ³»ÀÇ ¼ýÀÚ·Î º¯È¯ÇÑ´Ù. Çü½ÄÀÌ Àß ¸ø µÇ¾ú°Å³ª ¹üÀ§¸¦ ¹þ¾î³ª¸é, -1ÀÌ ¸®ÅϵȴÙ. `string_to_number'´Â `strtol'À» »ç¿ëÇÑ´Ù. ´Ù½Ã ¸»Çϸé, ¼±Ç๮ÀÚ¿­ ``0x''´Â 16Áø¼ö¶ó´Â °ÍÀ» ÀǹÌÇÏ°í, ``0''Àº 8Áø¼ö¶ó´Â °ÍÀ» ÀǹÌÇÏ°Ô µÈ´Ù.

exit_error()

¿¡·¯°¡ °ËÃâµÈ °æ¿ì È£ÃâµÇ´Â ÇÔ¼öÀÌ´Ù. ÀϹÝÀûÀ¸·Î ù ¹ø° Àμö´Â `PARAMETER_PROBLEM'À̸ç, »ç¿ëÀÚ°¡ Ä¿¸Çµå ¶óÀÎÀ» Á¤È®Çϱ⠻ç¿ëÇÏÁö ¾Ê¾Ò´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.


1.2.2.1. »õ·Î¿î Match ÇÔ¼ö

¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ °øÀ¯¶óÀ̺귯¸®ÀÇ _init() ÇÔ¼ö´Â `register_match()'¿¡ Á¤Àû ±¸Á¶Ã¼ÀÎ `struct iptables_match'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁØ´Ù. ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº Çʵ带 Æ÷ÇÔÇÑ´Ù.

next

matchÀÇ ¸µÅ©µå ¸®½ºÆ®¸¦ ¸¸µé±â À§ÇØ »ç¿ëµÇ´Â Æ÷ÀÎÅÍ·Î, Ãʱ⿡´Â NULL·Î ¼³Á¤µÈ´Ù.

name

match ÇÔ¼öÀÇ À̸§À¸·Î, ¶óÀ̺귯¸®ÀÇ À̸§°ú ÀÏÄ¡ÇؾßÇÑ´Ù.(Áï, `libipt_tcp.so'¿¡ ´ëÇؼ­´Â ``tcp''¿Í °°ÀÌ...)

version

ÀϹÝÀûÀ¸·Î NETFILTER_VERSION ¸ÅÅ©·Î·Î ¼³Á¤µÇ¸ç, iptables ¹ÙÀ̳ʸ®ÆÄÀÏÀÌ ½Ç¼ö·Î ¾û¶×ÇÑ °øÀ¯¶óÀ̺귯¸®¸¦ ¼±ÅÃÇÏÁö ¾Êµµ·Ï Çϱâ À§ÇÏ¿© »ç¿ëµÈ´Ù.

size

ÇöÀç »ç¿ëÇÏ´Â match¿¡ ´ëÇÑ match µ¥ÀÌÅÍÀÇ Å©±â·Î, Á¤È®ÇÏ°Ô Á¤·ÄÇϱâ À§Çؼ­´Â IPT_ALIGN() ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¿©¾ß ÇÑ´Ù.

userpacesize

ÀϺΠmatch¿¡ ´ëÇØ, Ä¿³ÎÀº ÀϺΠÇʵ带 ³»ºÎÀûÀ¸·Î º¯°æÇÑ´Ù. `limit' targetÀÌ ÁÁÀº ¿¹ÀÌ´Ù. ÀÌ´Â ´Ü¼øÇÑ `memcmp()'ÇÔ¼ö·Î´Â µÎ°³ÀÇ ·êÀ» ºñ±³Çϱ⿡´Â ºÎÁ·ÇÏ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¸¸ÀÏ ÀÌ·¯ÇÑ °æ¿ì°¡ ¹ß»ýÇÏ¸é ±¸Á¶Ã¼ÀÇ ½ÃÀÛÁ¡¿¡¼­ º¯°æµÇÁö ¾Ê´Â ¸ðµç Çʵ带 À§Ä¡½ÃÅ°°í, º¯°æµÇÁö ¾ÊÀº ÇʵåÀÇ Å©±â¸¦ ¿©±â¿¡ Áý¾î³Ö°Ô µÈ´Ù. ±×·¯³ª ÀϹÝÀûÀÎ °æ¿ì, ÀÌ Çʵå´Â `size'Çʵå¿Í µ¿ÀÏÇÑ °ªÀ» °®´Â´Ù.

help

¿É¼ÇÀÇ »ç¿ë¹ýÀ» È­¸é¿¡ Ãâ·ÂÇÑ´Ù.

init

ipt_entry_match ±¸Á¶Ã¼¿¡ Á¸ÀçÇÏ´Â º°µµÀÇ °ø°£(¸¸ÀÏ Á¸ÀçÇÑ´Ù¸é)À» ÃʱâÈ­ÇÏ´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ°í, ¾î¶°ÇÑ nfcache ºñÆ®µµ 1·Î ¼³Á¤ÇÑ´Ù. `linux/include/netfilter_ipv4.h'ÀÇ ³»¿ëÀ» ÀÌ¿ëÇÏ¿© Ç¥ÇöÇÒ ¼ö ¾ø´Â ¾î¶² °ÍÀ» °Ë»çÇÏ°íÀÖ´Ù¸é, °£´ÜÈ÷ NFC_UNKNOWN ºñÆ®¿Í OR¸¦ ÃëÇÏ¸é µÈ´Ù. ÀÌ ÇÔ¼ö´Â `parse()'º¸´Ù ¸ÕÀú È£ÃâµÇ¾î¾ß ÇÑ´Ù.

parse

Ä¿¸Çµå ¶óÀο¡ ¾Ë ¼ö ¾ø´Â ¿É¼ÇÀÌ ÁÖ¾îÁø °æ¿ì È£ÃâµÇ¸ç, ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ ¶óÀ̺귯¸®¿¡ ÁÖ¾îÁø ¿É¼ÇÀÌ Á¸ÀçÇÏ´Â °æ¿ì non-zero¸¦ ¸®ÅÏ ÇÑ´Ù. `!'ÀÌ ÀÌ¹Ì ³ªÅ¸³­ °æ¿ì´Â `invert'°¡ TRUE·Î ¼³Á¤µÈ´Ù. `flags' Æ÷ÀÎÅÍ´Â ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ ¶óÀ̺귯¸®ÀÇ ¹èŸÀû »ç¿ëÀ» À§ÇÑ °ÍÀ̸ç, Ưº°È÷ ¸í½ÃµÈ ¿É¼ÇÀÇ ºñÆ®¸Å½ºÅ©¸¦ ÀúÀåÇϱâ À§ÇÏ¿© »ç¿ëÇÑ´Ù. ¿©·¯ºÐµéÀº ncfcache Çʵ带 È®½ÇÈ÷ Á¶Á¤ÇÒ ¼ö ÀÖµµ·Ï ÇؾßÇϸç, ÇÊ¿äÇÑ °æ¿ì¿¡´Â `ipt_entry_match' ±¸Á¶Ã¼ÀÇ Å©±â¸¦ È®ÀåÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ´Ù¸¸ ±× Å©±â´Â ¹Ýµå½Ã IPT_ALIGN ¸ÅÅ©·Î¸¦ °ÅÃļ­ Àü´ÞµÇ¾î¾ß ÇÑ´Ù.

final_check

Ä¿¸Çµå ¶óÀÎÀÌ ÆÄ½ÌµÈ ÈÄ È£ÃâµÇ´Â ÇÔ¼öÀ̸ç, ¿©·¯ºÐÀÇ ¶óÀ̺귯¸®¸¦ À§ÇØ ¿¹¾àµÈ `flags' Á¤¼ö¸¦ ´Ù·ç°Ô µÈ´Ù. À̸¦ ÀÌ¿ëÇÏ¸é ¾î¶² °­Á¦ÀûÀÎ ¿É¼ÇÀÌ ¸í½ÃµÇ¾ú´Â Áö È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °æ¿ì°¡ ¹ß»ýÇϸé `exit_error()'À» È£ÃâÇØ¾ß ÇÑ´Ù.

print

¾î¶² ·ê¿¡ ´ëÇÏ¿© ºÎ°¡ÀûÀÎ match Á¤º¸¸¦ Ãâ·ÂÇϱâ À§ÇØ chain listing Äڵ忡¼­ »ç¿ëÇÏ´Â ÇÔ¼öÀÌ´Ù. »ç¿ëÀÚ°¡ `-n' Ç÷¢À» ¸í½ÃÇÑ °æ¿ì numeric flagÀÌ ¼³Á¤µÈ´Ù.

extra_opts

¿©·¯ºÐÀÇ ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â ºÎ°¡ ¿É¼ÇÀÇ null-terminated ¸®½ºÆ®ÀÌ´Ù. ÀÌ ¿É¼ÇÀº ÇöÀç »ç¿ë ÁßÀÎ ¿É¼Ç¿¡ ´õÇØÁ®¼­ getopt_longÀ¸·Î Àü´ÞµÈ´Ù. º¸´Ù ÀÚ¼¼ÇÑ °ÍÀº man ÆäÀÌÁö¸¦ º¸´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. getopt_long¿¡ ´ëÇÑ ¸®ÅÏ °ªÀº ¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ `parse()' ÇÔ¼ö¿¡ ´ëÇÑ Ã¹ ¹ø° ÀÎÀÚ°¡ µÈ´Ù.

iptables¿¡ ÀÇÇØ ³»ºÎÀûÀ¸·Î »ç¿ëÇϱâ À§ÇÑ ÀÌ ±¸Á¶Ã¼ÀÇ ¸¶Áö¸· ºÎºÐ¿¡ ºÎ°¡ÀûÀÎ Çʵ尡 Á¸ÀçÇÏÁö¸¸ ±× °ªÀ» ¼³Á¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù.


1.2.2.2. »õ·Î¿î Targets

¿©·¯ºÐÀÇ °øÀ¯¶óÀ̺귯¸®ÀÇ _init() ÇÔ¼ö´Â `register_target()' ÇÔ¼ö·Î Á¤ÀûÀ¸·Î ¼±¾ðµÈ `struct iptables_target'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Àü´ÞÇϸç, ÀÌ´Â ¾Õ¼­ ¾ð±ÞÇÑ iptables_match ±¸Á¶Ã¼¿Í À¯»çÇÑ Çʵ带 Æ÷ÇÔÇÑ´Ù.


1.2.3. `libiptc' »ç¿ëÇϱâ

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 ÇÔ¼ö°¡ ÀÖ´Ù.

iptc_first_chain()

table ³»ÀÇ Ã¹ ¹ø° chainÀÇ À̸§À» ¸®ÅÏ ÇÑ´Ù.

iptc_next_chain()

table ³»ÀÇ ´ÙÀ½ chainÀÇ À̸§À» ¸®ÅÏÇϸç, NULLÀº ´õ ÀÌ»ó chainÀÌ ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.

iptc_builtin()

ÁÖ¾îÁø chain nameÀÌ builtin chain nameÀ̸é TRUE¸¦ ¸®ÅÏ ÇÑ´Ù.

iptc_first_rule()

ÁÖ¾îÁø chain name³»ÀÇ Ã¹ ¹ø° ·êÀÇ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϸç, NULLÀÎ °æ¿ì´Â chainÀÌ ºñ¾ú´Ù´Â °ÍÀ» ¶æÇÑ´Ù.

iptc_next_rule()

chain³»ÀÇ ´ÙÀ½ ·ê¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϸç, NULLÀÎ °æ¿ì´Â chainÀÇ ³¡À̶ó´Â °ÍÀ» ¾Ë·ÁÁØ´Ù.

iptc_get_target()

ÁÖ¾îÁø ·êÀÇ targetÀ» °¡Á®¿Â´Ù. È®ÀåµÈ targetÀ̶ó¸é, ±×¿¡ ÇØ´çÇÏ´Â targetÀÇ nameÀ» µ¹·ÁÁØ´Ù. ´Ù¸¥ chainÀ¸·ÎÀÇ jumpÀÎ °æ¿ì´Â ±× chainÀÇ À̸§À» µ¹·ÁÁØ´Ù. ¶Ç °áÁ¤(DROP °°Àº)ÀÎ °æ¿ì, ±× nameÀ» µ¹·ÁÁØ´Ù. accounting-style ruleó·³ targetÀÌ ¾ø´Â °æ¿ì´Â null stringÀ» µ¹·ÁÁØ´Ù.

ÀÌ ÇÔ¼ö°¡ Ç¥ÁØ °áÁ¤(ÆÇÁ¤)¿¡ ´ëÇÏ¿© º¸´Ù È®ÀåµÈ Çؼ®À» Á¦°øÇϱ⠶§¹®¿¡, ipt_entry ±¸Á¶Ã¼ÀÇ `verdict' ÇʵåÀÇ °ªÀ» Á÷Á¢ »ç¿ëÇÏ´Â ´ë½Å¿¡ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.

iptc_get_policy()

builtin chainÀÇ Á¤Ã¥À» °¡Á®¿À°í, ±× Á¤Ã¥¿¡ ´ëÇÑ ÀûÁß Åë°èÄ¡¸¦ `counters' ÀÎÀÚ¿¡ ä¿î´Ù.

iptc_strerror()

iptc ¶óÀ̺귯¸®³»ÀÇ failure code¿¡ ´ëÇÏ¿© º¸´Ù ÀÇ¹Ì ÀÖ´Â Çؼ®À» ¸®ÅÏ ÇÑ´Ù. ¾î¶² ÇÔ¼ö°¡ ¿¡·¯¸¦ ¹ß»ýÇÑ °æ¿ì, Ç×»ó errno°¡ ¼³Á¤µÇ¸ç, ÀÌ °ªÀº iptc_strerror() ÇÔ¼ö·Î Àü´ÞµÇ¾î ¿¡·¯ ¸Þ½ÃÁö·Î º¯È¯µÈ´Ù.


1.3. NATÀÇ ÀÌÇØ

ÀÌÁ¦ Ä¿³ÎÀÇ NAT(Network Address Translation)±îÁö ¿À¼Ì±º¿ä. ¿©±â¼­ Á¦°øµÇ´Â ÇϺα¸Á¶´Â È¿À²º¸´Ù´Â ¿Ïº®¼º¿¡ ÁßÁ¡À» µÎ°í ¼³°èµÈ °ÍÀ̸ç, ÇâÈÄ °³Á¶¸¦ ÅëÇØ È¿À²¼ºÀÌ ÇöÀúÇÏ°Ô Áõ°¡µÉÁöµµ ¸ð¸¨´Ï´Ù. ÇöÀç Àú´Â ÀÌ ³ÑÀÌ µ¿ÀÛÇÑ´Ù´Â °Í¸¸À¸·Îµµ ÇູÇÕ´Ï´Ù.

NAT´Â ÆÐŶÀ» ÀüÇô ó¸®ÇÏÁö ¾Ê´Â connection tracking°ú NAT ÄÚµå ÀÚü·Î ºÐ¸®µÇ¾ú´Ù. connection tracking ¿ª½Ã iptables ¸ðµâ¿¡¼­ »ç¿ëÇϱâ À§ÇØ ¼³°èµÇ¾úÀ¸¸ç, µû¶ó¼­ NAT°¡ °ü½ÉÀ» µÎÁö ¾Ê´Â »óÅÂ(state)¿¡ ´ëÇؼ­ ¹Ì¹¦ÇÑ Â÷À̸¦ º¸ÀÌ°Ô µÈ´Ù.


1.3.1. ¿¬°á ÃßÀû

¿¬°áÃßÀû(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)µÇ¾î ÀÖÀ¸¸ç, ´ÙÀ½°ú °°Àº °ªÀ» °®´Â´Ù.

IP_CT_ESTABLISHED

¿ø·¡ ¹æÇâ¿¡ ´ëÇÏ¿© established connectionÀÇ ÀϺÎÀÎ ÆÐŶÀÌ´Ù.

IP_CT_RELATED

connection¿¡ °ü·ÃµÈ ÆÐŶÀ¸·Î, ¿ø·¡ÀÇ ¹æÇâÀ¸·Î Àü´ÞµÇ°í ÀÖ´Ù.

IP_CT_NEW

»õ·Î¿î connectionÀ» »ý¼ºÇÏ°íÀÚ ÇÏ´Â ÆÐŶÀÌ´Ù.(ºÐ¸íÈ÷, ¿ø·¡ ÁøÇà¹æÇâ¿¡ Á¸ÀçÇÑ´Ù)

IP_CT_ESTABLISHED + IP_CT_IS_REPLY

established connection¿¡ °ü·ÃµÈ ÆÐŶÀ¸·Î, ÀÀ´ä¹æÇâ(reply direction)À¸·Î ÇâÇÏ°í ÀÖ´Ù.

IP_CT_RELATED + IP_CT_IS_REPLY

connection¿¡ °ü·ÃµÈ ÆÐŶÀ¸·Î, ÀÀ´ä¹æÇâ(reply direction)À¸·Î ÇâÇÏ°í ÀÖ´Ù.

Áï, ÀÀ´äÆÐŶ(reply packet)Àº nfct¸¦ °Ë»çÇÏ¿© ±× °ªÀÌ IP_CT_IS_REPLY º¸´Ù Å©°Å³ª °°Àº °ªÀÎ °¡·Î È®ÀÎÇÒ ¼ö ÀÖ´Ù.


1.4. Connection Tracking/NAT È®ÀåÇϱâ

ÀÌ ¹æ½ÄÀº ¿©·¯ °¡Áö ÇÁ·ÎÅäÄÝ°ú ¼­·Î ´Ù¸¥ ¸ÊÇΠŸÀÔÀ» Á¶ÀýÇϱâ À§ÇÏ¿© ¼³°èµÈ °ÍÀ¸·Î, ¸ÊÇΠŸÀÔ Áß ÀϺδ ºÎÇϺлê(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À¸·Î À̸¦ »õ·Î ¸ÊÇÎÇØ¾ß ÇÒ °ÍÀÌ´Ù.


1.4.1. Ç¥ÁØ NAT Targets

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''°ú °°ÀÌ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.


1.4.2. »õ·Î¿î Protocols

1.4.2.1. Ä¿³Î ³»ºÎ

»õ·Î¿î ÇÁ·ÎÅäÄÝÀ» ±¸ÇöÇÑ´Ù´Â °ÍÀº tupleÀÇ Ã³¸®°¡´É ºÎºÐ°ú ±×·¸Áö ¸øÇÑ ºÎºÐÀ» °áÁ¤ÇÏ´Â °ÍÀÌ´Ù. tuple¿¡ Æ÷ÇÔµÈ ¸ðµç °ÍÀº ½ºÆ®¸²À» ±¸º°ÇÒ ¼ö Àִ Ư¼ºÀ» °¡Áö°í ÀÖ´Ù. tupleÀÇ Ã³¸®°¡´ÉºÎºÐÀº NAT¸¦ Àû¿ëÇÒ ¼ö ÀÖ´Â ºÎºÐÀ¸·Î TCPÀÎ °æ¿ì´Â ¼Ò½º Æ÷Æ®°¡ µÇ¸ç, ICMPÀÎ °æ¿ì´Â icmp ID°¡ µÈ´Ù. Áï, ½ºÆ®¸² ±¸º°ÀÚ·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ¸»ÀÌ´Ù. ó¸® ºÒ°¡´ÉÇÑ ºÎºÐÀº ÆÐŶÀÇ ³ª¸ÓÁö ºÎºÐÀ¸·Î ½ºÆ®¸²À» ±¸º°ÇÒ ¼ö ÀÖÁö¸¸, ÀÌ°ÍÀ» ¸¶À½´ë·Î ó¸®ÇÒ ¼ö ¾ø´Ù. (¿¹: TCP ¸ñÀûÁö Æ÷Æ®, ICMP ŸÀÔ)

ÇÑ°¡Áö°¡ °áÁ¤µÇ¾úÀ¸¸é, connection tracking Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ°í, `ip_conntrack_register_protocol()'·Î Àü´ÞÇϱâ À§ÇÏ¿© `ip_conntrack_protocol' ±¸Á¶Ã¼¸¦ ´Ù·ç¾î¾ß ÇÒ °ÍÀÌ´Ù.

`struct ip_conntrack_protocol'ÀÇ Çʵå´Â ´ÙÀ½°ú °°´Ù.

list

{ NULL, NULL }·Î ¼³Á¤ÇÑ´Ù. ¸®½ºÆ®¸¦ È®º¸ÇÑ´Ù.

proto

ÇÁ·ÎÅäÄÝ ¹øÈ£À̸ç ÀÚ¼¼ÇÑ °ÍÀº `/etc/protocols'¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.

name

»ç¿ëÀÚ°¡ º¸°Ô µÉ ÇÁ·ÎÅäÄÝ ¸íĪÀÌ´Ù. `/etc/protocols'¿¡ ÀÖ´Â ¸íĪÀ» »ç¿ëÇÏ´Â °ÍÀÌ Á¦ÀÏ ÁÁÀ» °ÍÀÌ´Ù.

pkt_to_tuple

ÁÖ¾îÁø ÆÐŶ¿¡ ´ëÇÑ tupleÀÇ ÇÁ·ÎÅäÄÝ »ó¼¼ºÎºÐÀ» ä¿ì´Â ÇÔ¼öÀÌ´Ù. `datah'¶ó´Â Æ÷ÀÎÅÍ´Â IP Çì´õÀÇ ½ÃÀۺκÐÀ» °¡¸®Å°¸ç, datalenÀº ÆÐŶÀ» ±æÀÌÀÌ´Ù. ÆÐŶÀÌ Çì´õ Á¤º¸¸¦ ÀúÀåÇϱ⿡ ÃæºÐÈ÷ ±æÁö ¾ÊÀ¸¸é, 0À» µ¹·ÁÁØ´Ù. datalenÀº ÃÖ¼Ò 8¹ÙÀÌÆ®ÀÌ´Ù.

invert_tuple

tupleÀÇ ÇÁ·ÎÅäÄÝ »ó¼¼ºÎºÐÀ» ´Ü¼øÈ÷ ÆÐŶ¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î º¯°æÇÏ´Â µ¥ »ç¿ëÇÑ´Ù.

print_tuple

tupleÀÇ ÇÁ·ÎÅäÄÝ »ó¼¼ºÎºÐÀ» Ãâ·ÂÇÏ´Â µ¥ »ç¿ëÇÏ´Â ÇÔ¼ö·Î, sprintf() ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. »ç¿ëµÈ ¹öÅÍ Ä³¸¯ÅÍÀÇ ¼ö°¡ ¸®ÅϵȴÙ. /proc ¿£Æ®¸®¿¡ ´ëÇÑ »óŸ¦ Ãâ·ÂÇϱâ À§ÇØ »ç¿ëÇϱ⵵ ÇÑ´Ù.

print_conntrack

conntrack ±¸Á¶Ã¼ÀÇ °ø°³µÇÁö ¾ÊÀº ºÎºÐÀ» Ãâ·ÂÇÏ´Â µ¥ »ç¿ëÇÏ´Â ÇÔ¼ö·Î, °£È¤ /proc¿¡ ÀÖ´Â »óŸ¦ Ãâ·ÂÇϱâ À§ÇØ »ç¿ëÇϱ⵵ ÇÑ´Ù.

packet

established connectionÀÇ ÀϺθ¦ º¸°íÀÚ ÇÒ ¶§ È£ÃâÇÏ´Â ÇÔ¼öÀÌ´Ù. conntrack ±¸Á¶Ã¼, IP Çì´õ, ±æÀÌ ±×¸®°í ctinfo¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò°Ô µÈ´Ù. ÆÐŶ¿¡ ´ëÇÑ ÆÇ°á·Î Åë»ó NF_ACCEPT¸¦ µ¹·ÁÁÖ¸ç, connectionÀÌ À¯È¿ÇÏÁö ¾ÊÀº ÆÐŶ¿¡ ´ëÇؼ­´Â -1À» µ¹·ÁÁØ´Ù. ¿øÇÑ´Ù¸é ÀÌ ÇÔ¼ö ³»ºÎ¿¡¼­ connectionÀ» Á¦°ÅÇÒ ¼öµµ ÀÖÁö¸¸, ·¹À̽º(race)¸¦ ¹æÁöÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» »ç¿ëÇؾ߸¸ ÇÑ´Ù.

if (del_timer(&ct->timeout))
	ct->timeout.function((unsigned long)ct);
								

new

ÆÐŶÀÌ ÃÖÃÊ·Î ¿¬°áÀ» ¸ÎÀ» ¶§ È£ÃâµÇ´Â ÇÔ¼ö·Î, ctinfo ÀÎÀÚ´Â ¾ø´Ù. ±× ÀÌÀ¯´Â ÃÖÃÊÀÇ ÆÐŶÀº Á¤ÀÇ¿¡ ÀÇÇØ ctinfo IP_CT_NEWÀ̱⠶§¹®ÀÌ´Ù. ¿¬°áÀ» ¸Î´Âµ¥ ½ÇÆÐÇϸé 0À» µ¹·ÁÁÖ°í, ¼º°øÇÑ °æ¿ì´Â ¼ø°£ÀûÀ¸·Î connection timeoutÀ» µ¹·ÁÁØ´Ù.

Äڵ带 ÀÛ¼ºÇÏ°í »õ·Î¿î ÇÁ·ÎÅäÄÝ¿¡ ´ëÇÑ ÃßÀûÀ» Å×½ºÆ® ÇßÀ¸¸é, ÀÌÁ¦´Â NAT¿¡°Ô ÀÌ·¯ÇÑ °ÍÀ» ¾î¶»°Ô Çؼ®ÇÒ °ÍÀÎÁö¸¦ ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. ´Ù½Ã ¸»ÇÏ¸é »õ·Î¿î ¸ðµâÀ» ÀÛ¼ºÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. Áï, NAT Äڵ忡 ´ëÇÑ È®Àå ¹× `ip_nat_protocol_register()'·Î Àü´ÞÇÏ°íÀÚ ÇÏ´Â `ip_nat_protocol' ±¸Á¶Ã¼¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.

list

{ NULL, NULL }·Î ¼³Á¤ÇÑ´Ù. ¸®½ºÆ®¸¦ È®º¸ÇÑ´Ù.

name

»ç¿ëÀÚ°¡ º¸°Ô µÉ ÇÁ·ÎÅäÄÝ ¸íĪÀÌ´Ù. »ç¿ëÀÚ °ø°£¿¡ ÀÚµ¿À¸·Î ·Îµù µÇ±â À§Çؼ­´Â `/etc/protocols'¿¡ ÀÖ´Â ¸íĪÀ» »ç¿ëÇÏ´Â °ÍÀÌ Á¦ÀÏ ÁÁ´Ù.

protonum

ÇÁ·ÎÅäÄÝ ¹øÈ£À̸ç ÀÚ¼¼ÇÑ °ÍÀº `/etc/protocols'¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.

manip_pkt

connection trackingÀÇ pkt_to_tuple ÇÔ¼öÀÇ ´Ù¸¥ ¹ÝÂÊÀ¸·Î, ``tuple_to_pkt''¶ó°í »ý°¢Çصµ ¹«¹æÇÏ´Ù. ¾à°£ ´Ù¸£°Ô °í·ÁÇØ¾ß ÇÒ Á¡Àº ´ÙÀ½°ú °°´Ù. IP Çì´õÀÇ ½ÃÀÛÀ§Ä¡¿¡ ´ëÇÑ Æ÷ÀÎÅÍ¿Í Àüü ÆÐŶÀÇ ±æÀ̸¦ ¾ò´Â´Ù´Â Á¡À¸·Î, ÀϺΠÇÁ·ÎÅäÄÝ(UDP, TCP)ÀÌ IP Çì´õ¸¦ ¾Ë¾Æ¾ß ÇÒ ÇÊ¿ä°¡ Àֱ⠶§¹®ÀÌ´Ù. ÆÐŶ Àüü°¡ ¾Æ´Ñ tuple(Áï, ``src'' Çʵå)·ÎºÎÅÍ ip_nat_tuple_manip Çʵå¿Í ¼öÇàÇÏ°íÀÚ Çϴ ó¸®¿¡ ´ëÇÑ Å¸ÀÔÀ» ¹Þ¾Æ¿À°Ô µÈ´Ù.

in_range

ÁÖ¾îÁø ÆÐŶÀÇ Ã³¸® °¡´ÉÇÑ ºÎºÐÀÌ ÁÖ¾îÁø ¹üÀ§¿¡ ¼ÓÇØÀÖ´Â Áö¸¦ ¾Ë·ÁÁÖ´Â ÇÔ¼öÀÌ´Ù. bit tricky ÇÔ¼ö·Î, tuple¿¡ Àû¿ëÇÒ Ã³¸® ŸÀÔ(manipulation type)À» µ¹·ÁÁÖ¸ç, ¹üÀ§¸¦ ¾î¶»°Ô Çؼ®ÇÒ °ÍÀÎ °¡, Áï ó¸®ÇÏ°íÀÚ ÇÏ´Â °ÍÀÌ ¼Ò½º ¹üÀ§ÀÎÁö ¸ñÀûÁö ¹üÀ§Àΰ¡ ÇÏ´Â °¡¸¦ ¾Ë·ÁÁØ´Ù.

±âÁ¸ÀÇ ¸ÊÇÎÀÌ ¿Ã¹Ù¸¥ ¹üÀ§¿¡ ¼ÓÇØ ÀÖ´Â Áö È®ÀÎÇÏ´Â µ¥ »ç¿ëµÇ¸ç, ¶ÇÇÑ ÀüÇô ó¸®ÇÒ ÇÊ¿ä°¡ ¾ø´Â Áö È®ÀÎÇÏ´Â µ¥ »ç¿ëÇÑ´Ù.

unique_tuple

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À» µ¹·ÁÁØ´Ù.

print

¹®ÀÚ¹öÆÛ¿Í ¹üÀ§°¡ ÁÖ¾îÁø °æ¿ì, ±× ¹üÀ§ÀÇ per-protocol ºÎºÐÀ» Ãâ·ÂÇÏ°í, »ç¿ëµÈ ¹öÆÛÀÇ ±æÀ̸¦ µ¹·ÁÁØ´Ù. IP_NAT_RANGE_PROTO_SPECIFIED Ç÷¢ÀÌ ÁÖ¾îÁø ¹üÀ§¿¡ ´ëÇØ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é È£ÃâµÇÁö ¾Ê´Â´Ù.


1.4.3. »õ·Î¿î NAT Targets

¸Å¿ì Èï¹Ì·Î¿î ºÎºÐÀ¸·Î, »õ·Î¿î ¸ÊÇΠŸÀÔÀ» Á¦°øÇÏ´Â »õ·Î¿î NAT targetÀ» ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ±âº» ÆÐÅ°Áö¿¡´Â Ãß°¡ targetÀº MASQUERADE¿Í REDIRECTÀ¸·Î »õ·Î¿î NAT targetÀ» ÀÛ¼ºÇϱ⿡ ÃæºÐÇϸ® ¸¸Å­ ½±°Ô ¼³¸íµÇ¾î ÀÖ´Ù.

À§ÀÇ µÎ targetÀº ´Ù¸¥ iptables targetó·³ ÀÛ¼ºµÇ¾î ÀÖÁö¸¸, ³»ºÎÀûÀ¸·Î´Â connectionÀ» ÃßÃâÇÏ°í `ip_nat_setup_info()'¸¦ È£ÃâÇÑ´Ù.


1.4.4. ÇÁ·ÎÅäÄÝ µµ¿ì¹Ì(protocol helper)

connection tracking¿¡ ´ëÇÑ protocol helper´Â connection code°¡ ´ÙÁß ³×Æ®¿÷ connectionÀ» »ç¿ëÇÏ´Â ÇÁ·ÎÅäÄÝÀ» ¾Ë¾ÆÂ÷¸®°í Ãʱ⠿¬°á¿¡ °ü·ÃµÈ `child' connectionÀ» Ç¥½ÃÇÒ ¼ö ÀÖµµ·Ï Çϸç, ÀϹÝÀûÀ¸·Î ÀÌ¿Í °°Àº °úÁ¤Àº data stream ¿ÜºÎÀÇ °ü·ÃµÈ ÁÖ¼Ò¸¦ ÀÐÀ½À¸·Î½á ¼öÇàµÈ´Ù.

NAT¿¡ ´ëÇÑ protocol helper´Â ´ÙÀ½°ú °°Àº µÎ °¡Áö ÀÛ¾÷À» ¼öÇàÇÑ´Ù. ù °·Î´Â NAT Äڵ尡 µ¥ÀÌÅÍ ½ºÆ®¸²À» Æ÷ÇÔÇÏ´Â ÁÖ¼Ò¸¦ º¯°æÇϵµ·Ï µ¥ÀÌÅÍ ½ºÆ®¸²À» ó¸®ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. µÎ ¹ø°·Î´Â µ¥ÀÌÅÍ ½ºÆ®¸²ÀÌ µé¾î¿Ã ¶§ ±×¿Í ¿¬°üµÈ connection¿¡ ´ëÇÏ¿© ¿ø·¡ÀÇ connectionÀ» ±âÃÊ·Î ÇÏ¿© NAT¸¦ ¼öÇàÇÑ´Ù.


1.4.5. ¿¬°á ÃßÀû µµ¿ì¹Ì ¸ðµâ(Connection Tracking Helper Modules)

1.4.5.1. ¼³¸í

connection tracking ¸ðµâÀÇ ÀÓ¹«´Â ¾î¶² ÆÐŶÀÌ ÀÌ¹Ì ÀÌ·ç¾îÁø connection¿¡ ¼ÓÇØ ÀÖ´Â Áö¸¦ ¸í½ÃÇÏ´Â °ÍÀ¸·Î, ´ÙÀ½°ú °°Àº ÀÏÀ» ÇÑ´Ù.

  • ¿ì¸® ¸ðµâÀÌ ¾î¶² ÆÐŶ¿¡ °ü½ÉÀ» °¡Áö°í ÀÖ´Â °¡¸¦ netfilter¿¡°Ô ¾Ë·ÁÁØ´Ù.(´ëºÎºÐÀÇ helper´Â ƯÁ¤ÇÑ Æ÷Æ®¿¡ ´ëÇØ ÀÛ¾÷À» ÇÑ´Ù.)

  • netfilter¿¡ ÇÔ¼ö¸¦ µî·ÏÇÑ´Ù. ¾Õ¼­ ¾ð±ÞÇÑ ¹üÁÖ¿¡ ¼ÓÇÏ´Â ¸ðµç ÆÐŶ¿¡ ´ëÇÏ¿© µî·ÏµÈ ÇÔ¼ö°¡ È£ÃâµÈ´Ù.

  • µî·ÏµÈ °÷À¸·ÎºÎÅÍ È£ÃâµÇ´Â `ip_conntrack_expect_related()' ÇÔ¼ö´Â netfilter¿¡°Ô ¿¬°üµÈ connectionÀ» ¿¹ÃøÇÒ ¼ö ÀÖµµ·Ï ¾Ë·ÁÁØ´Ù.


1.4.5.2. »ç¿ë°¡´ÉÇÑ ±¸Á¶Ã¼¿Í ÇÔ¼ö

¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ Ä¿³Î ¸ðµâÀÇ init ÇÔ¼ö´Â `struct ip_conntrack_helper'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °¡Áö°í `ip_conntrack_helper_register()' ÇÔ¼ö¸¦ È£ÃâÇؾ߸¸ ÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº Çʵ带 °¡Áö°í ÀÖ´Ù.

list

¸µÅ©µå ¸®½ºÆ®¿¡ ´ëÇÑ Çì´õ·Î, ³ÝÇÊÅÍ°¡ ³»ºÎÀûÀ¸·Î ´Ù·ç´Â ¸®½ºÆ®ÀÌ´Ù. `{ NULL, NULL}'·Î ÃʱâÈ­½ÃŲ´Ù.

tuple

`struct ip_conntrack_tuple'·Î, ¿ì¸®°¡ ÀÛ¼ºÇÑ conntrack helper ¸ðµâÀÌ °ü½ÉÀ» °®´Â ÆÐŶÀ» ¸í½ÃÇÑ °ÍÀÌ´Ù.

mask

¿ª½Ã `struct ip_conntrack_tuple'À̸ç, tupleÀÇ ¾î´À ºñÆ®°¡ À¯È¿ÇÑÁö¸¦ ¸í½ÃÇÏ°í ÀÖ´Â ¸Å½ºÅ©ÀÌ´Ù.

help

tuple+mask¿¡ ºÎÇÕÇÏ´Â °¢ ÆÐŶ¿¡ ´ëÇÏ¿© ³ÝÇÊÅÍ°¡ È£ÃâÇؾßÇÏ´Â ÇÔ¼öÀÌ´Ù.


1.4.6. conntrack µµ¿ì¹Ì ¸ðµâÀÇ ¿¹Á¦

#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);
}
				


1.4.7. NAT µµ¿ì¹Ì ¸ðµâ

1.4.7.1. ¼³¸í

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)


1.4.7.2. »ç¿ë°¡´ÉÇÑ ±¸Á¶Ã¼¿Í ÇÔ¼ö

¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ nat helper ¸ðµâÀÇ `init()' ÇÔ¼ö´Â `struct ip_nat_helper'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ÇÏ¿© `ip_nat_helper_register()' ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ÀÎÀÚ°¡ µÇ´Â ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº ¸â¹ö º¯¼ö¸¦ Æ÷ÇÔÇÑ´Ù.

list

netfilter¿¡¼­ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ´Â list Çì´õ·Î { NULL, NULL }·Î ÃʱâÈ­½ÃŲ´Ù.

tuple

`struct ip_conntrack_tuple'·Î, ¿ì¸®°¡ ÀÛ¼ºÇÑ NAT helper°¡ °ü½ÉÀ» °®´Â ÆÐŶÀ» ¸í½ÃÇÑ °ÍÀÌ´Ù.

mask

`struct ip_conntrack_tuple'À̸ç, tupleÀÇ ¾î´À ºñÆ®°¡ À¯È¿ÇÑÁö¸¦ netfilter¿¡°Ô ¾Ë·ÁÁØ´Ù.

help

tuple+mask¿¡ ºÎÇÕÇÏ´Â °¢ ÆÐŶ¿¡ ´ëÇÏ¿© È£ÃâÇؾßÇÏ´Â ÇÔ¼öÀÌ´Ù.

name

NAT help·Î ±¸º°ÀÌ µÇ´Â À¯ÀÏÇÑ name

ÀÌ»óÀº connection tracking helper¸¦ ÀÛ¼ºÇÏ´Â ¹æ¹ý°ú ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. ÀÌÁ¦ ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ ¸ðµâÀº `ip_nat_register()' ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¿¹ÃøµÇ´Â ÀÓÀÇÀÇ connectionÀÇ NAT¸¦ ó¸®ÇÒ Áغñ°¡ µÇ¾î ÀÖ´Ù°í ¸»ÇÒ ¼ö ÀÖ´Ù. À̶§, `ip_nat_register()' ÇÔ¼ö´Â `struct ip_nat_expect'¸¦ ÀÎÀÚ·Î ÃëÇÏ°Ô µÇ¸ç, ±× ¸â¹ö º¯¼ö´Â ´ÙÀ½°ú °°´Ù.

list

netfilter¿¡¼­ ³»ºÎÀûÀ¸·Î »ç¿ëÇÏ´Â list Çì´õ·Î { NULL, NULL }·Î ÃʱâÈ­½ÃŲ´Ù.

expect

¿¹°ßµÈ connection¿¡ ´ëÇÏ¿© NAT¸¦ ¼öÇàÇÏ´Â ÇÔ¼öÀÌ´Ù. connectionÀ» ó¸®Çϸé true¸¦ ¸®ÅÏÇÏ°í, ´ÙÀ½¿¡ µî·ÏµÈ expect ÇÔ¼ö°¡ È£ÃâµÇ¾î ÆÐŶÀ» ó¸®ÇÒ ¼ö ÀÖ´Â Áö °Ë»çÇÏ°Ô µÈ´Ù. true°¡ ¸®ÅÏµÈ °æ¿ì, ÀÌ ÇÔ¼ö´Â ¹Ýµå½Ã ÆÇ°á(verdict)À» ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù.


1.4.7.3. NAT µµ¿ì¹Ì ¸ðµâ ¿¹Á¦

#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);
}
					


1.5. NetfilterÀÇ ÀÌÇØ

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 Ç÷¢À» ¼³Á¤Çϱ⸸ ÇÏ¸é µÈ´Ù.


1.6. »õ·Î¿î Netfilter ¸ðµâ ÀÛ¼º

1.6.1. Netfilter ÈÅ¿¡ ¿¬°áÇϱâ

Ä¿³Î ³»ºÎ¿¡¼­ ÆÐŶÀ» ÁÙÀ̰ųª Á¶°¢³»±â À§Çؼ­´Â `nf_register_hook' ÇÔ¼ö¿Í `nf_unregister_hook' ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ÀÌµé °¢°¢Àº ´ÙÀ½°ú °°Àº Çʵ带 Æ÷ÇÔÇÏ´Â `struct nf_hook_ops'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ÃëÇÑ´Ù.

list

¸µÅ©µå ¸®½ºÆ®·Î `{ NULL, NULL }'·Î ¼³Á¤µÈ´Ù.

hook

ÆÐŶÀÌ ÀÌ ÈÅ Æ÷ÀÎÆ®¿¡ °É¸®¸é È£ÃâµÇ´Â ÇÔ¼ö·Î, NF_ACCEPT, NF_DROP ¶Ç´Â NF_QUEUE Áß Çϳª¸¦ ¹Ýµå½Ã ¸®ÅÏ ÇØ¾ß ÇÑ´Ù. NF_ACCEPTÀÎ °æ¿ì´Â ÇöÀçÀÇ Æ÷ÀÎÅÍ ´ÙÀ½¿¡ ¿À´Â ÈÅÀÌ È£ÃâµÈ´Ù. NF_DROPÀÎ °æ¿ì´Â ÆÐŶÀÌ DROPµÇ°í, NF_QUEUEÀÎ °æ¿ì´Â ´ë±â¿­·Î µé¾î °£´Ù. skb Æ÷ÀÎÅÍ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µ¹·Á ¹Þ¾Æ¼­ ¿øÇÏ´Â °æ¿ì¿¡´Â skb¸¦ ÀüºÎ ¹Ù²Ù¾î ¹ö¸± ¼öµµ ÀÖ´Ù.

flush

ÇöÀç´Â »ç¿ëÇÏÁö ¾Ê°í ÀÖ´Ù. ij½¬°¡ Áö¿öÁö´Â °æ¿ì ÆÐŶ ÀûÁß·üÀ» Àü´ÞÇϱâ À§ÇØ ¼³°èµÇ¾úÀ¸³ª, ÀüÇô ±¸ÇöµÉ ÀÏÀÌ ¾øÀ» °ÍÀÌ´Ù. ±×³É NULL·Î ¼³Á¤Çϱ⠹ٶõ´Ù.

pf

ÇÁ·ÎÅäÄÝ Æйи®, Áï IPv4¿¡ ´ëÇؼ­´Â `PF_INET'ÀÌ µÈ´Ù.

hooknum

°ü½ÉÀ» °¡Áö°í ÀÖ´Â ÈÅÀÇ ¼ö, Áï `NF_IP_LOCAL_OUT'ÀÌ´Ù.


1.6.2. Å¥µÈ ÆÐŶÀÇ Ã³¸®

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'¸¦ »ìÆ캸¸é, ÆÐŶ¿¡ ´ëÇÑ ºÎ°¡ÀûÀÎ Á¤º¸, Áï ÆÐŶÀÌ Á¸ÀçÇß´ø ÀÎÅÍÆäÀ̽º¿Í ÈÅ °°Àº °ÍÀ» ¾òÀ» ¼ö ÀÖ´Ù.


1.6.3. »ç¿ëÀÚ °ø°£À¸·ÎºÎÅÍ ¸í·É¾î Àü´Þ¹Þ±â

NetfilterÀÇ ±¸¼º¿ä¼ÒµéÀÌ »ç¿ëÀÚ°ø°£°ú »óÈ£ÀÛ¿ëÀ» ÇÊ¿ä·Î ÇÑ´Ù´Â °ÍÀº ¾ÆÁÖ ´ç¿¬ÇÑ ÀÏÀÌ´Ù. ¹æ¹ýÀº setsockopt ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇÏ¿© ÀÌ·± ÀÛ¿ëÀ» ±¸ÇöÇÒ ¼ö ÀÖ´Ù. ¿©±â¼­ ÁÖÀÇÇÒ Á¡Àº °¢ ÇÁ·ÎÅäÄÝÀÌ ÀÌÇØÇÏÁö ¸øÇÏ´Â setsockopt ³Ñ¹ö¿¡ ´ëÇØ Nf_setsockop()¸¦ È£ÃâÇÒ ¼ö ÀÖµµ·Ï °¢ ÇÁ·ÎÅäÄÝÀÌ ¼öÁ¤µÇ¾î¾ß¸¸Çϸç, ÀÌ´Â IPv4±îÁö ÀÌ°í, IPv6¿Í DECnetÀº ÀÌ¹Ì º¯°æµÇ¾î ÀÖ´Ù.

ÃÖ±Ù¿¡ ¾Ë·ÁÁø ±â¼úÀ» »ç¿ëÇϸé, nf_register_sockopt() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© `struct nf_sockopt_ops'¸¦ µî·ÏÇϸç, ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº Çʵå·Î ±¸¼ºµÇ¾î ÀÖ´Ù.

list

¸µÅ©µå ¸®½ºÆ®¸¦ »ç¿ëÇϱâ À§ÇÑ °ÍÀ¸·Î, `{ NULL, NULL }'·Î ¼³Á¤µÈ´Ù.

get_optmin, get_optmax

ó¸®ÇØ¾ß ÇÒ getsockoptÀÇ °³¼öÀÇ ¹üÀ§¸¦ ÁöÁ¤ÇÑ´Ù. Áï 0°ú 0À» »ç¿ëÇϸé ó¸®ÇØ¾ß ÇÒ getsockoptÀÇ °³¼ö°¡ ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.

get

»ç¿ëÀÚµéÀÌ ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ getsockopt Áß Çϳª¸¦ È£ÃâÇÑ °æ¿ì È£ÃâµÇ´Â ÇÔ¼öÀÌ´Ù. ÀÌ ÇÔ¼ö ³»ºÎ¿¡¼­ »ç¿ëÀÚµéÀÌ NET_ADMINÀÇ ±ÇÇÑÀ» °¡Áö°í ÀÖ´Â Áö È®ÀÎÇØ¾ß ÇÑ´Ù.

³ª¸ÓÁö µÎ°³ÀÇ Çʵå´Â ³»ºÎÀûÀ¸·Î »ç¿ëµÈ´Ù.


1.7. »ç¿ëÀÚ °ø°£¿¡¼­ ÆÐŶ ó¸®

libipq ¶óÀ̺귯¸®¿Í `ip_queue' ¸ðµâÀ» »ç¿ëÇϸé, Ä¿³Î¿¡¼­ ÇÒ ¼ö ÀÖ´Â ´ëºÎºÐÀÇ °ÍµéÀ» »ç¿ëÀÚ °ø°£¿¡¼­ ¼öÇàÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀÌ ´ÙÀ½°ú °°Àº °ÍÀ» ÀǹÌÇÑ´Ù. ¼Óµµ¿¡ ´ëÇÑ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù¸é, »ç¿ëÀÚ °ø°£¿¡¼­ ¿ÏÀüÈ÷ ¿©·¯ºÐµé¸¸ÀÇ Äڵ带 °³¹ßÇÒ ¼ö ÀÖ´Ù. °³¹ßÇÏ°íÀÚ ÇÏ´Â ¿©·¯ºÐµéÀÌ Å« ´ë¿ªÀ» ÇÊÅ͸µ ÇÏ°íÀÚ ÇÏÁö¸¸ ¾Ê´Â´Ù¸é, Ä¿³Î ³»ºÎÀÇ ÆÐŶ ¸Í±Û¸µ¿¡ ºñÇØ ÀÌ ¹æ¹ýÀÌ ¿ùµîÇÏ´Ù´Â °ÍÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù.

netfilter ÃÊâ±â¿¡, ÇÊÀÚ´Â iptablesÀÇ Ãʱ⠹öÀüÀ» Æ÷Æà ÇÏ¿© À̸¦ Áõ¸íÇÏ¿´´Ù. netfilter´Â, °³¹ßÀÚµéÀÌ ¿øÇÏ´Â ¾ð¾î°¡ ¹«¾ùÀÌ´ø °£¿¡, °³¹ßÀÚ ÀÚ½ÅÀÇ ÄÚµå¿Í °íÈ¿À²ÀÇ ³Ý¸Í±Û¸µ ¸ðµâÀ» °³¹ßÇÏ°íÀÚ ÇÏ´Â »ç¶÷µé¿¡°Ô ¿ÀÇ µÇ¾î ÀÖ´Ù.


2. Ä¿³Î 2.0/2.2 ÆÐŶ ÇÊÅÍ ¸ðµâ º¯È¯

Æ÷ÆÃÀ» ¾ÆÁÖ ½±°Ô ÇÒ ¼ö ÀÖ´Â ´Ü¼øÇÑ °èÃþ¿¡ ´ëÇؼ­´Â ip_fw_compat.c¸¦ º¸±â ¹Ù¶õ´Ù.


3. ÅͳΠÄÚµå °³¹ßÀÚ¸¦ À§ÇÑ Netfilter ÈÅ

Tunnel µå¶óÀ̹ö Á¦ÀÛÀÚµéÀº 2.4 Ä¿³Î¿¡ ´ëÇؼ­´Â ´ÙÀ½¿¡ º¸ÀÌ´Â ´Ü¼øÇÑ µÎ°³ÀÇ ±ÔÄ¢À» µû¸£±â ¹Ù¶õ´Ù.

  • ÆÐŶÀ» ÀνÄÇÒ ¼ö ¾øµµ·Ï ÇÏ·Á¸é skb->nfct¸¦ ¸±¸®Áî ÇؾßÇÑ´Ù(Áï, decapsulating/encapsulating). ¸¸ÀÏ ÆÐŶÀ» *new* skb·Î °¨½ÎÁö ¾ÊÀ¸·Á¸é ¸±¸®Á ÇÏÁö ¾Ê¾Æµµ µÇÁö¸¸, ÀûÀýÇÑ °÷¿¡¼­ ¼öÇàÇÏ°íÀÚ ÇÑ´Ù¸é, ¹Ýµå½Ã ¸±¸®Áî ÇØ¾ß ÇÑ´Ù.

    ±×·¸Áö ¾ÊÀº °æ¿ì´Â, NAT ÄÚµå´Â ÆÐŶÀ» ¸Í±ÛÇϱâ À§ÇØ °ú°ÅÀÇ connection tracking Á¤º¸¸¦ ÀÌ¿ëÇÒ °ÍÀÌ°í, ÀÌ·Î ÀÎÇØ ¼ø¼­°¡ ¾û¸ÁÀÌ µÉ °ÍÀÌ´Ù.

  • encapsulated ÆÐŶÀº ¹Ýµå½Ã LOCAL_OUT ÈÅÀ» Åë°úÇϵµ·Ï ÇؾßÇϸç, decapsulated ÆÐŶÀº PRE_ROUTING ÈÅÀ» Åë°úÇؾ߸¸ ÇÑ´Ù. À̸¦ ¼öÇàÇϱâ À§ÇØ ´ëºÎºÐÀÇ tunnelÀº ip_rcv()¸¦ »ç¿ëÇÑ´Ù.

    ±×·¸Áö ¾ÊÀº °æ¿ì´Â, »ç¿ëÀÚµéÀÌ tunnelÀ» ÀÌ¿ëÇÏ¿© ¿øÇÏ´Â ´ë·Î ÇÊÅ͸µÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù.

ù ¹ø°¸¦ ¼öÇàÇϴ ǥÁØ ¹æ¹ýÀº ÆÐŶÀ» wrapÇϰųª unwrapÇϱâ Àü¿¡ ´ÙÀ½°ú À¯»çÇÑ Äڵ带 »ðÀÔÇÏ´Â °ÍÀÌ´Ù.

	/* Tell the netfilter framework that this packet is not the
          same as the one before! */
#ifdef CONFIG_NETFILTER
	nf_conntrack_put(skb->nfct);
	skb->nfct = NULL;
#ifdef CONFIG_NETFILTER_DEBUG
	skb->nf_debug = 0;
#endif
#endif
		

µÎ ¹ø°¸¦ ¼öÇàÇϱâ À§ÇØ ÇÊ¿ä·Î ÇÏ´Â °ÍÀº »õ·ÎÀÌ encapsulatedµÈ ÆÐŶÀÌ ``ip_send()''·Î µé¾î°¡´Â À§Ä¡¸¦ ã¾Æ³»°í, À̸¦ ´ÙÀ½°ú °°Àº °ÍÀ¸·Î ´ëüÇÏ´Â °ÍÀÌ´Ù.

	/* Send "new" packet from local host */
	NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev, ip_send);
		

´ÙÀ½¿¡ º¸ÀÎ ·êÀÌ ÀǹÌÇÏ´Â °ÍÀº tunnel ¹Ú½º¿¡ ÆÐŶ ÇÊÅ͸µ ·êÀ» Àû¿ëÇÏ°íÀÚ ÇÏ´Â »ç¶÷ÀÌ tunnel µÇ°í ÀÖ´Â ÆÐŶ¿¡ ´ëÇØ ´ÙÀ½°ú °°Àº ÀýÂ÷¸¦ º¸°Ô µÉ °ÍÀÌ´Ù.

  1. FORWARD hook : normal packet (from eth0 -> tunl0)

  2. LOCAL_OUT hook : encapsulated packet (to eth1)

ÀÀ´ä ÆÐŶ¿¡ ´ëÇؼ­´Â

  1. LOCAL_IN hook: encapsulated reply packet (from eth1)

  2. FORWARD hook: reply packet (from eth1 -> eth0).


4. ½ÃÇèµµ±¸(Test Suite)

test suite´Â CVS ÀúÀå¼Ò¿¡ ÀÖÀ¸¸ç, test suite°¡ Àû¿ëµÇ´Â ¹üÀ§°¡ ³ÐÀ» ¼ö·Ï, ¿©·¯ºÐÀÇ Äڵ尡 ¿Àµ¿ÀÛÀ» ÇÏ´Â °æ¿ì°¡ °ÅÀÇ ¾øÀ» ¼ö ÀÖ´Ù´Â ÀڽۨÀº ´õ Ä¿Áö°Ô µÈ´Ù. »ç¼ÒÇÑ Å×½ºÆ®(trivial test)´Â »ó´çÈ÷ ¾î·Á¿î Å×½ºÆ®(tricky test) ¸¸Å­À̳ª Áß¿äÇϸç, ÀÌ´Â º¹ÀâÇÑ ½ÃÇèÀ» ´Ü¼øÈ­ÇÑ °ÍÀÌ »ç¼ÒÇÑ Å×½ºÆ®À̱⠶§¹®ÀÌ´Ù. ÀÏ´Ü º¹ÀâÇÑ Å×½ºÆ®¸¦ ¼öÇàÇϱâ Àü¿¡ ±âº»ÀûÀÎ ÀÛ¾÷Àº ¸¸Á·ÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö Àֱ⠶§¹®ÀÌ´Ù.

Å×½ºÆ®´Â ´Ü¼øÇϸç, ±×Àú testsuite/ÀÇ ¼­ºêµð·ºÅ丮¿¡ ÀÖ´Â ½©½ºÅ©¸³Æ®ÀÌ´Ù. ½ÇÇàµÇ´Â ¼ø¼­´Â ¾ËÆĺª ¼ø¼­´Ù. µû¶ó¼­ `01test'°¡ `02test'º¸´Ù ¸ÕÀú ½ÇÇàµÈ´Ù. ÇöÀç´Â ´Ù¼¸ °³ÀÇ Å×½ºÆ® µð·ºÅ丮°¡ ÀÖ´Ù.

00netfilter/

General netfilter framework tests.

01iptables/

iptables tests.

02conntrack/

connection tracking test.

03NAT/

NAT tests.

04ipchains-compat/

ipchains/ipfwadm compatibility tests.

testsuite/ µð·ºÅ丮 ³»ºÎ¿¡´Â `test.sh'¶ó´Â ½© ½ºÅ©¸³Æ®°¡ Á¸ÀçÇϸç, µÎ°³ÀÇ ´õ¹Ì ÀÎÅÍÆäÀ̽º(tap0¿Í tap1)¸¦ ±¸¼ºÇÏ¿©, forwardingÀ» on ½ÃÅ°°í, ¸ðµç netfilter ¸ðµâÀ» Á¦°ÅÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ±×¸®°í ³ª¼­ ÇÏÀ§ µð·ºÅ丮¿¡ Á¸ÀçÇÏ´Â ¸ðµç ½© ½ºÅ©¸³Æ®¸¦ ¼öÇàÇÏ´Â µ¥ ÀÌÁß Çϳª¶óµµ ¿À·ù°¡ ¹ß»ýÇÏ¸é ¼öÇàÀ» ¸ØÃß°Ô µÈ´Ù. `test.sh'´Â µÎ°³ÀÇ ¿É¼ÇÀ» ³Ñ°Ü¹ÞÀ» ¼ö ÀÖ´Â µ¥, `-v'´Â ¼öÇàÇÏ´Â °¢°¢ÀÇ Å×½ºÆ®¸¦ Ãâ·ÂÇϸç, Ãß°¡ÀûÀÎ test À̸§ÀÌ ÁÖ¾îÁö¸é ÇØ´çÇÏ´Â Å×½ºÆ®°¡ ¹ß°ßµÉ ¶§±îÁö ´Ù¸¥ Å×½ºÆ®´Â ¸ðµÎ °Ç³Ê¶Ù°Ô µÈ´Ù.


4.1. Å×½ºÆ®¸¦ À§ÇÑ ½ºÅ©¸³Æ® ÀÛ¼º

¿ì¼± Àû´çÇÑ µð·ºÅ丮¿¡ »õ·Î¿î ÆÄÀÏÀ» »ý¼ºÇÏ°í, ÀûÀýÇÑ ½Ã±â¿¡ ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï ¹øÈ£¸¦ ºÎ¿©ÇÑ´Ù. ¿¹¸¦ µé¾îº¸¸é, ICMP reply tracking (02conntrack/02reply.sh)À» Å×½ºÆ®Çϱâ À§Çؼ­´Â ¿ÜºÎ·Î ³ª°¡´Â ICMP°¡ ÀûÀýÇÏ°Ô ÃßÀûµÇ°í ÀÖ´Â Áö¸¦ ¸ÕÀú È®ÀÎÇؾßÇÑ´Ù(02conntrack/01simple.sh).

ÀÛÀº Å©±âÀÇ ÆÄÀÏÀ» ¸¹ÀÌ ¸¸µé¾î¼­, °¢°¢ÀÇ ÆÄÀÏÀº ÇÑ °¡Áö ºÐ¾ß¸¸ ´ã´çÇϵµ·Ï ÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀ̸ç, ±× ÀÌÀ¯´Â testsuite¸¦ ½ÇÇà½ÃŲ »ç¶÷µéÀÌ ¹®Á¦¸¦ Áï°¢ ¾Ë¾Æ ³¾ ¼ö ÀÖµµ·Ï ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

Å×½ºÆ® µµÁß ¹®Á¦°¡ ¹ß»ýÇϸé, ±×³É `exit 1'À» ÇÏ¸é µÇ°í, ±×·¯¸é failure°¡ ¹ß»ýÇÑ´Ù. Áï, ¿©·¯ºÐµéÀÌ ¹®Á¦°¡ ¹ß»ýÇÑ °ÍÀ» °¨ÁöÇÒ ¼ö ÀÖ°Ô µÇ¸é, ÀûÀýÇÑ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¹®Á¦°¡ ¹ß»ýÇÏÁö ¾Ê¾Ò´Ù¸é, `exit 0'·Î Á¾·áÇÏ¸é µÈ´Ù. ½ºÅ©¸³Æ®ÀÇ ÃÖ»óÀ§¿¡¼­ `set -e'¸¦ »ç¿ëÇϰųª, °¢ ¸í·ÉÀÇ ¸¶Áö¸·¿¡ `|| exit 1'À» Ãß°¡ÇÏ¿© °¢ ¸í·ÉÀÇ ¼º°ø¿©ºÎ¸¦ È®ÀÎÇØ¾ß ÇÑ´Ù.

helper ÇÔ¼öÀÎ `load_module'¿Í `remove_module'´Â ¸ðµâÀ» ¿Ã¸®°Å³ª ³»¸®´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â µ¥, Ưº°È÷ Å×½ºÆ®¶ó°í ÁöÁ¤ÇÏÁö ¾Ê´Â ÇÑ testsuite¿¡¼­´Â autoloadingÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.


4.2. º¯¼ö¿Í ȯ°æ

ÀÏ´Ü tap0¿Í tap1À̶ó´Â µÎ°³ÀÇ ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í ÀÖ´Ù. °¢ ÀÎÅÍÆäÀ̽ºÀÇ ÁÖ¼Ò´Â $TAP0¿Í $TAP1À̶ó´Â º¯¼ö¿¡ ÀúÀåµÇ¾î ÀÖÀ¸¸ç, ³Ý¸Å½ºÅ©´Â ¸ðµÎ 255.255.255.0ÀÌ´Ù. networkÀº $TAP0NET°ú $TAP1NET¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.

$TMPFILEÀº ÀÓ½ÃÆÄÀÏ·Î, Å×½ºÆ®°¡ Á¾·áµÇ´Â ½ÃÁ¡¿¡¼­ »èÁ¦µÈ´Ù.

¿©·¯ºÐÀÇ ½ºÅ©¸³Æ®´Â testsuite/ µð·ºÅ丮ºÎÅÍ ½ÃÀÛÇؼ­, ½ºÅ©¸³Æ®°¡ Á¸ÀçÇÏ´Â ¸ðµç µð·ºÅ丮¸¦ ã¾Æ°¡°Ô µÈ´Ù. Áï ¿©·¯ºÐµéÀº iptables°°Àº µµ±¸¸¦ ½ÇÇà½ÃÅ°±â À§Çؼ­´Â `../userspace'·Î ½ÃÀÛÇÏ´Â path¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

$VERBOSE¸¦ ¼³Á¤ÇØ ³õÀ¸¸é ¿©·¯ºÐÀÇ ½ºÅ©¸³Æ®´Â º¸´Ù ¸¹Àº Á¤º¸¸¦ Ãâ·ÂÇϰԵȴÙ. Áï, command line¿¡¼­ `-v' ¿É¼ÇÀ» ÁØ °Í°ú µ¿ÀÏÇÑ È¿°ú°¡ µÈ´Ù.


4.3. À¯¿ëÇÑ µµ±¸µé

``tools'' µð·ºÅ丮¿¡´Â ¾µ¸¸ÇÑ testsuite µµ±¸°¡ ¸î °³ ÀÖÀ¸¸ç, °¢ µµ±¸´Â ¹®Á¦°¡ ¹ß»ýÇÑ °æ¿ì non-zero exit status¸¦ ¹ß»ý½ÃÅ°¸ç Á¾·áÇÑ´Ù.


4.3.1. gen_ip

IP ÆÐŶÀ» »ý¼ºÇÏ´Â ÇÔ¼ö·Î, IP ÆÐŶÀ» Ç¥ÁØ ÀÔ·ÂÀ¸·Î Ãâ·ÂÇÑ´Ù. ¿©·¯ºÐµéÀº Ç¥ÁØ Ãâ·ÂÀ» /dev/tap0¿Í /dev/tap1À¸·Î Àü¼ÛÇÏ¿© tap0¿Í tap1¿¡ ÆÐŶÀ» º¸³¾ ¼ö ÀÖ´Ù. (/dev/tap0¿Í /dev/tap1ÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é testsuite°¡ ÃÖÃÊ ½ÇÇà µÉ ¶§ »ý¼ºµÈ´Ù.)

FRAG=offset,length

ÆÐŶÀ» »ý¼ºÇÏ°í, offset°ú length ¸¸Å­ ÆÐŶÀ» Á¶°¢ ³½´Ù.

MF

ÆÐŶÀÇ `More Fragments' ºñÆ®¸¦ ¼³Á¤ÇÑ´Ù.

MAC=xx:xx:xx:xx:xx:xx

ÆÐŶ¿¡ ¼Ò½º MAC ÁÖ¼Ò¸¦ ¼³Á¤ÇÑ´Ù.

TOS=tos

ÆÐŶ¿¡ ´ëÇÏ¿© TOS Çʵ带 ¼³Á¤ÇÑ´Ù. 0-255.

´ÙÀ½Àº °­Á¦ ¿É¼ÇÀÌ´Ù.

source ip

ÆÐŶÀÇ ¼Ò½º IP ÁÖ¼Ò

dest ip

ÆÐŶÀÇ ¸ñÀûÁö ÁÖ¼Ò

length

Çì´õ¸¦ Æ÷ÇÔÇÑ ÆÐŶÀÇ ±æÀÌ

protocol

ÆÐŶÀÇ ÇÁ·ÎÅäÄÝ ¹øÈ£, (¿¹: 17 = UDP)

°¢ Àü´ÞÀÎÀÚ´Â ÇÁ·ÎÅäÄÝ¿¡ µû¶ó ´Þ¶óÁø´Ù. UDP(17)ÀÎ °æ¿ì ¼Ò½º¿Í ¸ñÀûÁö Æ÷Æ® ¹øÈ£°¡ µÈ´Ù. ICMP(1)ÀÎ °æ¿ì´Â ICMP ¸Þ½ÃÁöÀÇ Äڵ尡 µÈ´Ù. ŸÀÔÀÌ 0 ¶Ç´Â 8(ping-reply ¶Ç´Â ping)ÀÎ °æ¿ì´Â, µÎ°³ÀÇ ÀÎÀÚ·Î ID¿Í sequence Çʵ尡 ´õ ÇÊ¿äÇÏ´Ù. TCPÀÎ °æ¿ì´Â ¼Ò½º¿Í ¸ñÀûÁö Æ÷Æ® ±×¸®°í Ç÷¢(``SYN'', ``SYN/ACK'', ``ACK'', ``RST'' ¶Ç´Â ``FIN'')ÀÌ ÇÊ¿äÇÏ´Ù. ¼¼°³ÀÇ Ãß°¡ ¿É¼ÇÀÌ ÀÖ´Â µ¥, ``OPT='' ´ÙÀ½¿¡´Â Äĸ¶·Î ºÐ¸®µÈ ¿É¼ÇµéÀÌ ¿À°í, ``SYN='' ´ÙÀ½¿¡´Â ½ÃÄö½º ¹øÈ£, ``ACK='' ´ÙÀ½¿¡µµ ½ÃÄö½º ¹øÈ£°¡ È£´Ù. ¸¶Áö¸·À¸·Î, ``DATA=''À̶ó´Â Ãß°¡ ¿É¼ÇÀº Ç¥ÁØÀÔ·ÂÀÇ ³»¿ëÀ» °¡µæ ä¿î TCP ÆÐŶÀÇ ºÎÇϸ¦ ÀǹÌÇÑ´Ù.


4.3.2. rcv_ip

`rcv_ip'¸¦ »ç¿ëÇϸé IP ÆÐŶÀ» º¼ ¼ö ÀÖÀ¸¸ç, °¡´ÉÇÑ get_ip·Î µé¾î¿À´Â ¿ø·¡ÀÇ °ª¿¡ °¡±õ°Ô ¸í·É Çà¿¡ Ãâ·ÂÇÑ´Ù.(fragments´Â Á¦¿Ü)

ÀÌ ÇÔ¼ö´Â ÆÐŶÀ» ºÐ¼®ÇÏ´Â µ¥ ¸Å¿ì À¯¿ëÇϸç, ´ÙÀ½°ú °°Àº °­Á¦ ¿É¼ÇÀÌ µÎ°³ ÀÖ´Ù.

wait time

Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ÆÐŶÀ» ±â´Ù¸®´Â ÃÖ´ë ½Ã°£À¸·Î ÃÊ´ÜÀ§·Î Ç¥½ÃµÈ´Ù.

iterations

¼ö½ÅÇÏ°íÀÚ ÇÏ´Â ÆÐŶÀÇ ¼ö

``DATA''¶ó´Â Ãß°¡ ¿É¼ÇÀÌ ÀÖÀ¸¸ç, ÆÐŶ Çì´õ ´ÙÀ½¿¡ ÆÐŶÀÇ ºÎÇϸ¦ Ç¥ÁØÃâ·ÂÀ¸·Î Ãâ·ÂÇÑ´Ù.

´ÙÀ½ ½ºÅ©¸³Æ®´Â `rcv_ip'¸¦ »ç¿ëÇϴ ǥÁØÀ» º¸ÀÎ °ÍÀÌ´Ù.

# Set up job control, so we can use & in shell scripts.
set -m
# Wait two seconds for one packet from tap0
../tools/rcv_ip 2 1 < /dev/tap0 > $TMPFILE &
# Make sure that rcv_ip has started running.
sleep 1
# Send a ping packet
../tools/gen_ip $TAP1NET.2 $TAP0NET.2 100 1 8 0 55 57 > /dev/tap1 || exit 1
# Wait for rcv_ip,
if wait %../tools/rcv_ip; then :
else
    echo rcv_ip failed:
    cat $TMPFILE
    exit 1
fi
				


4.3.3. get_err

Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ÆÐŶ(¿¹¸¦ µé¸é, gen_ip·Î »ý¼ºµÈ ÆÐŶ)À» ÃëÇÏ°í, ICMP ¿¡·¯·Î º¯È¯½ÃŲ´Ù.

¼¼°³ÀÇ Àü´ÞÀÎÀÚ·Î ¼Ò½º IP ÁÖ¼Ò, ŸÀÔ°ú Äڵ带 ¹Þ´Â´Ù. ¸ñÀûÁö ÀÔ·ÂÀº Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ¹ÞÀº ¼Ò½º IP ÁÖ¼Ò·Î ¼³Á¤µÈ´Ù.


4.3.4. local_ip

Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ÆÐŶÀ» ¾ò¾î¼­ raw ¼ÒÄÏÀ¸·Î Àü´ÞÇÑ´Ù. ·ÎÄÿ¡¼­ »ý¼ºµÈ ÆÐŶÀÇ ¸ð¾çÀ» º¸¿©ÁØ´Ù(ethertap ÀåÄ¡ Áß Çϳª·Î ÀÔ·ÂµÈ ÆÐŶÀ¸·ÎºÎÅÍ ºÐ¸®ÇÏ´Â °æ¿ì, ¿ÜºÎ¿¡¼­ »ý¼ºµÈ ÆÐŶó·³ º¸ÀδÙ).


4.4. »ý°¢³ª´Â ´ë·Î ÇÏ´Â Ãæ°í

¸ðµç µµ±¸´Â ÀÐ°í ¾²±â¸¦ Çѹø ÇÒ ¶§ ¸ðµç °ÍÀ» ÇÒ ¼ö ÀÖ´Ù°í °¡Á¤ÇÑ´Ù. Áï ethertap ÀåÄ¡¿¡ ´ëÇؼ­´Â »ç½ÇÀÌÁö¸¸, pipe¸¦ ÀÌ¿ëÇÏ¿© ¾à°£ º¹ÀâÇÑ ÀÛ¾÷À» ÇÒ ¶§´Â ¹Ýµå½Ã ¿Ç´Ù°í ¸»ÇÒ ¼ö´Â ¾ø´Ù.

ÆÐŶÀ» ÀÚ¸£±â À§Çؼ­ dd¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. dd´Â ÀÏȸ¼º ÀÛ¾÷À¸·Î ÆÐŶÀ» Ãâ·ÂÇϱâ À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Â obs(output block size)¶ó´Â ¿É¼ÇÀÌ ÀÖ´Ù.

ù ¹ø°¿¡ ¼º°øÇϵµ·Ï Å×½ºÆ®ÇÏ´Â °ÍÀÌ ÁÁ´Ù. Áï, ÆÐŶÀÌ ¼º°øÀûÀ¸·Î ºí·° µÇµµ·Ï Å×½ºÆ®ÇØ¾ß ÇÑ´Ù. óÀ½¿¡´Â ÆÐŶÀÌ Á¤»óÀûÀ¸·Î Åë°úÇϵµ·Ï Å×½ºÆ®¸¦ ÇÏ°í ³ª¼­, ÀϺΠÆÐŶÀÌ ºí·° µÇµµ·Ï Å×½ºÆ®ÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é, ¾û¶×ÇÑ ¿À·ù·Î ÀÎÇØ ÆÐŶÀÌ ÁøÇàÇÏ´Â °ÍÀ» ÁßÁö½Ãų ¼ö µµ ÀÖ´Ù.

¾Æ¹«°Å³ª ¸· º¸³»°í ³ª¼­ ¾î¶² °á°ú°¡ ÀϾ´Â È®ÀÎÇÏÁö ¸»°í, Á¤È®ÇÑ Å×½ºÆ®¸¦ ÇÒ ¼ö ÀÖµµ·Ï ÇؾßÇÑ´Ù. Á¤È®ÇÑ Å×½ºÆ®°¡ Àß ¸øµÈ °æ¿ì¶ó¸é, ¹«¾ùÀÌ Àß ¸ø µÇ¾ú´ÂÁö ¾Ë ¼ö ÀÖÁö¸¸, ·£´ý Å×½ºÆ®°¡ À߸ø µÇ¸é ÀüÇô µµ¿òÀÌ µÇÁö ¾Ê´Â´Ù.

¾Æ¹«·± ¸Þ½ÃÁöµµ ³²±âÁö ¾Ê°í Å×½ºÆ®°¡ ½ÇÆÐÇÑ °æ¿ì, ¾î¶² ¸í·ÉÀÌ ½ÇÇàµÇ°í ÀÖ´ÂÁö ¾Ë¾Æº¸±â À§ÇØ ½ºÅ©¸³Æ®ÀÇ ¸Ç À§¿¡ `-x'¸¦ Ãß°¡ ÇÒ ¼ö ÀÖ´Ù. Áï, `#!/bin/sh -x'.

Å×½ºÆ®°¡ ºÒ±ÔÄ¢ÀûÀ¸·Î ½ÇÆÐÇϸé, ¸ðµç ¿ÜºÎ ÀåÄ¡¸¦ Â÷´ÜÇϰųª ÇÏ´Â ½ÄÀ¸·Î, ·£´ý ³×Æ®¿÷ Æ®·¡ÇÈ¿¡ ´ëÇÏ¿© È®ÀÎÇØ º¸´Â °ÍÀÌ ÁÁ´Ù. ¿¹¸¦ µé¸é,Andrew Tridgelló·³ µ¿ÀÏÇÑ ³×Æ®¿÷ »ó¿¡ ÀÖÀ¸¸é, À©µµ¿ìÀÇ ºê·Îµå ij½ºÆÿ¡ ÀÇÇØ ¼ö¸¹Àº °£¼·À» ¹Þ°Ô µÈ´Ù.


5. °³¹ß µ¿±â

ÇÊÀÚ°¡ ipchains¸¦ °³¹ßÇÏ°í ³ª¼­, ½Ãµå´ÏÀÇ Áß±¹½Ä´ç ÀÔ±¸¿¡ µé¾î¼­·Á´Â ¼ø°£ ºÒÇöµí ¸Ó¸®´Â ½ºÄ¡´Â »ý°¢¿¡ ÆÐŶ ÇÊÅ͸µÀÌ ¾û¶×ÇÑ °÷¿¡¼­ ÀÌ·ç¾î Áö°í ÀÖ´Ù´Â »ç½ÇÀ» ±ú´Þ¾Ò´Ù. Áö±ÝÀº ¾îµðÀÎÁö ãÀ» ¼ö ¾øÁö¸¸, ÇÑ°¡Áö ±â¾ïÇÏ´Â °ÍÀº Alan Cox¿¡°Ô ¸ÞÀÏÀ» º¸³Â°í, Ä£ÀýÇÏ°Ôµµ ±×´Â `óÀ½¿£ ¾Æ¹«¸® ´ç½ÅÀÌ ¿Ç¾Ò´Ù°í ÇÒÁö¶óµµ ÇÑÀÏÀ» ³¡³»´Â °ÍÀÌ ¾î¶²°¡¿ä?'¶ó´Â ´äÀåÀ» º¸³Â´Ù. ÀÌ ÂªÀº ¸» ÇѸ¶´Ù¿¡¼­ ½Ç¿ëÁÖÀÇ°¡ Á¤µµ¸¦ À̰ܹö·È´Ù.

ÃÖÃÊ¿¡´Â ipfwadmÀÇ Ä¿³Î ÆÄÆ®ÀÇ ¸¶ÀÌ³Ê ¼öÁ¤À̾úÁö¸¸ °á±¹¿¡´Â ¸¹Àº ºÎºÐÀ» ´Ù½Ã ÀÛ¼ºÇÏ¿© ipchains¸¦ ¸¶¹«¸®Áþ°í HOWTO¸¦ ¾²°í ³ª¼­¾ß, ÆÐŶ ÇÊÅ͸µ, ¸Å½ºÄ¿·¹À̵ù, Æ÷Æ®Æ÷¿öµù°ú À¯»óÇÑ ¿©·¯ À̽´¿¡ ´ëÇÏ¿© ¸®´ª½º Ä¿¹Â´ÏƼ¿¡¼­ ¸¹Àº È¥¶õÀÌ ÀÖ¾ú´Ù´Â °ÍÀ» ¾Ë°Ô µÇ¾ú´Ù.

ÀÌ·± °ÍµéÀÌ ¹Ù·Î ¿©·¯ºÐµéÀÇ µµ¿òÀ¸·ÎºÎÅÍ ¾ò´Â Áñ°Å¿òÀÌ´Ù. ¿©·¯ºÐµéÀº »ç¿ëÀÚµéÀÌ ¹«¾ùÀ» ÇÏ·Á°í ÇÏ°í, ¶Ç ¹«¾ùÀ» °¡Áö°í ³íÀïÇÏ´Â Áö º¸´Ù °¡±îÀ̼­ ´À³¥ ¼ö ÀÖ´Ù. ÇÁ¸®¼ÒÇÁÆ®¿þ¾î¶ó´Â °ÍÀº ¸¹Àº »ç¿ëÀÚµéÀÌ »ç¿ëÇÏ°í ÀÖÀ» ¶§ °¡Ä¡°¡ ÀÖ°í, º¸´Ù ½±°Ô ¸¸µé ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¹®¼­°¡ ¾Æ´Ñ ±¸Á¶(architecture)°¡ ÃÖ´ë °áÇÔÀ̾ú´Ù.

±×·¡¼­ ÇÊÀÚ´Â ipchains Äڵ带 °¡Áö°í »ç¶÷µéÀÌ ÇÏ·Á°í Çß´ø ¾ÆÀ̵ð¾î¿Í °æÇèÀ» ¾ò¾ú´Ù. ¹®Á¦´Â ´ÜÁö µÑ »ÓÀ̾ú´Ù.

ù ¹ø°·Î, ÇÊÀÚ´Â º¸¾È ÂÊÀ¸·Î ´Ù½Ã µ¹¾Æ°¡°í ½ÍÁö ¾Ê¾Ò´Ù. º¸¾È ÄÁ¼³ÅÏÆ®°¡ µÈ´Ù´Â °ÍÀº ¿©·¯ºÐÀÇ ¾ç½É°ú ºÎÀÇ »çÀÌ¿¡ ÀÖ´Â ¿µ¿øÇÑ µµ´öÀûÀÎ ÀüÀïÀÌ´Ù. ±âº»ÀûÀÎ ¼öÁØ¿¡¼­, ¿©·¯ºÐµéÀº ½ÇÁ¦ º¸¾ÈÀÌ ¾Æ´Ñ º¸¾È¿¡ ´ëÇÑ ºÐÀ§±â¸¦ ÆÈ°í ÀÖ´Â °ÍÀÌ´Ù. º¸¾ÈÀ» ÀÌÇØÇÏ°í ÀÖ´Â ±º´ë¿¡¼­ ±º»ç¿ëÀ¸·Î ÀÛ¾÷À» ÇÏ´õ¶ó°í, ´Ù¸¦ ¹Ù´Â ¾ø´Ù.

µÎ ¹ø° ¹®Á¦´Â »õ·Î¿î »ç¿ëÀÚµéÀº °ü½É ¹ÛÀÇ ¹®Á¦¿´´Ù. Å« ȸ»ç¿Í ISPµéÀÌ ¾Õ´ÙÅý ÀÌ ¹°°ÇÀ» »ç¿ëÇÏ°í ÀÖ´Ù. ³»°¡ ÇÊ¿äÇÑ °ÍÀº, ¹°·Ð ±×µéÀÌ ³»ÀÏÀÇ È¨À¯ÀúÀÇ ±Ô¸ð°¡ µÉ ¼öµµ ÀÖÁö¸¸, ÀÌ·± ·ùÀÇ »ç¿ëÀÚµé ºÎÅÍÀÇ ½Å·Ú¸¦ ¹Þ´Â °ÍÀ̾ú´Ù.

WatchGuard¿¡ ´ëÇÑ ³ëÃâÀÌ ³»°Ô ÇÊ¿äÇÑ ´ë±Ô¸ðÀÇ Å¬¶óÀ̾ðÆ®ÀÇ ³ëÃâÀ» °¡Á®´Ù ÁÖ¾ú°í, ±×µé·ÎºÎÅÍ µ¶¸³ÇÏ°íÀÚ ÇÏ´Â °ÍÀÌ ¸ðµç »ç¿ëÀڵ鿡°Ô µ¿ÀÏÇÏ°Ô Áö¿øµÇµµ·Ï ÇÏ¿´´Ù.

±×·¡¼­ ÇÊÀÚ´Â ½±°Ô ÀÛ¼ºµÈ netfilter¸¦ °¡Áú ¼ö ÀÖ¾ú°í, ÃÖ»óÀ§¿¡ ipchains¸¦ Æ÷Æà ÇÏ¿©, À̸¦ °¡Áö°í ¸ðµç °ÍÀ» Çس´Ù. ºÒÇàÇÏ°Ôµµ Ä¿³Î¿¡¼­ ¸ðµç ¸Å½ºÄ¿·¹À̵ù Äڵ尡 »ç¶óÁ® ¹ö·È´Ù. Áï, ÇÊÅ͸µÀ¸·ÎºÎÅÍ ¸Å½ºÄ¿·¹À̵ùÀ» µ¶¸³½ÃÅ°°íÀÚ ÇÏ´Â °ÍÀÌ ÆÐŶ ÇÊÅ͸µÀ¸·Î À̵¿ÇÏ°ÔµÈ ÁÖµÈ ÀÌÀ¯ÀÌÁö¸¸, ±×·¸°Ô ÇÔÀ¸·Î½á ¸Å½ºÄ¿·¹À̵ù ¿ª½Ã netfilter ÇÁ·¹ÀÓ ¿÷À¸·Î À̵¿ÇÒ ÇÊ¿ä°¡ ÀÖ¾ú´Ù.

ipfwadmÀÇ `interface-address'(ipchains¿¡¼­ ÇÊÀÚ°¡ »èÁ¦ÇÑ °Í Áß Çϳª)ÀÇ Æ¯¼º¿¡ ´ëÇÑ ³ªÀÇ °æÇèÀ¸·Î ¹è¿î °ÍÀº, ´Ü¼øÈ÷ ¸Å½ºÄ¿·¹À̵ù Äڵ带 ºÐ¸®ÇÏ°í ³ª¸¦ ´ë½ÅÇÏ¿© netfilter¿¡ Æ÷ÆÃÇØ ÁÙ »ç¶÷À» ±â´Ù¸®´Â °ÍÀº ¾Æ¹«·± Èñ¸ÁÀÌ ¾ø´Ù´Â °ÍÀÌ´Ù.

±×·¡¼­ ÇÊÀÚ´Â ÃÖ¼ÒÇÑ ÇöÀç Äڵ常ŭ ¸¹Àº Ư¼ºÀ» È®º¸ÇÒ ÇÊ¿ä°¡ ÀÖ¾ú´Ù. Ãʱ⿡ µµÀÔÇÑ niche users¸¦ ºÏµ¸±â À§ÇØ, Á¤È®È÷ ¸»Çϸé Á¶±Ý ´õ ÇÊ¿äÇß´Ù. ÀÌ´Â Åõ¸íÇÑ ÇÁ¶ô½Ã, ¸Å½ºÄ¿·¹À̵ù°ú Æ÷Æ® Æ÷¿öµùÀ» ´ëüÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¹Ù²ã ¸»Çϸé, ¿Ïº®ÇÑ NAT °èÃþÀÌ µÇ´Â °ÍÀÌ´Ù.

ÀϹÝÀûÀÎ NAT ½Ã½ºÅÛÀ» ÀÛ¼ºÇÏ´Â ´ë½Å, ±âÁ¸ÀÇ ¸Å½ºÄ¿·¹À̵ù °èÃþÀ» Æ÷ÆÃÇϱâ·Î °áÁ¤Çß¾úÁö¸¸, ¸Å½ºÄ¿·¹À̵ùÀº ¿¬·û°ú À¯Áöº¸¼öÀÇ ºÎÀç°¡ ¹®Á¦½ÃµÇ¾ú´Ù. ±×·¯´Ï±î ¸Å½ºÄ¿·¹À̵ù ¸ÞÀÎÅͳʰ¡ ¾ø´Ù´Â À̾߱â´Ù. ¼ø¼öÇÑ »ç¿ëÀÚµéÀº ¸Å½ºÄ¿·¹À̵ùÀ» »ç¿ëÇÏÁö ¾Ê°í, À¯Áöº¸¼ö ÀÛ¾÷À» ÇÏ·Á°í Çϴ Ȩ À¯Àúµéµµ ¸¹Áö ¾Ê´Ù. Juan Ciarlante °°ÀÌ ¿ë°¨ÇÑ »ç¶÷µéÀÌ ¹ö±×¸¦ °íÃÆÁö¸¸, °á±¹ ´Ù½Ã ÀÛ¼ºÇØ¾ß ÇÏ´Â ¼öÁØ¿¡ À̸£°Ô µÇ¾ú´Ù.

ÇÊÀÚ´Â NAT¸¦ ´Ù½Ã ÀÛ¼ºÇÑ »ç¶÷ÀÌ ¾Æ´Ï¶ó´Â °ÍÀ» ¾Ë¾ÆÁֱ⠹ٶõ´Ù. Áï ÇÊÀÚ´Â ´õ ÀÌ»ó ¸Å½ºÄ¿·¹À̵ùÀ» »ç¿ëÇÏÁö ¾Ê°í, ´ç½Ã ±âÁ¸ÀÇ Äڵ带 »ìÆ캸Áöµµ ¾Ê¾Ò´Ù. ¾Æ¸¶µµ ÀÌ°ÍÀÌ ³»°¡ »ý°¢ÇÑ °Íº¸´Ù ¸¹Àº ½Ã°£ÀÌ ¼Ò¿äµÈ ÀÌÀ¯ÀÏ °ÍÀÌ´Ù. ÇÏÁö¸¸ ÇÊÀÚÀÇ °ßÇطδ °á°ú´Â ²Ï ÁÁ¾Ò°í, ¸¹Àº °ÍÀ» ¹è¿ï ¼ö ÀÖ¾ú´Ù. ¾ó¸¶³ª ¸¹Àº »ç¶÷µéÀÌ »ç¿ëÇÏ°í ÀÖ´Â Áö ¾Ë°Ô µÇ¸é, µÎ ¹ø° ¹öÀüÀº ÈξÀ ´õ ÁÁ¾Æ Áú °ÍÀ̶ó´Â Á¡Àº ¹Ï¾î ÀǽÉÄ¡ ¾Ê´Â´Ù.


6. °¨»çÀÇ ¸»

µµ¿ÍÁֽŠ¸ðµç ºÐµé¿¡°Ô °¨»ç µå¸®¸ç, ƯÈ÷ protocol helpers¸¦ ÀÛ¼ºÇØ ÁֽŠHarald Welte¿¡°Ô °¨»ç µå¸³´Ï´Ù.


ID
Password
Join
Many pages make a thick book.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2003-08-10 11:52:29
Processing time 0.0017 sec