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

You are not allowed to 'info'


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
You display the wonderful traits of charm and courtesy.


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.0018 sec