๐Ÿ›ก๏ธ ๊ฐ„๋‹จํ•œ ๋ฐฉํ™”๋ฒฝ ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ: C์–ธ์–ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ์˜ ์ฒซ๊ฑธ์Œ ๐Ÿ›ก๏ธ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ›ก๏ธ ๊ฐ„๋‹จํ•œ ๋ฐฉํ™”๋ฒฝ ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ: C์–ธ์–ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ์˜ ์ฒซ๊ฑธ์Œ ๐Ÿ›ก๏ธ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฏธ๋ž˜์˜ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์•„์ฃผ ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋ ค๊ณ  ํ•ด์š”. ๋ฐ”๋กœ C์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•œ ๋ฐฉํ™”๋ฒฝ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๐Ÿ–ฅ๏ธ๐Ÿ’ป

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ '๋ฐฉํ™”๋ฒฝ'์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋“ค์–ด๋ณด์…จ๋‚˜์š”? ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ์˜ ํ•ต์‹ฌ ์š”์†Œ์ธ ๋ฐฉํ™”๋ฒฝ์€ ์šฐ๋ฆฌ์˜ ๋””์ง€ํ„ธ ์ƒํ™œ์„ ๋ณดํ˜ธํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ง‘ ์ฃผ๋ณ€์— ์šธํƒ€๋ฆฌ๋ฅผ ์น˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๋ฐฉํ™”๋ฒฝ์€ ์šฐ๋ฆฌ์˜ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ ์ฃผ๋ณ€์— ๋ณด์ด์ง€ ์•Š๋Š” ์šธํƒ€๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฑฐ์ฃ !

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” C์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉํ™”๋ฒฝ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๋ถ„์ด๋ผ๋„ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋งˆ์น˜ ๋ ˆ๊ณ  ๋ธ”๋ก์„ ์กฐ๋ฆฝํ•˜๋“ฏ์ด, ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด ๋“œ๋ฆด ํ…Œ๋‹ˆ๊นŒ์š”! ๐Ÿ˜Š

๊ทธ๋ฆฌ๊ณ  ์ž ๊น! ์—ฌ๋Ÿฌ๋ถ„, ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์ด๋ผ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ์ด๊ณณ์€ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๊ณ  ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ํ”Œ๋žซํผ์ด์—์š”. ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋Š˜ ๋ฐฐ์šธ ๋ฐฉํ™”๋ฒฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ skills๋„ ์–ธ์  ๊ฐ€ ์žฌ๋Šฅ๋„ท์—์„œ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ์ฆ๊ฑฐ์›€์„ ๋Š๊ปด๋ด์š”! ๐ŸŒฑ

์ž, ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ์ƒ๋ ฅ๊ณผ ์ฐฝ์˜๋ ฅ์„ ๋งˆ์Œ๊ป ๋ฐœํœ˜ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's dive in! ๐ŸŠโ€โ™‚๏ธ

๐Ÿ” ๋ฐฉํ™”๋ฒฝ์˜ ๊ธฐ๋ณธ ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ

๋จผ์ €, ๋ฐฉํ™”๋ฒฝ์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๋ฐฉํ™”๋ฒฝ์€ ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ์„ ์œ„ํ•œ ํ•˜๋“œ์›จ์–ด ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์ด์—์š”. ์ฃผ์š” ๋ชฉ์ ์€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ(์˜ˆ: ์ธํ„ฐ๋„ท) ์‚ฌ์ด์˜ ์žฅ๋ฒฝ ์—ญํ• ์„ ํ•˜๋Š” ๊ฑฐ์ฃ .

