Windows 환경에서 네트워크 패킷을 캡처하고 포워딩하는 C++ 라이브러리입니다. Raw 소켓을 사용하여 브로드캐스트 UDP 패킷을 특정 수신자들에게 전달합니다.
- Raw 소켓 기반 패킷 캡처: Windows Raw Socket API를 사용하여 네트워크 인터페이스의 모든 패킷을 캡처
- 브로드캐스트 패킷 필터링: UDP 브로드캐스트 패킷(255.255.255.255)만을 선별적으로 처리
- 패킷 포워딩: 캡처된 패킷을 지정된 수신자 IP 목록으로 재전송
VirtualLAN (메인 클래스)
├── VirtualLANThread (워커 스레드 관리)
├── IPHeader (IP 헤더 구조체)
├── UDPHeader (UDP 헤더 구조체)
└── PseudoHeader (UDP 체크섬용 의사 헤더)
struct IPHeader {
uint8_t ver_ihl; // Version (4비트) + IHL (4비트)
uint8_t tos; // Type of Service
uint16_t tot_len; // 전체 길이
uint16_t id; // 식별자
uint16_t frag_off; // 단편화 오프셋
uint8_t ttl; // Time To Live
uint8_t protocol; // 프로토콜 (UDP=17)
uint16_t check; // 헤더 체크섬
uint32_t saddr; // 소스 IP
uint32_t daddr; // 목적지 IP
};struct UDPHeader {
uint16_t source; // 소스 포트
uint16_t dest; // 목적지 포트
uint16_t length; // UDP 길이
uint16_t check; // UDP 체크섬
};- RFC 791 표준을 따른 16비트 단위 합계 계산
- 캐리 비트 처리 및 1의 보수 연산
- RFC 768 표준을 따른 의사 헤더 포함 체크섬
- IP 헤더의 소스/목적지 주소, 프로토콜, UDP 길이 포함
-
Raw 소켓 생성
socket(AF_INET, SOCK_RAW, 0)
-
프로미스큐어스 모드 설정
WSAIoctl(socket, SIO_RCVALL, ...) -
IP 헤더 포함 모드
setsockopt(socket, IPPROTO_IP, IP_HDRINCL, ...)
- 네트워크 인터페이스에서 모든 패킷 수신
- IP 헤더 파싱 및 프로토콜 확인 (UDP만 처리)
- 목적지 IP가 브로드캐스트(255.255.255.255)인지 확인
- 조건을 만족하는 패킷을 수신자 목록으로 포워딩
- 원본 패킷 데이터 복사
- IP 헤더의 목적지 주소를 수신자 IP로 변경
- IP 및 UDP 체크섬 재계산
- Raw 소켓을 통해 수정된 패킷 전송
- Winsock2: 네트워크 소켓 API
- ws2tcpip: TCP/IP 프로토콜 지원
- 관리자 권한: Raw 소켓 사용을 위해 필수
- C++11 이상 (std::thread, std::atomic, std::mutex 사용)
- Windows SDK
- ws2_32.lib 링크 필요
- Raw 소켓 사용으로 인한 관리자 권한 필수
- 네트워크 인터페이스 직접 접근
- Windows 방화벽에서 Raw 소켓 트래픽 허용 필요
- 인바운드/아웃바운드 규칙 설정 권장