๐ก๏ธ ๊ฐ๋จํ ๋ฐฉํ๋ฒฝ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ: C์ธ์ด๋ก ์์ํ๋ ๋คํธ์ํฌ ๋ณด์์ ์ฒซ๊ฑธ์ ๐ก๏ธ

์๋ ํ์ธ์, ๋ฏธ๋์ ๋ณด์ ์ ๋ฌธ๊ฐ ์ฌ๋ฌ๋ถ! ์ค๋์ ์์ฃผ ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ก ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ์๊ฐ์ ๋ณด๋ด๋ ค๊ณ ํด์. ๋ฐ๋ก C์ธ์ด๋ฅผ ์ฌ์ฉํด ๊ฐ๋จํ ๋ฐฉํ๋ฒฝ ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ๐ฅ๏ธ๐ป
์ฌ๋ฌ๋ถ, ํน์ '๋ฐฉํ๋ฒฝ'์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ค์ด๋ณด์ จ๋์? ๋คํธ์ํฌ ๋ณด์์ ํต์ฌ ์์์ธ ๋ฐฉํ๋ฒฝ์ ์ฐ๋ฆฌ์ ๋์งํธ ์ํ์ ๋ณดํธํ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๋ง์น ์ง ์ฃผ๋ณ์ ์ธํ๋ฆฌ๋ฅผ ์น๋ ๊ฒ์ฒ๋ผ, ๋ฐฉํ๋ฒฝ์ ์ฐ๋ฆฌ์ ์ปดํจํฐ ์์คํ ์ฃผ๋ณ์ ๋ณด์ด์ง ์๋ ์ธํ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ๊ฑฐ์ฃ !
์ด๋ฒ ๊ธ์์๋ C์ธ์ด๋ฅผ ์ฌ์ฉํด ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉํ๋ฒฝ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณผ ๊ฑฐ์์. ์ฌ๋ฌ๋ถ์ด ํ๋ก๊ทธ๋๋ฐ์ ์ฒ์ ์ ํ๋ ๋ถ์ด๋ผ๋ ๊ฑฑ์ ํ์ง ๋ง์ธ์. ๋ง์น ๋ ๊ณ ๋ธ๋ก์ ์กฐ๋ฆฝํ๋ฏ์ด, ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์ค๋ช ํด ๋๋ฆด ํ ๋๊น์! ๐
๊ทธ๋ฆฌ๊ณ ์ ๊น! ์ฌ๋ฌ๋ถ, ์ฌ๋ฅ๋ท(https://www.jaenung.net)์ด๋ผ๋ ์ฌ์ดํธ๋ฅผ ์๊ณ ๊ณ์ ๊ฐ์? ์ด๊ณณ์ ๋ค์ํ ์ฌ๋ฅ์ ๊ณต์ ํ๊ณ ๊ฑฐ๋ํ ์ ์๋ ๋ฉ์ง ํ๋ซํผ์ด์์. ์ฐ๋ฆฌ๊ฐ ์ค๋ ๋ฐฐ์ธ ๋ฐฉํ๋ฒฝ ํ๋ก๊ทธ๋๋ฐ skills๋ ์ธ์ ๊ฐ ์ฌ๋ฅ๋ท์์ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋ ์ ์๊ฒ ์ฃ ? ํจ๊ป ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋ ์ฆ๊ฑฐ์์ ๋๊ปด๋ด์! ๐ฑ
์, ๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํด๋ณผ๊น์? ์ฌ๋ฌ๋ถ์ ์์๋ ฅ๊ณผ ์ฐฝ์๋ ฅ์ ๋ง์๊ป ๋ฐํํ ์๊ฐ์ ๋๋ค. ์ค๋น๋์ จ๋์? Let's dive in! ๐โโ๏ธ
๐ ๋ฐฉํ๋ฒฝ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ดํดํ๊ธฐ
๋จผ์ , ๋ฐฉํ๋ฒฝ์ด ์ ํํ ๋ฌด์์ธ์ง ์์๋ณผ๊น์? ๋ฐฉํ๋ฒฝ์ ๋คํธ์ํฌ ๋ณด์์ ์ํ ํ๋์จ์ด ๋๋ ์ํํธ์จ์ด ์์คํ ์ด์์. ์ฃผ์ ๋ชฉ์ ์ ์ ๋ขฐํ ์ ์๋ ๋ด๋ถ ๋คํธ์ํฌ์ ์ ๋ขฐํ ์ ์๋ ์ธ๋ถ ๋คํธ์ํฌ(์: ์ธํฐ๋ท) ์ฌ์ด์ ์ฅ๋ฒฝ ์ญํ ์ ํ๋ ๊ฑฐ์ฃ .
๋ฐฉํ๋ฒฝ์ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์์:
- ๐ซ ํจํท ํํฐ๋ง: ๋คํธ์ํฌ ํธ๋ํฝ์ ๊ฒ์ฌํ๊ณ ์ฌ์ ์ ์๋ ๋ณด์ ๊ท์น์ ๋ฐ๋ผ ํจํท์ ํ์ฉํ๊ฑฐ๋ ์ฐจ๋จํฉ๋๋ค.
- ๐ ์ ๊ทผ ์ ์ด: ํน์ IP ์ฃผ์, ํฌํธ, ํ๋กํ ์ฝ์ ๋ํ ์ ๊ทผ์ ์ ์ดํฉ๋๋ค.
- ๐ ๋ก๊น : ๋คํธ์ํฌ ํ๋์ ๊ธฐ๋กํ์ฌ ๋ณด์ ๋ถ์ ๋ฐ ๋ฌธ์ ํด๊ฒฐ์ ํ์ฉํฉ๋๋ค.
- ๐ต๏ธ ์ํ ๊ฒ์ฌ: ์ฐ๊ฒฐ ์ํ๋ฅผ ์ถ์ ํ์ฌ ๋ ์ ๊ตํ ํํฐ๋ง์ ์ํํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง๋ค ๊ฐ๋จํ ๋ฐฉํ๋ฒฝ ํ๋ก๊ทธ๋จ์ ์ด ์ค์์ ํจํท ํํฐ๋ง๊ณผ ๊ธฐ๋ณธ์ ์ธ ์ ๊ทผ ์ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ ๊ฑฐ์์. ๋ง์น ๋ฌธ์ง๊ธฐ์ฒ๋ผ "๋๊ตฌ์ธ์?"๋ผ๊ณ ๋ฌผ์ด๋ณด๊ณ , ์์ ํ ์๋๋ง ๋ค์ฌ๋ณด๋ด๋ ์ญํ ์ ํ๋ ๊ฑฐ์ฃ ! ๐ช๐ฎโโ๏ธ
์ฌ๋ฏธ์๋ ์ฌ์ค: ๋ฐฉํ๋ฒฝ์ด๋ผ๋ ์ฉ์ด๋ ์ค์ ๊ฑด๋ฌผ์์ ํ์ฌ์ ํ์ฐ์ ๋ง๊ธฐ ์ํด ์ฌ์ฉ๋๋ '๋ฐฉํ๋ฒฝ'์์ ์ ๋ํ์ด์. ์ปดํจํฐ ์ธ๊ณ์์๋ ์ด์ ๋น์ทํ๊ฒ '๋์งํธ ํ์ฌ'(๋ณด์ ์ํ)์ ํ์ฐ์ ๋ง๋ ์ญํ ์ ํ๋ค๊ณ ๋ณผ ์ ์์ฃ !
์ด์ ๋ฐฉํ๋ฒฝ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ดํดํ์ จ๋์? ๊ทธ๋ผ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ ๋ณผ๊น์? C์ธ์ด๋ก ์ด๋ฐ ๋ฉ์ง ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์๋์ง ํจ๊ป ์์๋ณด์์! ๐
๐ ๏ธ C์ธ์ด๋ก ๋ฐฉํ๋ฒฝ ๊ตฌํํ๊ธฐ: ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ค๊ณ
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก C์ธ์ด๋ฅผ ์ฌ์ฉํด ๊ฐ๋จํ ๋ฐฉํ๋ฒฝ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณผ ๊ฑฐ์์. ์ฐ๋ฆฌ์ ๋ฐฉํ๋ฒฝ์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๊ฑฐ์์:
- ํจํท ์บก์ฒ ๋ฐ ๋ถ์
- ๊ท์น ์ ์ ๋ฐ ์ ์ฉ
- ํจํท ํํฐ๋ง
- ๋ก๊น
๊ฐ ๋จ๊ณ๋ฅผ ํ๋์ฉ ์ดํด๋ณด๋ฉด์, ์ฝ๋๋ฅผ ์์ฑํด๋ณผ๊น์? ๐
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
ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ์์
์ ์ํํด์:
- ์ด๋๋ท ํค๋๋ฅผ ํ์ฑํ์ฌ IP ํจํท์ธ์ง ํ์ธํด์.
- IP ํค๋๋ฅผ ํ์ฑํ์ฌ ์ถ๋ฐ์ง์ ๋ชฉ์ ์ง IP ์ฃผ์๋ฅผ ์ถ์ถํด์.
- ํ๋กํ ์ฝ์ด TCP์ธ์ง UDP์ธ์ง ํ์ธํ๊ณ , ํด๋นํ๋ ํค๋๋ฅผ ํ์ฑํ์ฌ ํฌํธ ์ ๋ณด๋ฅผ ์ถ์ถํด์.
- ์ถ์ถํ ์ ๋ณด๋ฅผ ์ถ๋ ฅํด์.
์ด ํจ์๋ ๋ง์น ์ฐ๋ฆฌ๊ฐ ์ฐ์ฒด๊ตญ์์ ํธ์ง๋ฅผ ๋ถ๋ฅํ๋ ๊ฒ๊ณผ ๋น์ทํด์. ๊ฐ ํจํท(ํธ์ง)์ ๋ฐ์ ์, ์์ ์, ์ข ๋ฅ ๋ฑ์ ํ์ธํ๊ณ ๋ถ๋ฅํ๋ ๊ฑฐ์ฃ !
๐ก ์ฌ๋ฏธ์๋ ์ฌ์ค: ์ธํฐ๋ท์ ํตํด ์ ์ก๋๋ ๋ฐ์ดํฐ๋ ์์ ์กฐ๊ฐ(ํจํท)์ผ๋ก ๋๋์ด ์ ์ก๋ผ์. ์ฐ๋ฆฌ์ ๋ฐฉํ๋ฒฝ์ ์ด ํจํท๋ค์ ํ๋ํ๋ ๊ฒ์ฌํ๋ ๊ฑฐ์์. ๋ง์น ๋ณด์ ๊ฒ์๋๋ฅผ ํต๊ณผํ๋ ์ฌํ ๊ฐ๋ฐฉ๋ค์ ๊ฒ์ฌํ๋ ๊ฒ์ฒ๋ผ์! ๐งณโ๏ธ
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 ์ธ์ด๋ฅผ ์ฌ์ฉํ ์์คํ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ๋ง์ด ๋ฐฐ์ ์ฃ !
์ฌ๋ฌ๋ถ, ์ด ํ๋ก์ ํธ๋ฅผ ํตํด ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ด๋ค ์๋ก์ด ์์ด๋์ด๊ฐ ๋ ์ค๋ฅด๋์? ํน์ ์ด ๋ฐฉํ๋ฒฝ์ ์ถ๊ฐํ๊ณ ์ถ์ ๊ธฐ๋ฅ์ด ์๋์? ์ฌ๋ฌ๋ถ์ ์ฐฝ์์ ์ธ ์์ด๋์ด๋ฅผ ์ฌ๋ฅ๋ท ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํด๋ณด์ธ์. ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๊ณผ ํจ๊ป ๋ ๋ฉ์ง ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๊ฐ ์ ์์ ๊ฑฐ์์! ๐ก๐
์ฝ๋ฉ์ ์ธ๊ณ๋ ๋ฌด๊ถ๋ฌด์งํด์. ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์์์ผ๋ก ์ฌ๋ฌ๋ถ์ ์ค๋ ฅ์ด ๋์ฑ ๋ฐ์ ํ๊ธธ ๋ฐ๋๊ฒ์. ํ์ดํ ! ๐จโ๐ป๐ฉโ๐ป
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