๋ฐฉํ™”๋ฒฝ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”:

  • ๐Ÿšซ ํŒจํ‚ท ํ•„ํ„ฐ๋ง: ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์‚ฌ์ „ ์ •์˜๋œ ๋ณด์•ˆ ๊ทœ์น™์— ๋”ฐ๋ผ ํŒจํ‚ท์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ”’ ์ ‘๊ทผ ์ œ์–ด: ํŠน์ • IP ์ฃผ์†Œ, ํฌํŠธ, ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ“ ๋กœ๊น…: ๋„คํŠธ์›Œํฌ ํ™œ๋™์„ ๊ธฐ๋กํ•˜์—ฌ ๋ณด์•ˆ ๋ถ„์„ ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ•ต๏ธ ์ƒํƒœ ๊ฒ€์‚ฌ: ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜์—ฌ ๋” ์ •๊ตํ•œ ํ•„ํ„ฐ๋ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ๊ฐ„๋‹จํ•œ ๋ฐฉํ™”๋ฒฝ ํ”„๋กœ๊ทธ๋žจ์€ ์ด ์ค‘์—์„œ ํŒจํ‚ท ํ•„ํ„ฐ๋ง๊ณผ ๊ธฐ๋ณธ์ ์ธ ์ ‘๊ทผ ์ œ์–ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ๋ฌธ์ง€๊ธฐ์ฒ˜๋Ÿผ "๋ˆ„๊ตฌ์„ธ์š”?"๋ผ๊ณ  ๋ฌผ์–ด๋ณด๊ณ , ์•ˆ์ „ํ•œ ์†๋‹˜๋งŒ ๋“ค์—ฌ๋ณด๋‚ด๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฑฐ์ฃ ! ๐Ÿšช๐Ÿ‘ฎโ€โ™‚๏ธ

์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: ๋ฐฉํ™”๋ฒฝ์ด๋ผ๋Š” ์šฉ์–ด๋Š” ์‹ค์ œ ๊ฑด๋ฌผ์—์„œ ํ™”์žฌ์˜ ํ™•์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” '๋ฐฉํ™”๋ฒฝ'์—์„œ ์œ ๋ž˜ํ–ˆ์–ด์š”. ์ปดํ“จํ„ฐ ์„ธ๊ณ„์—์„œ๋„ ์ด์™€ ๋น„์Šทํ•˜๊ฒŒ '๋””์ง€ํ„ธ ํ™”์žฌ'(๋ณด์•ˆ ์œ„ํ˜‘)์˜ ํ™•์‚ฐ์„ ๋ง‰๋Š” ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์ฃ !

์ด์ œ ๋ฐฉํ™”๋ฒฝ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ดํ•ดํ•˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€ ๋ณผ๊นŒ์š”? C์–ธ์–ด๋กœ ์ด๋Ÿฐ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•จ๊ป˜ ์•Œ์•„๋ณด์•„์š”! ๐Ÿš€

๐Ÿ› ๏ธ C์–ธ์–ด๋กœ ๋ฐฉํ™”๋ฒฝ ๊ตฌํ˜„ํ•˜๊ธฐ: ๊ธฐ๋ณธ ๊ตฌ์กฐ ์„ค๊ณ„

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ C์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•œ ๋ฐฉํ™”๋ฒฝ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์šฐ๋ฆฌ์˜ ๋ฐฉํ™”๋ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ๊ฑฐ์˜ˆ์š”:

  1. ํŒจํ‚ท ์บก์ฒ˜ ๋ฐ ๋ถ„์„
  2. ๊ทœ์น™ ์ •์˜ ๋ฐ ์ ์šฉ
  3. ํŒจํ‚ท ํ•„ํ„ฐ๋ง
  4. ๋กœ๊น…

๊ฐ ๋‹จ๊ณ„๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋ฉด์„œ, ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”? ๐Ÿ˜ƒ

1. ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ ํฌํ•จํ•˜๊ธฐ

๋จผ์ €, ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์— ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ๋“ค์„ ํฌํ•จ์‹œ์ผœ์•ผ ํ•ด์š”. ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฑฐ์˜ˆ์š”.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <netinet/ip_icmp.h>
#include <netinet/if_ether.h>
#include <net/ethernet.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pcap.h>
  

์ด ํ—ค๋” ํŒŒ์ผ๋“ค์€ ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•ด์š”:

  • stdio.h, stdlib.h, string.h: ๊ธฐ๋ณธ์ ์ธ ์ž…์ถœ๋ ฅ, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋“ค์„ ์ œ๊ณตํ•ด์š”.
  • unistd.h: POSIX ์šด์˜ ์ฒด์ œ API์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ด์š”.
  • netinet/ip.h, netinet/tcp.h, netinet/udp.h, netinet/ip_icmp.h: IP, TCP, UDP, ICMP ํ”„๋กœํ† ์ฝœ ๊ด€๋ จ ๊ตฌ์กฐ์ฒด์™€ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•ด์š”.
  • netinet/if_ether.h, net/ethernet.h: ์ด๋”๋„ท ํ”„๋ ˆ์ž„ ๊ด€๋ จ ์ •์˜๋ฅผ ํฌํ•จํ•ด์š”.
  • sys/socket.h, arpa/inet.h: ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ IP ์ฃผ์†Œ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด์š”.
  • pcap.h: ํŒจํ‚ท ์บก์ฒ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ libpcap์˜ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”.

