Linux netfilter Hacking HOWTO
Rusty
Russell
netfilter (at) lists.samba.org
æÚÞÈ
ÐÝí
kenji (at) rtlinux.pe.kr
0.2
2001-02-1
kenji
¹®ÀåÀ» º¸´Ù ¸Å²ô·´°Ô ¼öÁ¤ÇÏ¿´½À´Ï´Ù.
0.1
2001-01-20
kenji
ÃÖÃÊ ¹ø¿ª
º» ¹®¼¿¡¼´Â, ¸ÕÀú ¸®´ª½º¿¡ ´ëÇÑ
³ÝÇÊÅÍ ¾ÆÅ°ÅØÃ³¿Í À̸¦ ÆÄÇìÄ¡´Â ¹æ¹ý, ±×¸®°í ³ÝÇÊÅÍÀÇ ÃÖ»óÀ§¿¡ Á¸ÀçÇÏ´Â ÀϺÎ
Áß¿äÇÑ ½Ã½ºÅÛ, Áï ÆÐŶ ÇÊÅ͸µ, Ä¿³Ø¼Ç Æ®·¢Å· ±×¸®°í NAT(Network Address
Translation)µî¿¡ ´ëÇÏ¿© ±â¼úÇϰíÀÚ ÇÑ´Ù.
¼¹®
º» ¹®¼´Â ¿©Çà°úµµ °°À¸¸ç, ÀϺκÐÀº ¾ÆÁÖ ½±°Ô ¿©ÇàÇÒ ¼ö ÀÖ°í ¶Ç
´Ù¸¥ ºÎºÐ¿¡¼´Â µ¶ÀÚ ¿©·¯ºÐ ½º½º·Î ±æÀ» ã¾Æ¾ß ÇÒ °ÍÀÌ´Ù.
ÇÊÀÚ°¡ µ¶ÀÚ¿¡°Ô ÇÒ ¼ö ÀÖ´Â ÃÖ»óÀÇ Ãæ°í´Â ¾ÆÁÖ Å« ¸Ó±×ÀÜ¿¡ Ä¿Ç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.
³ÝÇÊÅÍ(netfilter)¶õ ¹«¾ùÀΰ¡?
³ÝÇÊÅʹ ǥÁØ Berkeley socket interfaceÀÇ ¿ÜºÎ¿¡ Á¸ÀçÇÏ´Â packet
mangling(ÆÐŶÀ» Å丷³»´Â ÀÏ)¿¡ ´ëÇÑ ÇÁ·¹ÀÓ¿÷À¸·Î, Å©°Ô ³× ºÎºÐÀ¸·Î
±¸¼ºµÇ¾î ÀÖ´Ù. ¸ÕÀú °¢°¢ÀÇ ÇÁ·ÎÅäÄÝÀº "hooks"¶ó´Â °ÍÀ» Á¤ÀÇÇϸç, ÀÌ´Â
ÆÐŶ ÇÁ·ÎÅäÄÝ ½ºÅÃÀÇ packet's traversal¿¡ ÀÖ´Â Àß Á¤ÀÇµÈ Æ÷ÀÎÅ͸¦ ÀǹÌÇÑ´Ù.
ÀÌ·¯ÇÑ Æ÷ÀÎÅÍ¿¡¼, °¢°¢ÀÇ ÇÁ·ÎÅäÄÝÀº ÆÐŶ°ú Èųѹö(hook number)¸¦ ÀÌ¿ëÇÏ¿©
³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷À» È£ÃâÇÏ°Ô µÈ´Ù.
µÎ ¹øÂ°·Î, Ä¿³ÎÀÇ ÀϺκÐÀº °¢ ÇÁ·ÎÅäÄÝ¿¡ ´ëÇÏ¿© ´Ù¸¥ hookÀ» °¨½ÃÇϵµ·Ï µî·ÏÇÒ
¼ö ÀÖ´Ù. µû¶ó¼ ÆÐŶÀÌ ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷À» Åë°úÇÒ ¶§, ´©°¡ ±× ÇÁ·ÎÅäÄݰú ÈÅÀ»
µî·ÏÇß´ÂÁö È®ÀÎÇÏ°Ô µÈ´Ù. ÀÌ·¯ÇÑ °ÍÀÌ µî·ÏµÇ¾î ÀÖ´Ù¸é, µî·ÏµÈ ¼ø¼´ë·Î ÆÐŶÀ»
°Ë»çÇϰí, ÆÐŶÀ» ¹«½ÃÇϰųª(NF_DROP), Åë°ú½Ã۰í(NF_ACCEPT), ¶Ç´Â ÆÐŶ¿¡
´ëÇÑ °ÍÀ» Àؾî¹ö¸®µµ·Ï ³ÝÇÊÅÍ¿¡°Ô Áö½ÃÇϰųª(NF_STOLEN), »ç¿ëÀÚ °ø°£¿¡ ÆÐŶÀ»
´ë±â½Ã۵µ·Ï(queuing) ³ÝÇÊÅÍ¿¡°Ô ¿äûÇÑ´Ù(NF_QUEUE).
¼¼ ¹øÂ° ºÎºÐÀº ´ë±âµÈ ÆÐŶÀ» »ç¿ëÀÚ °ø°£À¸·Î º¸³»±â À§ÇØ Á¦¾îÇÏ´Â °ÍÀ¸·Î
ÀÌ·¯ÇÑ ÆÐŶÀº ºñµ¿±â¹æ½ÄÀ¸·Î 󸮵ȴÙ.
¸¶Áö¸· ºÎºÐÀº ÄÚµå¿Í ¹®¼¿¡ ±â·ÏµÈ ÁÖ¼®¹®À¸·Î ±¸¼ºµÇ¾î ÀÖÀ¸¸ç,
ÀÌ´Â ¾î¶°ÇÑ ½ÇÇèÀû ÇÁ·ÎÁ§Æ®¿¡ ´ëÇØ¼µµ µµ¿òÀÌ µÇ´Â ºÎºÐÀÌ´Ù.
³Ý ÇÊÅÍÀÇ ¸ðÅä´Â ´ÙÀ½°ú °°´Ù.
``±×·¡¼... KDEº¸´Ù ¾ó¸¸Å ÁÁ´Ù´Â °ÅÁÒ?''
ÀÌ·¯ÇÑ Àú¼öÁØ ÇÁ·¹ÀÓ¿÷°ú ´õºÒ¾î, ´Ù¾çÇÑ ¸ðµâÀÌ ÀÛ¼ºµÇ¾úÀ¸¸ç, ÀÌ´Â ÀÌÀü
¹öÀüÀÇ Ä¿³Î¿¡ ´ëÇÏ¿© À¯»çÇÑ ±â´É, È®Àå °¡´ÉÇÑ NAT½Ã½ºÅÛ ±×¸®°í È®Àå °¡´ÉÇÑ
ÆÐŶ ÇÊÅ͸µ ½Ã½ºÅÛÀ» Á¦°øÇÑ´Ù.
Ä¿³Î 2.0°ú 2.2¿¡¼ÀÇ ¹®Á¦Á¡?
»ç¿ëÀÚ °ø°£À» Åë°úÇÏ´Â ÆÐŶ¿¡ ´ëÇÏ¿© ¾î¶°ÇÑ ÇϺα¸Á¶µµ
¸¸µé¾îÁ® ÀÖÁö ¾ÊÀ¸¸ç ±× ÀÌÀ¯´Â ´ÙÀ½°ú °°´Ù.
Ä¿³Î¼öÁØ¿¡¼ ÄÚµùÇÏ´Â °ÍÀÌ ¾î·Æ´Ù
¹Ýµå½Ã C/C++·Î Ä¿³Î ¼öÁØÀÇ ÄÚµùÀÌ µÇ¾î¾ß ÇÑ´Ù.
µ¿Àû ÇÊÅ͸µ Á¤Ã¥ÀÌ Ä¿³Î¿¡ Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù.
Ä¿³Î 2.2¿¡¼´Â ³Ý¸µÅ©¸¦ °Åó »ç¿ëÀÚ °ø°£À¸·Î ÆÐŶÀ» º¹»çÇÏ´Â ¹æ¹ýÀ»
Á¦½ÃÇÏ¿´À¸³ª, ÀçÀü¼Û ÆÐŶÀÌ ´À¸®°í `sanity' check¿¡ Áö¹èµÈ´Ù.
¿¹¸¦ µé¸é, ÀçÀü¼Û ÆÐŶÀÌ ±âÁ¸ÀÇ ÀÎÅÍÆäÀ̽º·Î µé¾î¿Àµµ·Ï ¿äûÇÏ´Â °ÍÀÌ
ºÒ°¡´ÉÇÏ´Ù.
Åõ¸íÇÑ ÇÁ¶ô½Ã ±¸ÇöÀÌ ¾î·Æ´Ù.
±× ÁÖ¼Ò¿Í ¿¬°üµÈ ¼ÒÄÏÀÌ Á¸ÀçÇÏ´Â Áö ¾Ë¾Æº¸±â À§ÇØ ¸ðµç ÆÐŶÀ» »ìÆìº»´Ù.
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¹ø¸¸
³ªÅ¸³´Ù.
ÀÎÅÍÆäÀ̽º ¾îµå·¹½º¿Í º°°³·Î ÆÐŶÇÊÅÍ ·êÀ» ¸¸µå´Â °ÍÀÌ ºÒ°¡´ÉÇÏ´Ù.
ÀÎÅÍÆäÀ̽º¸¦ °ÅÃÄ¿À´Â ÆÐŶÀÌ ·ÎÄÿ¡¼ »ý¼ºµÈ °ÍÀÎÁö ·ÎÄÃÀ» µé¾î¿À´Â °ÍÀÎÁö ±¸ºÐÇϱâ
À§Çؼ ¹Ýµå½Ã ·ÎÄà ÀÎÅÍÆäÀ̽ºÀÇ ÁÖ¼Ò¸¦ ¾Ë¾Æ¾ß ÇÑ´Ù.
¸®´ÙÀÌ·º¼ÇÀ̳ª ¸Å½ºÄ¿·¹À̵ùÀÇ °æ¿ì´Â Á¤º¸°¡ ÃæºÐÇÏÁö ¾Ê´Ù..
Æ÷¿öµù üÀθ¸ÀÌ ¿ÜºÎ·Î ÇâÇÏ´Â ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù.
³×Æ®¿÷ ±¸¼º¿¡ ´ëÇÑ Áö½ÄÀ» ÀÌ¿ëÇÏ¿© ¾î´À ÀÎÅÍÆäÀ̽º·ÎºÎÅÍ ÆÐŶÀÌ µé¾î¿À´ÂÁö ¾Ë°í
ÀÖ¾î¾ß¸¸ ÇÑ´Ù.
¸Å½ºÄ¿·¹À̵ùÀÌ ÇÊÅ͸µ¿¡ Æ÷ÇԵǾî ÀÖ´Ù:
ÇÊÅ͸µ°ú ¸Å½ºÄ¿·¹À̵ù°£ÀÇ »óÈ£ÀÛ¿ëÀÌ ¹æÈº® ±¸ÃàÀ» º¹ÀâÇÏ°Ô ¸¸µç´Ù:
ÀÔ·Â ÇÊÅ͸µÀÎ °æ¿ì, ÀÀ´ä ÆÐŶÀÌ
¹Ú½º ÀÚü¸¦ ÇâÇÏ´Â °ÍÀ¸·Î ³ªÅ¸³´Ù.
µð¸Å½ºÄ¿·¹À̵å(demasqueraded)µÇ´Â ÆÐŶÀÌ Æ÷¿öµå ÇÊÅ͸µ¿¡¼´Â ÀüÇô
³ªÅ¸³ªÁö ¾Ê´Â´Ù.
Ãâ·Â ÇÊÅ͸µ¿¡¼´Â ÆÐŶÀÌ ·ÎÄà ¹Ú½º·ÎºÎÅÍ µé¾î¿À´Â °Íó·³ º¸ÀδÙ.
Æ÷Æ® Æ÷¿öµù, ¶ó¿ìÆÃ°ú QoS¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Â TOS ó¸®,
¸®´ÙÀÌ·ºÆ®, ICMP µµ´ÞºÒ°¡(unreachable)°ú ¸¶Å©(mark) µîÀÌ ÆÐŶ ÇÊÅ͸µ Äڵ忡 Æ÷ÇԵǾî ÀÖ´Ù.
ipchains ÄÚµå´Â ¸ðµâȵǾî ÀÖÁöµµ ¾Ê°í È®ÀåÇÒ ¼öµµ ¾ø´Ù.
(¿¹: MAC ¾îµå·¹½º ÇÊÅ͸µ, ¿É¼Ç ÇÊÅ͸µ µî)
ÇϺα¸Á¶°¡ ºÒÃæºÐÇϱ⠶§¹®¿¡ ´Ù¸¥ ±â¼úÀ» ³¶ºñÇÏ°Ô ¸¸µé¾ú´Ù.
per-protocol ¸ðµâÀ» ´õÇÑ ¸Å½ºÄ¿·¹À̵ù
¶ó¿ìÆÃ Äڵ忡 ÀÇÇÑ ºü¸¥ Á¤Àû NAT(per-protocol 󸮸¦ Æ÷ÇÔÇÏÁö ¾Ê¾Ò´Ù).
Æ÷Æ® Æ÷¿öµù, ¸®´ÙÀÌ·ºÆ®, ÀÚµ¿ Æ÷¿öµù
The Linux NAT and Virtual Server Projects.
CONFIG_NET_FASTROUTE¿Í ÆÐŶ ÇÊÅ͸µ°£ÀÇ È£È¯¼º °á¿©:
Æ÷¿öµå ÆÐŶÀº ¼¼ °³ÀÇ Ã¼ÀÎÀ» °ÅÃÄ Àü´ÞµÈ´Ù.
ÀÌ·¯ÇÑ Ã¼ÀÎÀ» ¹«½ÃÇϰí Áö³ª°£ °æ¿ì ¾Ë·ÁÁÙ ¹æ¹ýÀÌ ¾ø´Ù.
¶ó¿ìÆÃ ÇÁ·ÎÅØ½º·Î ÀÎÇØ ¹ö·ÁÁø ÆÐŶÀ» °üÂûÇÒ ¼ö ¾ø´Ù.
(Áï, Source Address Verification)
ÆÐŶ ÇÊÅ͸µ ·ê¿¡ ´ëÇÏ¿© ÀÚµ¿À¸·Î Ä«¿îÅ͸¦ Àо ¹æ¹ýÀÌ ¾ø´Ù.
CONFIG_IP_ALWAYS_DEFRAGÀº ÄÄÆÄÀÏÇÒ ¶§ ÁÖ´Â ¿É¼ÇÀ̶ó¼
ÀϹÝÀûÀÎ ¸ñÀûÀ¸·Î ¿øÇÏ´Â Ä¿³ÎÀ» ¹èÆ÷ÆÇÀ» ¸¸µé±â°¡ ¾î·Æ´Ù.
´©±¸½ÃÁÒ?
³ª´Â ÀÌ·± ÁþÀ» Çϸ®¸¸Å ¹Ùº¸½º·¯¿î »ç¶÷ÀÌ´Ù. ipchainsÀÇ °øµ¿ÀúÀÚÀ̰í ÇöÀç
¸®´ª½º Ä¿³Î IP ¹æÈº®ÀÇ ¸ÞÀÎÅͳʷμ, ÇöÀçÀÇ ½Ã½ºÅÛ ¶§¹®¿¡ »ç¶÷µéÀÌ ¸¹Àº ¹®Á¦¸¦
°Ý¾ú´Ù´Â °Í »Ó¸¸ ¾Æ´Ï¶ó ±×µéÀÌ ½ÃµµÇϰí ÀÖ´Â °ÍÀÌ Á¡Á¡ ´õ ³ëÃâµÇ°í ÀÖ´Ù´Â °ÍÀ» ¾Ë¾Ò´Ù.
±×°Ô ¿Ö ÆøÁÖÇÏÁÒ?
ÀÌ~~¾ß!, Áö³ ÁÖ¿¡ ÀÌ ¹®¼¸¦ ºÃ¾î¾ß ÇÏ´Â °Çµ¥...
»ç½Ç ³ª´Â ¿ì¸® ¸ðµÎ°¡ µÇ±â ¿øÇÏ´Â ±×·± ÈǸ¢ÇÑ ÇÁ·Î±×·¡¸Ó°¡ ¾Æ´Ï°í,
½Ã°£, Àåºñ ±×¸®°í ¿µ°¨µµ ºÎÁ·Çؼ ½Ã³ª¸®¿À Àüü¸¦ ÃæºÐÈ÷ Å×½ºÆ® ÇØº¸Áö ¸øÇß´Ù.
±×Àú ³»°¡ ÇØº» °ÍÀ̶ó°í´Â ¿©·¯ºÐµéÀÌ Âü¿©Çϱ⸦ ¹Ù¶ó´Â
¸¶À½¿¡¼ ¸¸µç testsuite¸¦ µ¹¸®´Â °ÍÀÌ °íÀÛÀ̾ú´Ù.
¾îµð¼ ÃֽйöÀüÀ» ±¸ÇÏÁÒ?
ÃÖ½ÅÀÇ HOWTO, userspace tools ±×¸®°í testsuite¸¦ °¡Áö°í ÀÖ´Â
CVS ¼¹ö°¡ samba.org¿¡ ÀÖ´Ù.
Åë»óÀûÀÎ ºê¶ó¿ì¡ ¹æ¹ýÀ¸·Î´Â,
À¥ ÀÎÅÍÆäÀ̽º¸¦
»ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÃÖ½ÅÀÇ ¼Ò½º¸¦ ¾òÀ¸·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù:
anoymous·Î SAMBA CVS ¼¹ö¿¡ ·Î±×ÀÎÇÑ´Ù:
cvs -d :pserver:cvs@cvs.samba.org:/cvsroot login
ÆÐ½º¿öµå¸¦ ¹°¾îº¸¸é `cvs'¶ó°í Ä£´Ù.
´ÙÀ½ ¸í·ÉÀ» ÀÌ¿ëÇÏ¿© Äڵ带 üũÇÑ´Ù:
cvs -d :pserver:cvs@cvs.samba.org:/cvsroot co netfilter
ÃֽйöÀüÀ¸·Î ¾÷µ¥ÀÌÆ®ÇÏ·Á¸é, ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
cvs update -d -P
³ÝÇÊÅÍ ¾ÆÅ°ÅØÃ³
³ÝÇÊÅÍ´Â ´ÜÁö ÇÁ·ÎÅäÄÝ ½ºÅÃÀÇ ´Ù¾çÇÑ Æ÷ÀÎÆ®¿¡ Á¸ÀçÇÏ´Â ÈÅÀÇ ¿¬¼ÓÀÏ »ÓÀÌ´Ù.
ÀÌ»óÀûÀÎ 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' Çʵ带 º¯°æÇؾ߸¸ ÇÑ´Ù.
³ÝÇÊÅÍÀÇ ±âÃÊ
ÀÌ Àý¿¡¼´Â IPv4¿¡ ´ëÇÑ ³ÝÇÊÅÍÀÇ ¿¹¸¦ º¸ÀÏ °ÍÀ̸ç, À̸¦ ÅëÇØ ¿©·¯ºÐµéÀº
°¢°¢ÀÇ ÈÅÀÌ µ¿ÀÛÇÏ´Â ½ÃÁ¡À» ÀÌÇØÇÏ°Ô µÉ °ÍÀÌ´Ù. ÀÌ °ÍÀÌ ¹Ù·Î ³ÝÇÊÅÍÀÇ
±âÃÊÀÌ´Ù.
Ä¿³Î ¸ðµâÀº ¾Õ¼ ¾ð±ÞÇÑ ¾î¶°ÇÑ ÈÅ¿¡ ´ëÇØ¼ ÀÀ´äÇÒ ¼ö ÀÖµµ·Ï µî·ÏÇÒ ¼ö
ÀÖÀ¸¸ç, ¾î¶² ÇÔ¼ö¸¦ µî·ÏÇÑ ¸ðµâÀº ÈÅ ³»¿¡¼ ÇÔ¼öÀÇ ¿ì¼±¼øÀ§¿¡ ´ëÇÏ¿© ¹Ýµå½Ã
¸í½ÃÇÏ¿©¾ß ÇÑ´Ù. ÄÚ¾î ³×Æ®¿öÅ· ÄÚµå·ÎºÎÅÍ ³ÝÇÊÅÍ ÈÅÀÌ È£ÃâµÇ´Â °æ¿ì, °¢
Æ÷ÀÎÆ®¿¡ µî·ÏµÈ °¢°¢ÀÇ ¸ðµâÀº ¿ì¼±¼øÀ§¿¡ µû¶ó È£ÃâÀÌ µÇ°í, ÆÐŶÀ» ÀÚÀ¯·ÎÀÌ
´Ù·ê ¼ö ÀÖ´Ù. ¸ðµâÀº ³ÝÇÊÅÍ¿¡°Ô ´ÙÀ½ÀÇ ´Ù¼¸ °¡Áö µ¿ÀÛÀ» Çϵµ·Ï ¿äûÇÑ´Ù.
NF_ACCEPT: º¸Åëó·³ °è¼Ó ÁøÇà½ÃŲ´Ù.
NF_DROP: ÆÐŶÀ» ¹ö¸°´Ù. Áï °è¼Ó ÁøÇà½ÃŰÁö ¾Ê´Â´Ù.
NF_STOLEN: ÆÐŶÀ» Á¢¼öÇϰڴÙ. Áï °è¼Ó ÁøÇà½ÃŰÁö ¾Ê´Â´Ù.
NF_QUEUE: ÆÐŶÀ» Å¥·Î º¸³½´Ù.(º¸Åë »ç¿ëÀÚ °ø°£¿¡¼ÀÇ Ã³¸®¸¦ ¸ñÀûÀ¸·Î ÇÑ´Ù.)
NF_REPEAT: ÇöÀç ÈÅÀ» ´Ù½Ã È£ÃâÇÑ´Ù.
³ÝÇÊÅÍÀÇ ´Ù¸¥ ºÎºÐÀº µÚ¿¡ ³ª¿À´Â Ä¿³Î ºÎºÐ¿¡¼ ´Ù·ç±â·Î ÇÑ´Ù.
ÀÌ»ó°ú °°Àº °ÍÀÌ ±âÃʰ¡ µÇ¾î, ÀúÀÚµéÀº ´ÙÀ½ µÎ Àý¿¡ º¸ÀÎ °Í°ú °°Àº º¹ÀâÇÑ ÆÐŶ 󸮸¦ ¸¸µé ¼ö ÀÖ´Ù.
ÆÐŶ ¼±ÅÃ: 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
ÆÐŶ ÇÊÅ͸µ
`filter'¶ó´Â Å×À̺íÀº ÆÐŶÀ» Àý´ë·Î º¯°æ½ÃŰÁö ¾Ê°í ´ÜÁö
°É·¯³»±â¸¸ ÇÑ´Ù.
ipchains¿Í ºñ±³ÇßÀ» ¶§, iptables filterÀÇ ÀåÁ¡ Áß Çϳª´Â ÀÛ°í ºü¸£´Ù´Â
°ÍÀ̸ç, NF_IP_LOCAL_IN°ú NF_IP_FORWARD, NF_IP_LOCAL_OUT ½ÃÁ¡¿¡¼
³ÝÇÊÅÍ·Î ÈÅÅ·µÈ´Ù. ÀÌ´Â, ÁÖ¾îÁø ÆÐŶ¿¡ ´ëÇÏ¿© À̸¦ ÇÊÅ͸µ ÇÏ´Â À§Ä¡°¡
¿ÀÁ÷ Çϳª »ÓÀ̶ó´Â °ÍÀ» ÀǹÌÇÑ´Ù. °á±¹ »ç¿ëÀÚµéÀÌ ipchains¸¦ »ç¿ëÇÑ °Íº¸´Ù ´õ
´Ü¼øÇÏ°Ô ¸¸µé¸ç, ¶ÇÇÑ ³ÝÇÊÅÍ ÇÁ·¹ÀÓ¿÷ÀÌ NF_IP_FORWARD ÈÅ¿¡ ´ëÇÏ¿©
ÀԷ°ú Ãâ·Â ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù´Â »ç½ÇÀº ´Ù¾çÇÑ ÇÊÅ͸µÀÌ ÈξÀ
´Ü¼øÇØÁø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
ÁÖ: ÇÊÀÚ´Â ¾÷±×·¹À̵åÀÇ ÇÊ¿ä ¾øÀÌ ±âÁ¸ÀÇ ipfwadm°ú ipchains¸¦
»ç¿ë °¡´ÉÇϵµ·Ï ³ÝÇÊÅÍÀÇ ÃÖ»óÀ§¿¡ ¸ðµâ·Î¼ ipchains¿Í ipfwadmÀÇ
Ä¿³ÎºÎºÐÀ» Æ÷ÆÃ ÇÏ¿´´Ù.
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' Å×À̺í°ú´Â ¾à°£ ´Ù¸£¸ç, »õ·Î¿î Ä¿³Ø¼ÇÀÇ
ù ¹øÂ° ÆÐŶ¸¸ÀÌ Å×À̺í·Î Àü´ÞµÈ´Ù. µû¶ó¼ ÀÌ¿Í °°Àº Àü´ÞÀÇ °á°ú´Â
µ¿ÀÏÇÑ Ä¿³Ø¼Ç¿¡ ÀÖ¾î¼ ÇâÈÄ Àü´ÞµÇ´Â ¸ðµç ÆÐŶ¿¡ Àû¿ëµÈ´Ù.
¸Å½ºÄ¿·¹À̵ù, Æ÷Æ® Æ÷¿öµù, Åõ¸íÇÑ ÇÁ¶ô½Ã
ÇÊÀÚ´Â NAT¸¦ Ãâ¹ßÁö NAT(Áï ù ¹øÂ° ÆÐŶÀÌ Ãâ¹ßÁö¸¦ º¯°æÇÏ´Â °æ¿ì)¿Í
¸ñÀûÁö NAT(ù ¹øÂ° ÆÐŶÀÌ ¸ñÀûÁö¸¦ º¯°æÇÏ´Â °æ¿ì)·Î ±¸ºÐÇÏ¿´´Ù.
¸Å½ºÄ¿·¹À̵ùÀº Ãâ¹ßÁö NATÀÇ Æ¯º°ÇÑ °æ¿ìÀ̸ç, Æ÷Æ® Æ÷¿öµù°ú
Åõ¸íÇÑ ÇÁ¶ô½Ã´Â ¸ñÀûÁö NATÀÇ Æ¯º°ÇÑ °æ¿ìÀÌ´Ù. ÀÌ¿Í °°Àº °ÍÀº ¼·Î
µ¶¸³ÀûÀÎ ¿£Æ¼Æ¼¸¦ °¡Áö°í NAT ÇÁ·¹ÀÓ¿÷À» ÀÌ¿ëÇÏ¿© ±¸ÇöµÇ¾ú´Ù.
ÆÐŶ ¸Í±Û¸µ(packet mangling)
ÆÐŶ ¸Í±Û¸µ Å×À̺í(`mangling' table)Àº ÆÐŶÀÇ Á¤º¸¸¦ ½ÇÁ¦·Î
º¯°æÇϱâ À§ÇØ »ç¿ëµÇ¸ç, NF_IP_PRE_ROUTING°ú NF_IP_LOCAL_OUT ½ÃÁ¡¿¡¼
³ÝÇÊÅÍ·Î ÈÅÅ·µÈ´Ù.
¿¬°á ÃßÀû
¿¬°áÃßÀû(connection tracking)Àº NATÀÇ ±âº»ÀÌÁö¸¸, ¸ðµâ·Î ºÐ¸®µÇ¾î
±¸ÇöµÈ´Ù. ÀÌ´Â ¿¬°áÃßÀûÀ» ´Ü¼øÇÏ°í ¸íÈ®ÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÆÐŶ ÇÊÅ͸µ
Äڵ忡 ´ëÇÑ È®À强À» Á¦°øÇÑ´Ù.(`state' ¸ðµâ)
±×ÀÌ¿Ü Ãß°¡µÈ »çÇ×
»õ·Î¿î À¯¿¬¼º ¶§¹®¿¡ Á¤¸»·Î ¹«¼¿î ÀÏÀ» °ÞÀ» ±âȸ°¡ ¸¹¾ÆÁ³Áö¸¸,
´Ù¸¥ »ç¶÷µéÀÌ Çâ»óµÈ Äڵ带 ÀÛ¼ºÇϰųª ±âÁ¸ÀÇ Äڵ带 ¿ÏÀüÈ÷ ´ëÃ¼ÇØ ¹ö¸± ¼ö ÀÖ´Â ±âȸ
¿ª½Ã ¸¹¾ÆÁ³´Ù.
ÇÁ·Î±×·¡¸ÓµéÀ» À§ÇÑ Á¤º¸
ºñ¹ÐÀ» Çϳª ¸»¾¸µå¸®°Ú½À´Ï´Ù. ¹¹³ÄÇϸé, Á¦°¡ ±â¸£´Â ÇܽºÅͰ¡ ¸ðµç
Äڵ带 ÀÛ¼ºÇß½À´Ï´Ù. Àú´Â ´ÜÁö Àü´ÞÇÏ´Â ¿ªÇÒ¸¸ Çß°í, ¸ðµç °èȹÀº Á¦
¾Ö¿Ïµ¿¹°ÀÌ Çß½ÀÁÒ. ±×·¯´Ï ¹ö±×°¡ »ý±â´õ¶óµµ Àú¸¦ ¿ø¸ÁÇÏÁö ¸¶½Ã°í,
±Í¿©¿î ÅкϼþÀ̸¦ ¿ø¸ÁÇϽñ⠹ٶø´Ï´Ù.
ip_tablesÀÇ ÀÌÇØ
iptables´Â ¸Þ¸ð¸® ³»¿¡ ÀÖ´Â ±ÔÄ¢ÀÇ ¸í¸íµÈ ¹è¿°ú °¢°¢ÀÇ ÈÅÀ¸·ÎºÎÅÍ
ÆÐŶÀÌ Àü´ÞµÇ±â ½ÃÀÛÇØ¾ß ÇÏ´Â Á¤º¸¸¦ ´Ü¼øÈ÷ Á¦°ø¸¸ ÇÏ´Â °ÍÀÌ´Ù.
¾î¶² Å×À̺íÀÌ µî·ÏµÇ°í ³ª¸é, »ç¿ëÀÚ °ø°£Àº getsockopt()°ú
setsockopt()¸¦ ÀÌ¿ëÇÏ¿© ±× ³»¿ëÀ» ÀÐ°í º¯°æÇÒ ¼ö ÀÖ´Ù.
iptables´Â ¾î¶°ÇÑ ³ÝÇÊÅÍ ÈÅ¿¡µµ µî·ÏÇÏÁö ¾ÊÀ¸¸ç, À̸¦ ¼öÇàÇÏ´Â
´Ù¸¥ ¸ðµâ¿¡ ÀÇÁ¸Çϰí ÀûÀýÈ÷ ÆÐŶÀ» ¸ðµâ¿¡ Àü´ÞÇÑ´Ù. ´Ù½Ã ¸»ÇØ, ÇϳªÀÇ
¸ðµâÀº ³ÝÇÊÅÍ ÈŰú ip_tables¿¡ µû·Îµû·Î µî·ÏÇØ¾ßÇÑ Çϰí, ÈÅÀÌ
¹ß»ýÇϸé ip_tables¸¦ È£ÃâÇÏ´Â ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÑ´Ù.
ip_tablesÀÇ µ¥ÀÌÅÍ ±¸Á¶
Æí¸®¼ºÀ» À§ÇØ, µ¿ÀÏÇÑ µ¥ÀÌÅÍ ±¸Á¶¸¦ »ç¿ëÇÏ¿© »ç¿ëÀÚ °ø°£¿¡ ÀÇÇÑ ±ÔÄ¢°ú Ä¿³Î³»ºÎÀÇ ±ÔÄ¢À»
Ç¥ÇöÇÏ¿´´Ù. ÀÌ·¸°Ô Ç¥ÇöµÈ µ¥ÀÌÅÍ ±¸Á¶ Áß ¾ÆÁÖ ÀϺκи¸ÀÌ Ä¿³Î ³»ºÎ¿¡¼ »ç¿ëµÈ´Ù.
°¢°¢ÀÇ ±ÔÄ¢Àº ´ÙÀ½°ú °°Àº ºÎºÐÀ¸·Î ±¸¼ºµÈ´Ù.
`struct ipt_entry'
zero ¶Ç´Â ±× ÀÌ»óÀÇ `struct
ipt_entry_match' ±¸Á¶·Î, °¢°¢Àº ¿©±â¿¡ Ãß°¡ °¡´ÉÇÑ
µ¥ÀÌÅÍÀÇ Å©±â¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù.
`struct ipt_entry_target' ±¸Á¶: Ãß°¡ °¡´ÉÇÑ
µ¥ÀÌÅÍ Å©±â º¯È °¡´É
±ÔÄ¢ÀÇ º¯È °¡´ÉÇÑ Æ¯¼ºÀº È®À强¿¡ ´ëÇÏ¿© »ó´çÇÑ À¯¿¬¼ºÀ»
Á¦°øÇϸç, ƯÈ÷ °¢°¢ÀÇ match ȤÀº Ÿ±êÀÌ ÀÓÀÇ Å©±âÀÇ µ¥ÀÌÅ͸¦
Àü´ÞÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ¹Ý¸é ÀÌ´Â ¸î °¡Áö ÇÔÁ¤À» ¸¸µé°Ô µÇ´Â
µ¥, ¹Ýµå½Ã Á¤·Ä(alignment)¿¡ ÁÖÀÇÇØ¾ß¸¸ ÇÑ´Ù. `ip_entry'¿Í
`ipt_entry_match', `ipt_entry_target' ±¸Á¶°¡ Å©±â º¯°æÀÌ
Æí¸®Çϵµ·Ï Çϰí, IPT_ALIGN() ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¿© ÀåºñÀÇ ÃÖ´ë
Á¤·Ä(alignment)±îÁö ¸ðµç µ¥ÀÌÅ͵éÀ» ¸ðÀ¸´Â °Í µîÀ» È®½ÇÇÏ°Ô ÇÔÀ¸·Î½á
Á¤·ÄÀ» ±¸ÇöÇÏ¿´´Ù.
`struct ipt_entry'´Â ´ÙÀ½°ú °°Àº Çʵ带 Æ÷ÇÔÇÑ´Ù.
`struct ipt_ip' : IP header¿¡ ´ëÇÑ ¼¼ºÎÇ׸ñÀ»
Æ÷ÇÔ
`nf_cache' : ÇöÀçÀÇ ±ÔÄ¢À» °Ë»çÇØ¾ßÇÏ´Â ÆÐŶÀÇ
ºÎºÐÀ» ¾Ë·ÁÁÖ´Â ºñÆ® Çʵå
`target_offset' : ipt_entry_target ±¸Á¶°¡
½ÃÀÛÇÏ´Â ÇöÀç ±ÔÄ¢ÀÇ ½ÃÀÛÁ¡À¸·ÎºÎÅÍÀÇ offsetÀ»
¾Ë·ÁÁÖ´Â Çʵå
`next_offset' : ÇöÀç ±ÔÄ¢ÀÇ ÃÖ´ë Å©±â¸¦
¾Ë·ÁÁÖ´Â Çʵå·Î match¿Í targetÀ» Æ÷ÇÔÇÑ´Ù. ÀÌ °Í
¿ª½Ã IPT_ALIGN ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¿© Á¤·ÄµÇ¾î¾ß ÇÑ´Ù.
`comefrom' : ÆÐŶÀÇ °æ·Î¸¦ ÃßÀûÇϱâ À§ÇØ
Ä¿³ÎÀÌ »ç¿ëÇÏ´Â Çʵå
`struct ipt_counters' : ÇöÀç ±ÔÄ¢¿¡ ÀÏÄ¡ÇÏ´Â
ÆÐŶ¿¡ ´ëÇÑ ¹ÙÀÌÆ® Ä«¿îÅÍ¿Í ÆÐŶÀ» Æ÷ÇÔÇÏ´Â Çʵå
`struct ipt_entry_match'¿Í `struct ipt_entry_target'Àº
»ó´çÈ÷ À¯»çÇϸç, Àüü(IPT_ALIGNÀ¸·Î Á¤·ÄµÈ) ±æÀÌ Çʵå(°¢°¢
`match_size'¿Í `target_size')¿Í, match¿Í
target(»ç¿ëÀÚ °ø°£¿¡ ´ëÇÑ) ¸íĪÀ» Æ÷ÇÔÇÏ´Â ±¸Á¶Ã¼, ±×¸®°í
(Ä¿³Î¿¡ ´ëÇÑ) Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÑ´Ù.
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°¡ µÉ
°ÍÀÌ´Ù.
iptables È®ÀåÇϱâ
Àü ¹«ÁöÇÏ°Ô °ÔÀ¸¸¥ ³ÑÀ̶ó¼, iptables´Â ¾ó¸¶µçÁö
È®Àå °¡´ÉÇÕ´Ï´Ù. ´Ù½Ã ¸»Çϸé Á¦ ¼ÕÀ» ¶°³ª ´Ù¸¥ »ç¶÷¿¡°Ô ³Ñ¾î°£,
¿ÀǼҽº ±× ÀÌ»óÀ̶ó´Â °ÅÁÒ.
iptables¸¦ È®ÀåÇÑ´Ù´Â °ÍÀº ´ÙÀ½ÀÇ µÎ ºÎºÐÀ» Æ÷ÇÔÇÑ´Ù. Áï,
»õ·Î¿î ¸ðµâÀ» ÀÛ¼ºÇÏ¿© Ä¿³ÎÀ» È®ÀåÇÏ´Â °Í°ú »õ·Î¿î °øÀ¯ ¶óÀ̺귯¸®¸¦
ÀÛ¼ºÇÏ¿© »ç¿ëÀÚ Â÷¿øÀÇ ÇÁ·Î±×·¥ÀÎ iptables¸¦ È®ÀåÇÏ´Â °ÍÀÌ´Ù.
Ä¿³Î
¿¹Á¦¸¦ º¸½Å »ç¶÷µéÀº ¾Ë°ÚÁö¸¸, Ä¿³Î ¸ðµâÀ» ÀÛ¼ºÇÑ´Ù´Â °Í
ÀÚü´Â »ó´çÈ÷ ´Ü¼øÇÏ´Ù. ÇѰ¡Áö ¾Ë¾Æ¾ß ÇÒ °ÍÀº ¿©·¯ºÐÀÇ Äڵ尡
ÀçÁøÀÔ °¡´ÉÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾îº¸¸é, »ç¿ëÀÚ
°ø°£À¸·ÎºÎÅÍ µé¾î¿À´Â ¾î¶² ÆÐŶÀÌ Á¸ÀçÇÒ ¼ö ÀÖÀ» °ÍÀ̸ç, µ¿½Ã¿¡
¶Ç ´Ù¸¥ ÆÐŶÀÌ ÀÎÅÍ·´Æ®¿¡ ÀÇÇØ µé¾î ¿Ã ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸,
Ä¿³Î 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¿¡ »ç¿ëµÈ ¹æ¹ýÀ» ã¾ÆºÁ¾ß¸¸ ÇÒ °ÍÀÌ´Ù.
»õ·Î¿î 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¸¦
Áõ°¡ ȤÀº °¨¼Ò½ÃŲ´Ù. ¾î¶² ±ÔÄ¢ÀÌ ÀÌ °ÍÀ»
ÂüÁ¶Çϰí ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í »ç¿ëÀÚ°¡ ¸ðµâÀ»
Á¦°ÅÇϰíÀÚ ÇÏ´Â °æ¿ì, »ç¿ëÀÚ°¡ ¸ðµâÀ» Á¦°ÅÇÏÁö
¸øÇϵµ·Ï ÇÑ´Ù.
»õ·Î¿î 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¸¦
Áõ°¡ ȤÀº °¨¼Ò½ÃŲ´Ù. ¾î¶² ±ÔÄ¢ÀÌ ÀÌ °ÍÀ»
ÂüÁ¶Çϰí ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í »ç¿ëÀÚ°¡ ¸ðµâÀ»
Á¦°ÅÇϰíÀÚ ÇÏ´Â °æ¿ì, »ç¿ëÀÚ°¡ ¸ðµâÀ» Á¦°ÅÇÏÁö
¸øÇϵµ·Ï ÇÑ´Ù.
»õ·Î¿î 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 Äڵ忡 ÀÇÇØ ³»ºÎÀûÀ¸·Î
»ç¿ëµÈ´Ù.
»ç¿ëÀÚ°ø°£ µµ±¸(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'À̸ç, »ç¿ëÀÚ°¡
Ä¿¸Çµå ¶óÀÎÀ» Á¤È®Çϱ⠻ç¿ëÇÏÁö ¾Ê¾Ò´Ù´Â
°ÍÀ» ÀǹÌÇÑ´Ù.
»õ·Î¿î 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¿¡ ÀÇÇØ ³»ºÎÀûÀ¸·Î »ç¿ëÇϱâ À§ÇÑ ÀÌ ±¸Á¶Ã¼ÀÇ ¸¶Áö¸·
ºÎºÐ¿¡ ºÎ°¡ÀûÀÎ Çʵ尡 Á¸ÀçÇÏÁö¸¸ ±× °ªÀ» ¼³Á¤ÇÒ ÇÊ¿ä´Â
¾ø´Ù.
»õ·Î¿î Targets
¿©·¯ºÐÀÇ °øÀ¯¶óÀ̺귯¸®ÀÇ _init() ÇÔ¼ö´Â
`register_target()' ÇÔ¼ö·Î Á¤ÀûÀ¸·Î ¼±¾ðµÈ `struct
iptables_target'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Àü´ÞÇϸç, ÀÌ´Â ¾Õ¼ ¾ð±ÞÇÑ
iptables_match ±¸Á¶Ã¼¿Í À¯»çÇÑ Çʵ带 Æ÷ÇÔÇÑ´Ù.
`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() ÇÔ¼ö·Î Àü´ÞµÇ¾î ¿¡·¯
¸Þ½ÃÁö·Î º¯È¯µÈ´Ù.
NATÀÇ ÀÌÇØ
ÀÌÁ¦ Ä¿³ÎÀÇ NAT(Network Address Translation)±îÁö ¿À¼Ì±º¿ä.
¿©±â¼ Á¦°øµÇ´Â ÇϺα¸Á¶´Â È¿À²º¸´Ù´Â ¿Ïº®¼º¿¡ ÁßÁ¡À» µÎ°í
¼³°èµÈ °ÍÀ̸ç, ÇâÈÄ °³Á¶¸¦ ÅëÇØ È¿À²¼ºÀÌ ÇöÀúÇÏ°Ô Áõ°¡µÉÁöµµ
¸ð¸¨´Ï´Ù. ÇöÀç Àú´Â ÀÌ ³ÑÀÌ µ¿ÀÛÇÑ´Ù´Â °Í¸¸À¸·Îµµ ÇູÇÕ´Ï´Ù.
NAT´Â ÆÐŶÀ» ÀüÇô ó¸®ÇÏÁö ¾Ê´Â connection tracking°ú NAT
ÄÚµå ÀÚü·Î ºÐ¸®µÇ¾ú´Ù. connection tracking ¿ª½Ã iptables ¸ðµâ¿¡¼
»ç¿ëÇϱâ À§ÇØ ¼³°èµÇ¾úÀ¸¸ç, µû¶ó¼ NAT°¡ °ü½ÉÀ» µÎÁö ¾Ê´Â
»óÅÂ(state)¿¡
´ëÇØ¼ ¹Ì¹¦ÇÑ Â÷À̸¦ º¸ÀÌ°Ô µÈ´Ù.
¿¬°á ÃßÀû
¿¬°áÃßÀû(connection tracking)Àº ¿ì¼± ¼øÀ§°¡ ³ôÀº NF_IP_LOCAL_OUT°ú
NF_IP_PRE_ROUTING ÈÅÀ¸·Î ÈÅÅ· µÇ¸ç, ÀÌ´Â ÆÐŶÀÌ ½Ã½ºÅÛÀ¸·Î
ÁøÀÔÇϱâ Àü ±× ÆÐŶÀ» »ìÆìº¸±â À§ÇÔÀÌ´Ù.
skb¿¡ ÀÖ´Â nfct Çʵå´Â struct ip_conntrackÀÇ ³»ºÎ¿¡ ´ëÇÑ
Æ÷ÀÎÅÍÀ̸ç, ¹è¿ infos[] Áß ÇÑ °÷¿¡ Á¸ÀçÇÑ´Ù. Áï, ÀÌ ¹è¿³»ÀÇ
¾î¶² ¿ä¼Ò¸¦ °¡¸®Å°°Ô ÇÔÀ¸·Î½á skbÀÇ »óŸ¦ ¸»ÇÒ ¼ö ÀÖ´Ù.
´Ù½Ã ¸»ÇØ, ÀÌ Æ÷ÀÎÅÍ´Â state structure¿Í ±× »óÅ¿¡ ´ëÇÑ skbÀÇ
°ü°è ¸ðµÎ¸¦ ¾Ë·ÁÁÖ°Ô µÈ´Ù.
`nfct' Çʵ带 ÃßÃâÇÏ´Â ÃÖ¼±ÀÇ ¹æ¹ýÀº `ip_conntrack_get()'À»
È£ÃâÇÏ´Â °ÍÀ¸·Î, `nfct' ÇÊÆ®°¡ ¼¼Æ®µÇ¾î ÀÖÀ¸¸ç connection
Æ÷ÀÎÅ͸¦ µ¹·ÁÁÖ°í ±×·¸Áö ¾ÊÀº °æ¿ì´Â NULLÀ» µ¹·ÁÁÖ¸ç, ÇöÀçÀÇ
¿¬°á¿¡ ´ëÇÑ ÆÐŶÀÇ °ü°è¸¦ Ç¥ÇöÇÏ´Â ctinfoÀ» ä¿î´Ù. `nfct'ÀÇ
°ªµéÀº ¼öÄ¡È(enumerate)µÇ¾î ÀÖÀ¸¸ç, ´ÙÀ½°ú °°Àº °ªÀ» °®´Â´Ù.
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 º¸´Ù
Å©°Å³ª °°Àº °ªÀÎ °¡·Î È®ÀÎÇÒ ¼ö ÀÖ´Ù.
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À¸·Î À̸¦ »õ·Î ¸ÊÇÎÇØ¾ß ÇÒ °ÍÀÌ´Ù.
Ç¥ÁØ 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''°ú °°ÀÌ
¼³Á¤ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
»õ·Î¿î Protocols
Ä¿³Î ³»ºÎ
»õ·Î¿î ÇÁ·ÎÅäÄÝÀ» ±¸ÇöÇÑ´Ù´Â °ÍÀº 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 Ç÷¢ÀÌ
ÁÖ¾îÁø ¹üÀ§¿¡ ´ëÇØ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é
È£ÃâµÇÁö ¾Ê´Â´Ù.
»õ·Î¿î NAT Targets
¸Å¿ì Èï¹Ì·Î¿î ºÎºÐÀ¸·Î, »õ·Î¿î ¸ÊÇΠŸÀÔÀ» Á¦°øÇÏ´Â
»õ·Î¿î NAT targetÀ» ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ±âº»
ÆÐŰÁö¿¡´Â Ãß°¡ targetÀº MASQUERADE¿Í REDIRECTÀ¸·Î
»õ·Î¿î NAT targetÀ» ÀÛ¼ºÇϱ⿡ ÃæºÐÇϸ® ¸¸Å ½±°Ô ¼³¸íµÇ¾î
ÀÖ´Ù.
À§ÀÇ µÎ targetÀº ´Ù¸¥ iptables targetó·³ ÀÛ¼ºµÇ¾î ÀÖÁö¸¸,
³»ºÎÀûÀ¸·Î´Â connectionÀ» ÃßÃâÇϰí `ip_nat_setup_info()'¸¦
È£ÃâÇÑ´Ù.
ÇÁ·ÎÅäÄÝ µµ¿ì¹Ì(protocol helper)
connection tracking¿¡ ´ëÇÑ protocol helper´Â connection
code°¡ ´ÙÁß ³×Æ®¿÷ connectionÀ» »ç¿ëÇÏ´Â ÇÁ·ÎÅäÄÝÀ» ¾Ë¾ÆÂ÷¸®°í
Ãʱ⠿¬°á¿¡ °ü·ÃµÈ `child' connectionÀ» Ç¥½ÃÇÒ ¼ö ÀÖµµ·Ï Çϸç,
ÀϹÝÀûÀ¸·Î ÀÌ¿Í °°Àº °úÁ¤Àº data stream ¿ÜºÎÀÇ °ü·ÃµÈ ÁÖ¼Ò¸¦
ÀÐÀ½À¸·Î½á ¼öÇàµÈ´Ù.
NAT¿¡ ´ëÇÑ protocol helper´Â ´ÙÀ½°ú °°Àº µÎ °¡Áö ÀÛ¾÷À»
¼öÇàÇÑ´Ù. ù °·Î´Â NAT Äڵ尡 µ¥ÀÌÅÍ ½ºÆ®¸²À» Æ÷ÇÔÇÏ´Â
ÁÖ¼Ò¸¦ º¯°æÇϵµ·Ï µ¥ÀÌÅÍ ½ºÆ®¸²À» ó¸®ÇÒ ¼ö
ÀÖµµ·Ï ÇÑ´Ù. µÎ ¹øÂ°·Î´Â µ¥ÀÌÅÍ ½ºÆ®¸²ÀÌ µé¾î¿Ã ¶§ ±×¿Í
¿¬°üµÈ connection¿¡ ´ëÇÏ¿© ¿ø·¡ÀÇ connectionÀ» ±âÃÊ·Î ÇÏ¿©
NAT¸¦ ¼öÇàÇÑ´Ù.
¿¬°á ÃßÀû µµ¿ì¹Ì ¸ðµâ(Connection Tracking Helper Modules)
¼³¸í
connection tracking ¸ðµâÀÇ ÀÓ¹«´Â ¾î¶² ÆÐŶÀÌ À̹Ì
ÀÌ·ç¾îÁø connection¿¡ ¼ÓÇØ ÀÖ´Â Áö¸¦ ¸í½ÃÇÏ´Â °ÍÀ¸·Î,
´ÙÀ½°ú °°Àº ÀÏÀ» ÇÑ´Ù.
¿ì¸® ¸ðµâÀÌ ¾î¶² ÆÐŶ¿¡ °ü½ÉÀ» °¡Áö°í ÀÖ´Â °¡¸¦
netfilter¿¡°Ô ¾Ë·ÁÁØ´Ù.(´ëºÎºÐÀÇ helper´Â ƯÁ¤ÇÑ
Æ÷Æ®¿¡ ´ëÇØ ÀÛ¾÷À» ÇÑ´Ù.)
netfilter¿¡ ÇÔ¼ö¸¦ µî·ÏÇÑ´Ù. ¾Õ¼ ¾ð±ÞÇÑ
¹üÁÖ¿¡ ¼ÓÇÏ´Â ¸ðµç ÆÐŶ¿¡ ´ëÇÏ¿© µî·ÏµÈ
ÇÔ¼ö°¡ È£ÃâµÈ´Ù.
µî·ÏµÈ °÷À¸·ÎºÎÅÍ È£ÃâµÇ´Â
`ip_conntrack_expect_related()' ÇÔ¼ö´Â
netfilter¿¡°Ô ¿¬°üµÈ connectionÀ» ¿¹ÃøÇÒ ¼ö
ÀÖµµ·Ï ¾Ë·ÁÁØ´Ù.
»ç¿ë°¡´ÉÇÑ ±¸Á¶Ã¼¿Í ÇÔ¼ö
¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ Ä¿³Î ¸ðµâÀÇ 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¿¡ ºÎÇÕÇÏ´Â °¢ ÆÐŶ¿¡ ´ëÇÏ¿©
³ÝÇÊÅͰ¡ È£ÃâÇØ¾ßÇÏ´Â ÇÔ¼öÀÌ´Ù.
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);
}
NAT µµ¿ì¹Ì ¸ðµâ
¼³¸í
NAT helper ¸ðµâÀº ƯÁ¤ ÀÀ¿ëÇÁ·Î±×·¥¿¡ ÀûÇÕÇÑ NAT Çڵ鸵À»
¼öÇàÇÑ´Ù. ÀÌ ÇÔ¼ö´Â µ¥ÀÌÅÍ¿¡ ´ëÇÑ on-the-fly 󸮸¦ Æ÷ÇÔÇϰí
ÀÖ´Ù. FTPÀÇ Æ÷Æ® ¸í·ÉÀ» °í·ÁÇØº¸ÀÚ. ÀÌ ¶§, Ŭ¶óÀÌ¾ðÆ®´Â ¼¹ö¿¡°Ô
¾î¶² IP¿Í Æ÷Æ®·Î ¿¬°áÀ» ÇØ¾ß ÇÏ´Â °¡¸¦ ¹°¾îº¸°Ô µÇ°í, FTP Á¦¾î
¿¬°á¿¡¼ PORT ¸í·ÉÀÌ ¼öÇàµÈ ÈÄ FTP helper ¸ðµâÀº IP/port¸¦
±³Ã¼ÇÑ´Ù.
TCP¸¦ ´Ù·ç´Â °æ¿ì´Â »ç¹µ º¹ÀâÇØÁø´Ù. ÀÌÀ¯´Â ÆÐŶ Å©±â°¡ º¯Çϱâ
¶§¹®ÀÌ´Ù. FTPÀÇ ¿¹¸¦ ´Ù½Ã µé¾îº¸¸é, PORT ¸í·ÉÀÌ ¼öÇàµÈ ÈÄ IP/port
tupleÀ» ³ªÅ¸³»´Â ½ºÆ®¸µÀÇ ±æÀ̰¡ º¯ÇÒ °ÍÀÌ´Ù. °á±¹ ÆÐŶ Å©±â°¡
º¯°æµÇ¸é, NAT ¹Ú½ºÀÇ ÁÂÃø°ú ¿ìÃø°£¿¡ syn/ackÀÇ Â÷À̰¡ ¹ß»ýÇÒ
°ÍÀÌ´Ù. ¿¹¸¦ µé¾îº¸¸é, ÆÐŶÀ» 4 octet¸¸Å È®ÀåÇß´Ù¸é, ÀÌÈÄ
°è¼ÓµÇ´Â ÆÐŶÀÇ TCP sequence number¿¡ ¾Õ¼ È®Àå½ÃŲ ¸¸ÅÀÇ
offset¸¦ ´õÇØ¾ß¸¸ ÇÑ´Ù.
¿¬°üµÈ ¸ðµç ÆÐŶ¿¡ ´ëÇÏ¿© Ưº°ÇÑ NAT 󸮰¡ ÇÊ¿äÇÑ °æ¿ìµµ ÀÖ´Ù.
´Ù½Ã±Ý FTP¸¦ ¿¹·Î µé¾îº¸ÀÚ.
control connectionÀÇ PORT¸í·ÉÀ» ¼öÇàÇϴ Ŭ¶óÀÌ¾ðÆ®¿¡ ÀÇÇØ ¾ò¾îÁø
IP/port¿¡ ´ëÇØ DATA connectionÀÇ ¸ðµç ÀÔ·Â ÆÐŶÀº Á¤»óÀûÀÎ table
lookupÀ» °ÅÄ¡´Â °Íº¸´Ù´Â ¹Ýµå½Ã NATµÇ¾î¾ß¸¸ ÇÑ´Ù.
¿¬°üµÈ connectionÀ» À¯¹ßÇÏ´Â ÆÐŶ¿¡ ´ëÇÑ
callback(foo_help)
¿¬°üµÈ ¸ðµç ÆÐŶ¿¡ ´ëÇÑ
callback(foo_nat_expected)
»ç¿ë°¡´ÉÇÑ ±¸Á¶Ã¼¿Í ÇÔ¼ö
¿©·¯ºÐÀÌ ÀÛ¼ºÇÑ nat helper ¸ðµâÀÇ `init()' ÇÔ¼ö´Â `struct
ip_nat_helper'¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î ÇÏ¿©
`ip_nat_helper_register()' ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ÀÎÀÚ°¡ µÇ´Â
±¸Á¶Ã¼´Â ´ÙÀ½°ú °°Àº ¸â¹ö º¯¼ö¸¦ Æ÷ÇÔÇÑ´Ù.
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)À» ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù.
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);
}
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 Ç÷¢À» ¼³Á¤Çϱ⸸ ÇÏ¸é µÈ´Ù.
»õ·Î¿î Netfilter ¸ðµâ ÀÛ¼º
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'ÀÌ´Ù.
Å¥µÈ ÆÐŶÀÇ Ã³¸®
ip_queue¿¡ ÀÇÇØ »ç¿ëµÇ´Â ÀÎÅÍÆäÀ̽º·Î, ÁÖ¾îÁø ÇÁ·ÎÅäÄÝ¿¡
´ëÇÏ¿© ´ë±âµÈ ÆÐŶÀ» ó¸®Çϱâ À§ÇØ µî·ÏÇÒ ¼ö ÀÖ´Ù.
ÆÐŶÀ» ó¸®ÇÏ´Â °ÍÀ» ¹æÁöÇÒ ¼ö ÀÖ´Ù´Â °Í¸¸ »©°í´Â ÈÅÀ»
µî·ÏÇÏ´Â °Í°ú À¯»çÇÑ Àǹ̸¦ °¡Áö¸ç, ÈÅÀÌ `NF_QUEUE'·Î
ÀÀ´äÇÏ´Â ÆÐŶÀ» È®Àθ¸ ÇÒ ¼ö ÀÖ´Ù.
´ë±âµÈ ÆÐŶ¿¡ ´ëÇÑ °ü½ÉÀ» µî·ÏÇϱâ À§ÇØ »ç¿ëÇÏ´Â µÎ°³ÀÇ ÇÔ¼ö´Â
`nf_register_queue_handle()'°ú
`nf_unregister_queue_handler()'ÀÌ´Ù. ¿©·¯ºÐÀÌ µî·ÏÇϰíÀÚ
ÇÏ´Â ÇÔ¼ö´Â `nf_register_queue_handler()' ÇÔ¼ö·Î Àü´ÞµÇ´Â
`void *' Æ÷ÀÎÅÍ¿Í ÇÔ²² È£ÃâµÈ´Ù.
ÇÁ·ÎÅäÄÝÀ» ó¸®Çϱâ À§ÇØ µî·ÏµÈ ÇÔ¼ö°¡ ¾ø´Â °æ¿ì´Â,
NF_QUEUE¸¦ ¸®ÅÏ ÇÏ´Â °ÍÀº NF_DROP¸¦ ¸®ÅÏÇÏ´Â °Í°ú ¸¶Âù°¡Áö°¡
µÈ´Ù.
´ë±âµÈ ÆÐŶ¿¡ ´ëÇÑ °ü½ÉÀ» µî·ÏÇßÀ¸¸é, ÆÐŶÀÌ Å¥À× µÇ±â
½ÃÀÛÇÑ´Ù. ÀÌÁ¦ Å¥À× µÈ ÆÐŶÀ» °¡Áö°í ¹«¾ùÀ» ÇÏ´ø ±×°Ç
¿©·¯ºÐµéÀÇ ¸¾ÀÌÁö¸¸, 󸮰¡ ³¡³ °æ¿ì¿¡´Â ¹Ýµå½Ã
`nf_reject()' ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù(´Ü¼øÈ÷ kfree_skb()¸¦
È£ÃâÇØ¼´Â ¾È µÈ´Ù). skb¸¦ Àç µµÀÔÇÏ´Â °æ¿ì´Â, Å¥À× µÈ
ÆÐŶÀ» skb, Å¥À× µÈ ÆÐŶ¿¡ ÇÒ´çµÈ `struct nf_info'¿Í
ÆÇ°á(verdict)À» Àü´ÞÇÑ´Ù. ±× ÀÌÀ¯´Â, NF_DROPÀº ÆÐŶÀ»
DROP½Ãų °ÍÀ̰í, NF_ACCEPT´Â ÈÅÀ» ÅëÇØ °è¼Ó ¹Ýº¹µÇµµ·Ï ÇÒ
°ÍÀ̰í, NF_QUEUE´Â ÆÐŶÀ» ´Ù½Ã ´ë±â ½Ãų °ÍÀ̰í NF_REPEAT´Â
ÆÐŶÀ» ´ë±â½ÃŲ ÈÅÀÌ ¶Ç ´Ù½Ã °Ë»çÇϵµ·Ï ¸¸µé °ÍÀ̱â
¶§¹®ÀÌ´Ù(ÀÌ ¶§, ¹«ÇÑ·çÇÁ¿¡ ºüÁöÁö ¾Êµµ·Ï Á¶½ÉÇÒ °Í).
`struct nf_info'¸¦ »ìÆìº¸¸é, ÆÐŶ¿¡ ´ëÇÑ ºÎ°¡ÀûÀÎ Á¤º¸,
Áï ÆÐŶÀÌ Á¸ÀçÇß´ø ÀÎÅÍÆäÀ̽º¿Í ÈÅ °°Àº °ÍÀ» ¾òÀ» ¼ö ÀÖ´Ù.
»ç¿ëÀÚ °ø°£À¸·ÎºÎÅÍ ¸í·É¾î Àü´Þ¹Þ±â
NetfilterÀÇ ±¸¼º¿ä¼ÒµéÀÌ »ç¿ëÀÚ°ø°£°ú »óÈ£ÀÛ¿ëÀ» ÇÊ¿ä·Î
ÇÑ´Ù´Â °ÍÀº ¾ÆÁÖ ´ç¿¬ÇÑ ÀÏÀÌ´Ù.
¹æ¹ýÀº setsockopt ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇÏ¿© ÀÌ·± ÀÛ¿ëÀ» ±¸ÇöÇÒ ¼ö
ÀÖ´Ù. ¿©±â¼ ÁÖÀÇÇÒ Á¡Àº °¢ ÇÁ·ÎÅäÄÝÀÌ ÀÌÇØÇÏÁö ¸øÇÏ´Â
setsockopt ³Ñ¹ö¿¡ ´ëÇØ Nf_setsockop()¸¦ È£ÃâÇÒ ¼ö ÀÖµµ·Ï °¢
ÇÁ·ÎÅäÄÝÀÌ ¼öÁ¤µÇ¾î¾ß¸¸Çϸç, ÀÌ´Â IPv4±îÁö À̰í, IPv6¿Í
DECnetÀº ÀÌ¹Ì º¯°æµÇ¾î ÀÖ´Ù.
ÃÖ±Ù¿¡ ¾Ë·ÁÁø ±â¼úÀ» »ç¿ëÇϸé, nf_register_sockopt() ÇÔ¼ö¸¦
»ç¿ëÇÏ¿© `struct nf_sockopt_ops'¸¦ µî·ÏÇϸç, ÀÌ ±¸Á¶Ã¼´Â
´ÙÀ½°ú °°Àº Çʵå·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
list
¸µÅ©µå ¸®½ºÆ®¸¦ »ç¿ëÇϱâ À§ÇÑ °ÍÀ¸·Î, `{
NULL, NULL }'·Î ¼³Á¤µÈ´Ù.
get_optmin
get_optmax
ó¸®ÇØ¾ß ÇÒ getsockoptÀÇ °³¼öÀÇ ¹üÀ§¸¦ ÁöÁ¤ÇÑ´Ù.
Áï 0°ú 0À» »ç¿ëÇϸé ó¸®ÇØ¾ß ÇÒ
getsockoptÀÇ °³¼ö°¡ ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
get
»ç¿ëÀÚµéÀÌ ¿©·¯ºÐµéÀÌ ÀÛ¼ºÇÑ getsockopt Áß
Çϳª¸¦ È£ÃâÇÑ °æ¿ì È£ÃâµÇ´Â ÇÔ¼öÀÌ´Ù. ÀÌ
ÇÔ¼ö ³»ºÎ¿¡¼ »ç¿ëÀÚµéÀÌ NET_ADMINÀÇ ±ÇÇÑÀ»
°¡Áö°í ÀÖ´Â Áö È®ÀÎÇØ¾ß ÇÑ´Ù.
³ª¸ÓÁö µÎ°³ÀÇ Çʵå´Â ³»ºÎÀûÀ¸·Î »ç¿ëµÈ´Ù.
»ç¿ëÀÚ °ø°£¿¡¼ ÆÐŶ ó¸®
libipq ¶óÀ̺귯¸®¿Í `ip_queue' ¸ðµâÀ» »ç¿ëÇϸé, Ä¿³Î¿¡¼ ÇÒ ¼ö
ÀÖ´Â ´ëºÎºÐÀÇ °ÍµéÀ» »ç¿ëÀÚ °ø°£¿¡¼ ¼öÇàÇÒ ¼ö ÀÖ´Ù. À̰ÍÀÌ
´ÙÀ½°ú °°Àº °ÍÀ» ÀǹÌÇÑ´Ù. ¼Óµµ¿¡ ´ëÇÑ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù¸é, »ç¿ëÀÚ
°ø°£¿¡¼ ¿ÏÀüÈ÷ ¿©·¯ºÐµé¸¸ÀÇ Äڵ带 °³¹ßÇÒ ¼ö ÀÖ´Ù. °³¹ßÇϰíÀÚ
ÇÏ´Â ¿©·¯ºÐµéÀÌ Å« ´ë¿ªÀ» ÇÊÅ͸µ ÇϰíÀÚ ÇÏÁö¸¸ ¾Ê´Â´Ù¸é, Ä¿³Î
³»ºÎÀÇ ÆÐŶ ¸Í±Û¸µ¿¡ ºñÇØ ÀÌ ¹æ¹ýÀÌ ¿ùµîÇÏ´Ù´Â °ÍÀ» ¾Ë°Ô µÉ
°ÍÀÌ´Ù.
netfilter ÃÊâ±â¿¡, ÇÊÀÚ´Â iptablesÀÇ Ãʱ⠹öÀüÀ» Æ÷ÆÃ ÇÏ¿© À̸¦
Áõ¸íÇÏ¿´´Ù. netfilter´Â, °³¹ßÀÚµéÀÌ ¿øÇÏ´Â ¾ð¾î°¡ ¹«¾ùÀÌ´ø
°£¿¡, °³¹ßÀÚ ÀÚ½ÅÀÇ ÄÚµå¿Í °íÈ¿À²ÀÇ ³Ý¸Í±Û¸µ ¸ðµâÀ» °³¹ßÇϰíÀÚ ÇÏ´Â »ç¶÷µé¿¡°Ô
¿ÀÇ µÇ¾î ÀÖ´Ù.
Ä¿³Î 2.0/2.2 ÆÐŶ ÇÊÅÍ ¸ðµâ º¯È¯
Æ÷ÆÃÀ» ¾ÆÁÖ ½±°Ô ÇÒ ¼ö ÀÖ´Â ´Ü¼øÇÑ °èÃþ¿¡ ´ëÇØ¼´Â
ip_fw_compat.c¸¦ º¸±â ¹Ù¶õ´Ù.
ÅͳΠÄÚµå °³¹ßÀÚ¸¦ À§ÇÑ 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 µÇ°í ÀÖ´Â ÆÐŶ¿¡ ´ëÇØ ´ÙÀ½°ú °°Àº
ÀýÂ÷¸¦ º¸°Ô µÉ °ÍÀÌ´Ù.
FORWARD hook : normal packet (from eth0 -> tunl0)
LOCAL_OUT hook : encapsulated packet (to eth1)
ÀÀ´ä ÆÐŶ¿¡ ´ëÇØ¼´Â
LOCAL_IN hook: encapsulated reply packet (from eth1)
FORWARD hook: reply packet (from eth1 -> eth0).
½ÃÇèµµ±¸(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 À̸§ÀÌ ÁÖ¾îÁö¸é ÇØ´çÇÏ´Â
Å×½ºÆ®°¡ ¹ß°ßµÉ ¶§±îÁö ´Ù¸¥ Å×½ºÆ®´Â ¸ðµÎ °Ç³Ê¶Ù°Ô µÈ´Ù.
Å×½ºÆ®¸¦ À§ÇÑ ½ºÅ©¸³Æ® ÀÛ¼º
¿ì¼± Àû´çÇÑ µð·ºÅ丮¿¡ »õ·Î¿î ÆÄÀÏÀ» »ý¼ºÇϰí, ÀûÀýÇÑ ½Ã±â¿¡
½ÇÇàÇÒ ¼ö ÀÖµµ·Ï ¹øÈ£¸¦ ºÎ¿©ÇÑ´Ù. ¿¹¸¦ µé¾îº¸¸é, 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À» Áö¿øÇÏÁö ¾Ê´Â´Ù.
º¯¼ö¿Í ȯ°æ
ÀÏ´Ü tap0¿Í tap1À̶ó´Â µÎ°³ÀÇ ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í ÀÖ´Ù. °¢
ÀÎÅÍÆäÀ̽ºÀÇ ÁÖ¼Ò´Â $TAP0¿Í $TAP1À̶ó´Â º¯¼ö¿¡ ÀúÀåµÇ¾î ÀÖÀ¸¸ç,
³Ý¸Å½ºÅ©´Â ¸ðµÎ 255.255.255.0ÀÌ´Ù. networkÀº $TAP0NET°ú
$TAP1NET¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.
$TMPFILEÀº ÀÓ½ÃÆÄÀÏ·Î, Å×½ºÆ®°¡ Á¾·áµÇ´Â ½ÃÁ¡¿¡¼ »èÁ¦µÈ´Ù.
¿©·¯ºÐÀÇ ½ºÅ©¸³Æ®´Â testsuite/ µð·ºÅ丮ºÎÅÍ ½ÃÀÛÇØ¼, ½ºÅ©¸³Æ®°¡
Á¸ÀçÇÏ´Â ¸ðµç µð·ºÅ丮¸¦ ã¾Æ°¡°Ô µÈ´Ù. Áï ¿©·¯ºÐµéÀº
iptables°°Àº µµ±¸¸¦ ½ÇÇà½Ã۱â À§Çؼ´Â `../userspace'·Î
½ÃÀÛÇÏ´Â path¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.
$VERBOSE¸¦ ¼³Á¤ÇØ ³õÀ¸¸é ¿©·¯ºÐÀÇ ½ºÅ©¸³Æ®´Â º¸´Ù ¸¹Àº Á¤º¸¸¦
Ãâ·ÂÇϰԵȴÙ. Áï, command line¿¡¼ `-v' ¿É¼ÇÀ» ÁØ °Í°ú µ¿ÀÏÇÑ
È¿°ú°¡ µÈ´Ù.
À¯¿ëÇÑ µµ±¸µé
``tools'' µð·ºÅ丮¿¡´Â ¾µ¸¸ÇÑ testsuite µµ±¸°¡ ¸î °³ ÀÖÀ¸¸ç, °¢
µµ±¸´Â ¹®Á¦°¡ ¹ß»ýÇÑ °æ¿ì non-zero exit status¸¦ ¹ß»ý½Ã۸ç
Á¾·áÇÑ´Ù.
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 ÆÐŶÀÇ ºÎÇϸ¦
ÀǹÌÇÑ´Ù.
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
get_err
Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ÆÐŶ(¿¹¸¦ µé¸é, gen_ip·Î »ý¼ºµÈ ÆÐŶ)À»
ÃëÇϰí, ICMP ¿¡·¯·Î º¯È¯½ÃŲ´Ù.
¼¼°³ÀÇ Àü´ÞÀÎÀÚ·Î ¼Ò½º IP ÁÖ¼Ò, ŸÀÔ°ú Äڵ带 ¹Þ´Â´Ù.
¸ñÀûÁö ÀÔ·ÂÀº Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ¹ÞÀº ¼Ò½º IP ÁÖ¼Ò·Î
¼³Á¤µÈ´Ù.
local_ip
Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ÆÐŶÀ» ¾ò¾î¼ raw ¼ÒÄÏÀ¸·Î Àü´ÞÇÑ´Ù.
·ÎÄÿ¡¼ »ý¼ºµÈ ÆÐŶÀÇ ¸ð¾çÀ» º¸¿©ÁØ´Ù(ethertap ÀåÄ¡ Áß
Çϳª·Î ÀÔ·ÂµÈ ÆÐŶÀ¸·ÎºÎÅÍ ºÐ¸®ÇÏ´Â °æ¿ì, ¿ÜºÎ¿¡¼ »ý¼ºµÈ
ÆÐŶó·³ º¸ÀδÙ).
»ý°¢³ª´Â ´ë·Î ÇÏ´Â Ãæ°í
¸ðµç µµ±¸´Â ÀÐ°í ¾²±â¸¦ Çѹø ÇÒ ¶§ ¸ðµç °ÍÀ» ÇÒ ¼ö ÀÖ´Ù°í
°¡Á¤ÇÑ´Ù. Áï ethertap ÀåÄ¡¿¡ ´ëÇØ¼´Â »ç½ÇÀÌÁö¸¸, pipe¸¦
ÀÌ¿ëÇÏ¿© ¾à°£ º¹ÀâÇÑ ÀÛ¾÷À» ÇÒ ¶§´Â ¹Ýµå½Ã ¿Ç´Ù°í ¸»ÇÒ ¼ö´Â
¾ø´Ù.
ÆÐŶÀ» ÀÚ¸£±â À§Çؼ dd¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. dd´Â ÀÏȸ¼º ÀÛ¾÷À¸·Î
ÆÐŶÀ» Ãâ·ÂÇϱâ À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Â obs(output block size)¶ó´Â
¿É¼ÇÀÌ ÀÖ´Ù.
ù ¹øÂ°¿¡ ¼º°øÇϵµ·Ï Å×½ºÆ®ÇÏ´Â °ÍÀÌ ÁÁ´Ù. Áï, ÆÐŶÀÌ
¼º°øÀûÀ¸·Î ºí·° µÇµµ·Ï Å×½ºÆ®ÇØ¾ß ÇÑ´Ù. óÀ½¿¡´Â ÆÐŶÀÌ Á¤»óÀûÀ¸·Î Åë°úÇϵµ·Ï
Å×½ºÆ®¸¦ ÇÏ°í ³ª¼, ÀϺΠÆÐŶÀÌ ºí·° µÇµµ·Ï Å×½ºÆ®ÇØ¾ß ÇÑ´Ù.
±×·¸Áö ¾ÊÀ¸¸é, ¾û¶×ÇÑ ¿À·ù·Î ÀÎÇØ ÆÐŶÀÌ ÁøÇàÇÏ´Â °ÍÀ» ÁßÁö½Ãų ¼ö
µµ ÀÖ´Ù.
¾Æ¹«°Å³ª ¸· º¸³»°í ³ª¼ ¾î¶² °á°ú°¡ ÀϾ´Â È®ÀÎÇÏÁö ¸»°í,
Á¤È®ÇÑ Å×½ºÆ®¸¦ ÇÒ ¼ö ÀÖµµ·Ï ÇØ¾ßÇÑ´Ù. Á¤È®ÇÑ Å×½ºÆ®°¡ Àß ¸øµÈ
°æ¿ì¶ó¸é, ¹«¾ùÀÌ Àß ¸ø µÇ¾ú´ÂÁö ¾Ë ¼ö ÀÖÁö¸¸, ·£´ý Å×½ºÆ®°¡ À߸ø
µÇ¸é ÀüÇô µµ¿òÀÌ µÇÁö ¾Ê´Â´Ù.
¾Æ¹«·± ¸Þ½ÃÁöµµ ³²±âÁö ¾Ê°í Å×½ºÆ®°¡ ½ÇÆÐÇÑ °æ¿ì, ¾î¶² ¸í·ÉÀÌ
½ÇÇàµÇ°í ÀÖ´ÂÁö ¾Ë¾Æº¸±â À§ÇØ ½ºÅ©¸³Æ®ÀÇ ¸Ç À§¿¡ `-x'¸¦ Ãß°¡
ÇÒ ¼ö ÀÖ´Ù. Áï, `#!/bin/sh -x'.
Å×½ºÆ®°¡ ºÒ±ÔÄ¢ÀûÀ¸·Î ½ÇÆÐÇϸé, ¸ðµç ¿ÜºÎ ÀåÄ¡¸¦ Â÷´ÜÇϰųª ÇÏ´Â
½ÄÀ¸·Î, ·£´ý ³×Æ®¿÷ Æ®·¡ÇÈ¿¡ ´ëÇÏ¿©
È®ÀÎÇØ º¸´Â °ÍÀÌ ÁÁ´Ù. ¿¹¸¦ µé¸é,Andrew Tridgelló·³ µ¿ÀÏÇÑ
³×Æ®¿÷ »ó¿¡ ÀÖÀ¸¸é, À©µµ¿ìÀÇ ºê·Îµå ij½ºÆÃ¿¡ ÀÇÇØ ¼ö¸¹Àº °£¼·À»
¹Þ°Ô µÈ´Ù.
°³¹ß µ¿±â
ÇÊÀÚ°¡ 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¸¦ ´Ù½Ã ÀÛ¼ºÇÑ »ç¶÷ÀÌ ¾Æ´Ï¶ó´Â °ÍÀ» ¾Ë¾ÆÁֱ⠹ٶõ´Ù. Áï
ÇÊÀÚ´Â ´õ ÀÌ»ó ¸Å½ºÄ¿·¹À̵ùÀ» »ç¿ëÇÏÁö ¾Ê°í, ´ç½Ã ±âÁ¸ÀÇ Äڵ带 »ìÆìº¸Áöµµ
¾Ê¾Ò´Ù. ¾Æ¸¶µµ À̰ÍÀÌ ³»°¡ »ý°¢ÇÑ °Íº¸´Ù ¸¹Àº ½Ã°£ÀÌ ¼Ò¿äµÈ ÀÌÀ¯ÀÏ
°ÍÀÌ´Ù. ÇÏÁö¸¸ ÇÊÀÚÀÇ °ßÇØ·Î´Â °á°ú´Â ²Ï ÁÁ¾Ò°í, ¸¹Àº °ÍÀ» ¹è¿ï ¼ö
ÀÖ¾ú´Ù. ¾ó¸¶³ª ¸¹Àº »ç¶÷µéÀÌ »ç¿ëÇϰí ÀÖ´Â Áö ¾Ë°Ô µÇ¸é, µÎ ¹øÂ°
¹öÀüÀº ÈξÀ ´õ ÁÁ¾Æ Áú °ÍÀ̶ó´Â Á¡Àº ¹Ï¾î ÀǽÉÄ¡ ¾Ê´Â´Ù.
°¨»çÀÇ ¸»
µµ¿ÍÁֽЏðµç ºÐµé¿¡°Ô °¨»ç µå¸®¸ç, ƯÈ÷ protocol helpers¸¦ ÀÛ¼ºÇØ
ÁֽŠHarald Welte¿¡°Ô °¨»ç µå¸³´Ï´Ù.