java, python, node.js, C# 등으로 특정 IP에 대한 패킷 캡쳐가 가능할까요?
조회수 2533회
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
프로그래밍으로 패킷 캡쳐하고자 하는 건가요?
파이썬의 예를 들면, 소켓을 열때, 소켓 타입을 SOCK_RAW로 주고, 캡쳐하고자 하는 프로토콜을 명시해주면 가능하긴 합니다.
// 다음은 TCP 프로토콜을 캡쳐합니다. s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) // UDP의 경우 s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP) // ICMP의 경우 s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) // IP 프로토콜 하위 전체(TCP, UDP,...)를 포함할 경우. s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
위와 같이 패킷을 캡쳐한 후에 TCP/IP 프로토콜을 따르는 패킷 헤더를 분석해서, Source/Destination 주소(IP)를 분류하면 됩니다.
IP 패킷
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP 패킷
|0 1 2 3 |0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
캡쳐하는 기본적인 예는 다음과 같습니다.
packet = s.recvfrom(65565) # IP 헤더의 경우 앞의 20개 바이트(160bit = 32*5)를 가져오면 됩니다. # 그다음 3바이트(24bit)는 옵션필드입니다. ip_header = packet[0:20]
기타 다른 사항은 네트워크를 공부하면서 분석해보세요.
주. 물리적으로 같이 물려있는 장치간의 통신만 캡쳐가능합니다.
댓글 입력