์ด ํ—ค๋” ํŒŒ์ผ๋“ค์€ ๋งˆ์น˜ ์š”๋ฆฌ์— ํ•„์š”ํ•œ ์žฌ๋ฃŒ๋“ค์„ ์ค€๋น„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ๋ฐฉํ™”๋ฒฝ ํ”„๋กœ๊ทธ๋žจ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์ด์ฃ !

2. ์ƒ์ˆ˜ ๋ฐ ๊ตฌ์กฐ์ฒด ์ •์˜ํ•˜๊ธฐ

๋‹ค์Œ์œผ๋กœ, ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ๋ช‡ ๊ฐ€์ง€ ์ƒ์ˆ˜์™€ ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•  ๊ฑฐ์˜ˆ์š”.


#define MAX_PACKET_SIZE 65536
#define MAX_RULES 100

// ๊ทœ์น™ ๊ตฌ์กฐ์ฒด ์ •์˜
typedef struct {
    char source_ip[16];
    char dest_ip[16];
    int source_port;
    int dest_port;
    char protocol[8];
    char action[8];
} Rule;

// ์ „์—ญ ๋ณ€์ˆ˜๋กœ ๊ทœ์น™ ๋ฐฐ์—ด ์„ ์–ธ
Rule rules[MAX_RULES];
int rule_count = 0;
  

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š”:

  • MAX_PACKET_SIZE: ์ตœ๋Œ€ ํŒจํ‚ท ํฌ๊ธฐ๋ฅผ 65536 ๋ฐ”์ดํŠธ๋กœ ์ •์˜ํ–ˆ์–ด์š”. ์ด๋Š” ์ผ๋ฐ˜์ ์ธ ์ด๋”๋„ท ์ ๋ณด ํ”„๋ ˆ์ž„์˜ ์ตœ๋Œ€ ํฌ๊ธฐ์˜ˆ์š”.
  • MAX_RULES: ์ตœ๋Œ€ ๊ทœ์น™ ์ˆ˜๋ฅผ 100๊ฐœ๋กœ ์ œํ•œํ–ˆ์–ด์š”. ํ•„์š”์— ๋”ฐ๋ผ ์ด ๊ฐ’์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • Rule ๊ตฌ์กฐ์ฒด: ๊ฐ ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์ฒด์˜ˆ์š”. ์ถœ๋ฐœ์ง€ IP, ๋ชฉ์ ์ง€ IP, ์ถœ๋ฐœ์ง€ ํฌํŠธ, ๋ชฉ์ ์ง€ ํฌํŠธ, ํ”„๋กœํ† ์ฝœ, ๊ทธ๋ฆฌ๊ณ  action(ํ—ˆ์šฉ ๋˜๋Š” ์ฐจ๋‹จ)์„ ํฌํ•จํ•ด์š”.
  • rules ๋ฐฐ์—ด: ๋ชจ๋“  ๊ทœ์น™์„ ์ €์žฅํ•  ์ „์—ญ ๋ฐฐ์—ด์ด์—์š”.
  • rule_count: ํ˜„์žฌ ์ •์˜๋œ ๊ทœ์น™์˜ ์ˆ˜๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ณ€์ˆ˜์˜ˆ์š”.

์ด๋ ‡๊ฒŒ ์ •์˜ํ•œ ๊ตฌ์กฐ์ฒด์™€ ์ƒ์ˆ˜๋“ค์€ ์šฐ๋ฆฌ ๋ฐฉํ™”๋ฒฝ์˜ '๋ผˆ๋Œ€'๊ฐ€ ๋˜์–ด์ค„ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์ง‘์„ ์ง€์„ ๋•Œ ๊ธฐ์ดˆ ๊ณต์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ !

๐ŸŽจ ์ฐฝ์˜๋ ฅ ๋ฐœํœ˜ํ•˜๊ธฐ: ์—ฌ๋Ÿฌ๋ถ„, ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์ •์˜ํ•  ๋•Œ ์–ด๋–ค ์ถ”๊ฐ€์ ์ธ ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๊ทœ์น™์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์•„์ด๋””์–ด๋ฅผ ์žฌ๋Šฅ๋„ท ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์˜๊ฒฌ๋„ ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

์ด์ œ ์šฐ๋ฆฌ ๋ฐฉํ™”๋ฒฝ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๊ฐ€ ๊ฐ–์ถฐ์กŒ์–ด์š”. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ์‹ค์ œ๋กœ ํŒจํ‚ท์„ ์บก์ฒ˜ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ณ„์†ํ•ด์„œ ๋‚˜์•„๊ฐ€๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿ“ฆ ํŒจํ‚ท ์บก์ฒ˜ ๋ฐ ๋ถ„์„ ๊ตฌํ˜„ํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ ๋ฐฉํ™”๋ฒฝ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ ํŒจํ‚ท ์บก์ฒ˜์™€ ๋ถ„์„์„ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด ๋ถ€๋ถ„์€ ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ๋„คํŠธ์›Œํฌ ํƒ์ •์ด ๋˜์–ด ์ง€๋‚˜๊ฐ€๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”! ๐Ÿ•ต๏ธโ€โ™‚๏ธ

1. libpcap ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ

๋จผ์ €, libpcap ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—ด๊ณ  ํŒจํ‚ท ์บก์ฒ˜๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•ด์š”.


pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
char filter_exp[] = "ip";
bpf_u_int32 net;

// ๋„คํŠธ์›Œํฌ ๋””๋ฐ”์ด์Šค ์—ด๊ธฐ
handle = pcap_open_live("eth0", BUFSIZ, 1, 1000, errbuf);
if (handle == NULL) {
    fprintf(stderr, "Couldn't open device eth0: %s\n", errbuf);
    return 2;
}

// ์ปดํŒŒ์ผ ๋ฐ ํ•„ํ„ฐ ์ ์šฉ
if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
    fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
    return 2;
}
if (pcap_setfilter(handle, &fp) == -1) {
    fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
    return 2;
}
  

์ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”:

  • pcap_open_live(): "eth0" ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—ด์–ด์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด์š”.
  • pcap_compile() ๋ฐ pcap_setfilter(): "ip" ํ•„ํ„ฐ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์ ์šฉํ•ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด IP ํŒจํ‚ท๋งŒ ์บก์ฒ˜ํ•˜๊ฒŒ ๋ผ์š”.

์ด ๊ณผ์ •์€ ๋งˆ์น˜ ๋ง์›๊ฒฝ์„ ์„ค์น˜ํ•˜๊ณ  ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ํŒจํ‚ท๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•˜๋Š” ๊ฑฐ์ฃ !

2. ํŒจํ‚ท ์บก์ฒ˜ ๋ฐ ๋ถ„์„ ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

์ด์ œ ์‹ค์ œ๋กœ ํŒจํ‚ท์„ ์บก์ฒ˜ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”.


void packet_handler(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) {
    struct ether_header *eth_header;
    struct ip *ip_header;
    struct tcphdr *tcp_header;
    struct udphdr *udp_header;
    char source_ip[INET_ADDRSTRLEN];
    char dest_ip[INET_ADDRSTRLEN];
    int source_port, dest_port;

    // ์ด๋”๋„ท ํ—ค๋” ํŒŒ์‹ฑ
    eth_header = (struct ether_header *) packet;
    if (ntohs(eth_header->ether_type) != ETHERTYPE_IP) {
        printf("Not an IP packet. Skipping...\n");
        return;
    }

    // IP ํ—ค๋” ํŒŒ์‹ฑ
    ip_header = (struct ip *)(packet + sizeof(struct ether_header));
    inet_ntop(AF_INET, &(ip_header->ip_src), source_ip, INET_ADDRSTRLEN);
    inet_ntop(AF_INET, &(ip_header->ip_dst), dest_ip, INET_ADDRSTRLEN);

    // TCP ๋˜๋Š” UDP ํ—ค๋” ํŒŒ์‹ฑ
    if (ip_header->ip_p == IPPROTO_TCP) {
        tcp_header = (struct tcphdr *)(packet + sizeof(struct ether_header) + sizeof(struct ip));
        source_port = ntohs(tcp_header->th_sport);
        dest_port = ntohs(tcp_header->th_dport);
        printf("TCP Packet: %s:%d -> %s:%d\n", source_ip, source_port, dest_ip, dest_port);
    } else if (ip_header->ip_p == IPPROTO_UDP) {
        udp_header = (struct udphdr *)(packet + sizeof(struct ether_header) + sizeof(struct ip));
        source_port = ntohs(udp_header->uh_sport);
        dest_port = ntohs(udp_header->uh_dport);
        printf("UDP Packet: %s:%d -> %s:%d\n", source_ip, source_port, dest_ip, dest_port);
    } else {
        printf("Not a TCP or UDP packet. Protocol: %d\n", ip_header->ip_p);
    }

    // ์—ฌ๊ธฐ์— ๊ทœ์น™ ๊ฒ€์‚ฌ ๋ฐ ํ•„ํ„ฐ๋ง ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •
}
  

์ด packet_handler ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”:

  1. ์ด๋”๋„ท ํ—ค๋”๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ IP ํŒจํ‚ท์ธ์ง€ ํ™•์ธํ•ด์š”.
  2. IP ํ—ค๋”๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€ IP ์ฃผ์†Œ๋ฅผ ์ถ”์ถœํ•ด์š”.
  3. ํ”„๋กœํ† ์ฝœ์ด TCP์ธ์ง€ UDP์ธ์ง€ ํ™•์ธํ•˜๊ณ , ํ•ด๋‹นํ•˜๋Š” ํ—ค๋”๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ํฌํŠธ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ด์š”.
  4. ์ถ”์ถœํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด์š”.

์ด ํ•จ์ˆ˜๋Š” ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์šฐ์ฒด๊ตญ์—์„œ ํŽธ์ง€๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ๊ฐ ํŒจํ‚ท(ํŽธ์ง€)์˜ ๋ฐœ์‹ ์ž, ์ˆ˜์‹ ์ž, ์ข…๋ฅ˜ ๋“ฑ์„ ํ™•์ธํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฑฐ์ฃ !

๐Ÿ’ก ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ž‘์€ ์กฐ๊ฐ(ํŒจํ‚ท)์œผ๋กœ ๋‚˜๋‰˜์–ด ์ „์†ก๋ผ์š”. ์šฐ๋ฆฌ์˜ ๋ฐฉํ™”๋ฒฝ์€ ์ด ํŒจํ‚ท๋“ค์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ๋ณด์•ˆ ๊ฒ€์ƒ‰๋Œ€๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์—ฌํ–‰ ๊ฐ€๋ฐฉ๋“ค์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿงณโœˆ๏ธ

3. ๋ฉ”์ธ ๋ฃจํ”„ ๊ตฌํ˜„ํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ์˜ ํŒจํ‚ท ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ง€์†์ ์œผ๋กœ ํŒจํ‚ท์„ ์บก์ฒ˜ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ฉ”์ธ ๋ฃจํ”„๋ฅผ ๊ตฌํ˜„ํ•ด๋ณผ๊ฒŒ์š”.


int main() {
    // ... (์ด์ „์— ์ž‘์„ฑํ•œ libpcap ์ดˆ๊ธฐํ™” ์ฝ”๋“œ) ...

    printf("Starting packet capture. Press Ctrl+C to stop.\n");

    // ํŒจํ‚ท ์บก์ฒ˜ ์‹œ์ž‘
    pcap_loop(handle, -1, packet_handler, NULL);

    // ์ •๋ฆฌ
    pcap_freecode(&fp);
    pcap_close(handle);

    return 0;
}
  

์ด ๋ฉ”์ธ ํ•จ์ˆ˜๋Š”:

  • pcap_loop()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฌดํ•œํžˆ(-1) ํŒจํ‚ท์„ ์บก์ฒ˜ํ•˜๊ณ  ์šฐ๋ฆฌ์˜ packet_handler ํ•จ์ˆ˜๋กœ ๊ฐ ํŒจํ‚ท์„ ์ฒ˜๋ฆฌํ•ด์š”.
  • ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋ฉด ์‚ฌ์šฉํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•ด์š”.

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์šฐ๋ฆฌ์˜ ๋ฐฉํ™”๋ฒฝ์€ ๋Š์ž„์—†์ด ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ฒŒ ๋ผ์š”. ๋งˆ์น˜ 24์‹œ๊ฐ„ ๊ทผ๋ฌดํ•˜๋Š” ๊ฒฝ๋น„์›์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ‘ฎโ€โ™‚๏ธ๐Ÿ”

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ํŒจํ‚ท์„ ์บก์ฒ˜ํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์–ด์š”. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ๋กœ ํŒจํ‚ท์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ํฅ๋ฏธ์ง„์ง„ํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜ƒ

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์ด ๊ณผ์ •์—์„œ ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ์งˆ๋ฌธํ•ด์ฃผ์„ธ์š”. ๋˜ํ•œ, ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ์•„์ด๋””์–ด๋กœ ์ด ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”! ๐ŸŒŸ

๐Ÿšฆ ๊ทœ์น™ ์ •์˜ ๋ฐ ํŒจํ‚ท ํ•„ํ„ฐ๋ง ๊ตฌํ˜„ํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ ๋ฐฉํ™”๋ฒฝ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ ํŒจํ‚ท ํ•„ํ„ฐ๋ง์„ ๊ตฌํ˜„ํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ์ด ๋ถ€๋ถ„์€ ๋งˆ์น˜ ๊ตํ†ต๊ฒฝ์ฐฐ์ด ๋˜์–ด ์ฐจ๋Ÿ‰(ํŒจํ‚ท)์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ†ต๊ณผ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”! ๐Ÿš“

1. ๊ทœ์น™ ์ถ”๊ฐ€ ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

๋จผ์ €, ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”.


int add_rule(const char *source_ip, const char *dest_ip, int source_port, int dest_port, const char *protocol, const char *action) {
    if (rule_count >= MAX_RULES) {
        printf("Maximum number of rules reached.\n");
        return -1;
    }

    Rule *rule = &rules[rule_count];
    strncpy(rule->source_ip, source_ip, sizeof(rule->source_ip));
    strncpy(rule->dest_ip, dest_ip, sizeof(rule->dest_ip));
    rule->source_port = source_port;
    rule->dest_port = dest_port;
    strncpy(rule->protocol, protocol, sizeof(rule->protocol));
    strncpy(rule->action, action, sizeof(rule->action));

    rule_count++;
    printf("Rule added successfully. Total rules: %d\n", rule_count);
    return 0;
}
  

์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”:

  • ์ƒˆ๋กœ์šด ๊ทœ์น™์„ rules ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ด์š”.
  • ๊ทœ์น™์˜ ๊ฐ ํ•„๋“œ(์ถœ๋ฐœ์ง€ IP, ๋ชฉ์ ์ง€ IP, ํฌํŠธ, ํ”„๋กœํ† ์ฝœ, ์•ก์…˜)๋ฅผ ์„ค์ •ํ•ด์š”.
  • ๊ทœ์น™ ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์„ฑ๊ณต ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์š”.

์ด ํ•จ์ˆ˜๋Š” ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ๊ตํ†ต ๊ทœ์น™์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. "์ด ์ฐจ์„ ์€ ์Šน์šฉ์ฐจ๋งŒ ๋‹ค๋‹ ์ˆ˜ ์žˆ์–ด์š”", "์ € ๋„๋กœ๋Š” ์†๋„ ์ œํ•œ์ด 60km/h์˜ˆ์š”" ๊ฐ™์€ ๊ทœ์น™์„ ๋งŒ๋“œ๋Š” ๊ฑฐ์ฃ !

2. ํŒจํ‚ท ํ•„ํ„ฐ๋ง ํ•จ์ˆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

์ด์ œ ์บก์ฒ˜ํ•œ ํŒจํ‚ท์ด ์šฐ๋ฆฌ์˜ ๊ทœ์น™์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”.


int check_packet(const char *source_ip, const char *dest_ip, int source_port, int dest_port, const char *protocol) {
    for (int i = 0; i < rule_count; i++) {
        Rule *rule = &rules[i];
        
        // IP ์ฃผ์†Œ ๊ฒ€์‚ฌ
        if (strcmp(rule->source_ip, "*") != 0 && strcmp(rule->source_ip, source_ip) != 0) continue;
        if (strcmp(rule->dest_ip, "*") != 0 && strcmp(rule->dest_ip, dest_ip) != 0) continue;
        
        // ํฌํŠธ ๊ฒ€์‚ฌ
        if (rule->source_port != -1 && rule->source_port != source_port) continue;
        if (rule->dest_port != -1 && rule->dest_port != dest_port) continue;
        
        // ํ”„๋กœํ† ์ฝœ ๊ฒ€์‚ฌ
        if (strcmp(rule->protocol, "*") != 0 && strcmp(rule->protocol, protocol) != 0) continue;
        
        // ๊ทœ์น™์— ๋งค์น˜๋˜๋ฉด ํ•ด๋‹น ์•ก์…˜ ๋ฐ˜ํ™˜
        return (strcmp(rule->action, "ALLOW") == 0) ? 1 : 0;
    }
    
    // ๊ธฐ๋ณธ์ ์œผ๋กœ ํ—ˆ์šฉ
    return  1;
}
  

์ด check_packet ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์š”:

  • ๋ชจ๋“  ๊ทœ์น™์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํŒจํ‚ท์˜ ์ •๋ณด์™€ ๋น„๊ตํ•ด์š”.
  • IP ์ฃผ์†Œ, ํฌํŠธ, ํ”„๋กœํ† ์ฝœ์ด ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์š”.
  • ์ผ์น˜ํ•˜๋Š” ๊ทœ์น™์„ ์ฐพ์œผ๋ฉด ํ•ด๋‹น ๊ทœ์น™์˜ ์•ก์…˜(ํ—ˆ์šฉ ๋˜๋Š” ์ฐจ๋‹จ)์„ ๋ฐ˜ํ™˜ํ•ด์š”.
  • ์ผ์น˜ํ•˜๋Š” ๊ทœ์น™์ด ์—†์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒจํ‚ท์„ ํ—ˆ์šฉํ•ด์š”.

์ด ํ•จ์ˆ˜๋Š” ๋งˆ์น˜ ๊ฒฝ์ฐฐ๊ด€์ด ์ฐจ๋Ÿ‰์„ ๊ฒ€๋ฌธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์ฐจ๋Ÿ‰(ํŒจํ‚ท)์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ , ๊ทœ์น™์— ์œ„๋ฐฐ๋˜๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๊ฑฐ์ฃ !

3. ํŒจํ‚ท ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ์˜ ํŒจํ‚ท ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์„œ ์บก์ฒ˜ํ•œ ํŒจํ‚ท์„ ํ•„ํ„ฐ๋งํ•ด๋ณผ๊ฒŒ์š”.


void packet_handler(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) {
    // ... (์ด์ „์— ์ž‘์„ฑํ•œ ํŒจํ‚ท ํŒŒ์‹ฑ ์ฝ”๋“œ) ...

    // ํŒจํ‚ท ํ•„ํ„ฐ๋ง
    const char *protocol = (ip_header->ip_p == IPPROTO_TCP) ? "TCP" : 
                           (ip_header->ip_p == IPPROTO_UDP) ? "UDP" : "OTHER";
    
    int action = check_packet(source_ip, dest_ip, source_port, dest_port, protocol);
    
    if (action == 1) {
        printf("ALLOW: ");
    } else {
        printf("BLOCK: ");
    }
    
    printf("%s Packet: %s:%d -> %s:%d\n", protocol, source_ip, source_port, dest_ip, dest_port);

    // ์‹ค์ œ๋กœ ํŒจํ‚ท์„ ์ฐจ๋‹จํ•˜๋Š” ๋กœ์ง์€ ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    // ์˜ˆ๋ฅผ ๋“ค์–ด, iptables ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ปค๋„ ๋ชจ๋“ˆ๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
}
  

์ด๋ ‡๊ฒŒ ์—…๋ฐ์ดํŠธ๋œ packet_handler ํ•จ์ˆ˜๋Š”:

  • ์บก์ฒ˜ํ•œ ํŒจํ‚ท์˜ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ด์š”.
  • check_packet ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŒจํ‚ท์„ ํ•„ํ„ฐ๋งํ•ด์š”.
  • ํ•„ํ„ฐ๋ง ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ "ALLOW" ๋˜๋Š” "BLOCK" ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ด์š”.

์ด์ œ ์šฐ๋ฆฌ์˜ ๋ฐฉํ™”๋ฒฝ์€ ์‹ค์ œ๋กœ ํŒจํ‚ท์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ—ˆ์šฉ ๋˜๋Š” ์ฐจ๋‹จ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์–ด์š”. ๋งˆ์น˜ ์‹ค์ œ ๋ณด์•ˆ ๊ฒŒ์ดํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿšช๐Ÿ”’

๐ŸŒŸ ์ฐฝ์˜๋ ฅ ๋ฐœํœ˜ํ•˜๊ธฐ: ์—ฌ๋Ÿฌ๋ถ„, ์ด ๋ฐฉํ™”๋ฒฝ์„ ์–ด๋–ป๊ฒŒ ๋” ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊น… ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์•„์ด๋””์–ด๋ฅผ ์žฌ๋Šฅ๋„ท ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ณต์œ ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ํ•จ๊ป˜ ๋” ๊ฐ•๋ ฅํ•œ ๋ฐฉํ™”๋ฒฝ์„ ๋งŒ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

4. ๋ฉ”์ธ ํ•จ์ˆ˜ ์™„์„ฑํ•˜๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ, ์šฐ๋ฆฌ์˜ ๋ฉ”์ธ ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด๋ณผ๊ฒŒ์š”. ์‚ฌ์šฉ์ž๊ฐ€ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํŒจํ‚ท ์บก์ฒ˜๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”.


int main() {
    // libpcap ์ดˆ๊ธฐํ™” (์ด์ „์— ์ž‘์„ฑํ•œ ์ฝ”๋“œ)

    // ๊ทœ์น™ ์ถ”๊ฐ€ ์˜ˆ์‹œ
    add_rule("192.168.1.100", "*", 80, -1, "TCP", "ALLOW");
    add_rule("*", "10.0.0.1", -1, 443, "TCP", "BLOCK");

    printf("Firewall rules set. Starting packet capture. Press Ctrl+C to stop.\n");

    // ํŒจํ‚ท ์บก์ฒ˜ ์‹œ์ž‘
    pcap_loop(handle, -1, packet_handler, NULL);

    // ์ •๋ฆฌ
    pcap_freecode(&fp);
    pcap_close(handle);

    return 0;
}
  

์ด ๋ฉ”์ธ ํ•จ์ˆ˜๋Š”:

  • libpcap์„ ์ดˆ๊ธฐํ™”ํ•ด์š”.
  • ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ด์š”.
  • ํŒจํ‚ท ์บก์ฒ˜๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์šฐ๋ฆฌ์˜ packet_handler ํ•จ์ˆ˜๋กœ ๊ฐ ํŒจํ‚ท์„ ์ฒ˜๋ฆฌํ•ด์š”.

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰ ์ด์ œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๊ฐ„๋‹จํ•œ ๋ฐฉํ™”๋ฒฝ ํ”„๋กœ๊ทธ๋žจ์„ ์™„์„ฑํ–ˆ์–ด์š”. ์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์„ ์บก์ฒ˜ํ•˜๊ณ , ์ •์˜๋œ ๊ทœ์น™์— ๋”ฐ๋ผ ํŒจํ‚ท์„ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์–ด์š”.

๋ฌผ๋ก , ์ด ๋ฐฉํ™”๋ฒฝ์€ ์•„์ง ๊ธฐ๋ณธ์ ์ธ ์ˆ˜์ค€์ด์—์š”. ์‹ค์ œ production ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋” ๋งŽ์€ ๊ธฐ๋Šฅ๊ณผ ๋ณด์•ˆ ๊ฐ•ํ™”๊ฐ€ ํ•„์š”ํ•  ๊ฑฐ์˜ˆ์š”. ํ•˜์ง€๋งŒ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ C ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•œ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ๋งŽ์ด ๋ฐฐ์› ์ฃ !

์—ฌ๋Ÿฌ๋ถ„, ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์–ด๋–ค ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ค๋ฅด๋‚˜์š”? ํ˜น์‹œ ์ด ๋ฐฉํ™”๋ฒฝ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์ด ์žˆ๋‚˜์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฐฝ์˜์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์žฌ๋Šฅ๋„ท ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ณต์œ ํ•ด๋ณด์„ธ์š”. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ํ•จ๊ป˜ ๋” ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ’ก๐Ÿš€

์ฝ”๋”ฉ์˜ ์„ธ๊ณ„๋Š” ๋ฌด๊ถ๋ฌด์ง„ํ•ด์š”. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹ค๋ ฅ์ด ๋”์šฑ ๋ฐœ์ „ํ•˜๊ธธ ๋ฐ”๋ž„๊ฒŒ์š”. ํ™”์ดํŒ…! ๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป