저는 원시 소켓 프로그래밍과 IP 헤더 스푸핑을 연구하고 있습니다.
Scapy를 사용하여 Python 콘솔에서 다음 명령을 실행하면 Wireshark에서 ICMP 에코 요청 및 응답을 볼 수 있고 C 프로그램을 사용하여 시스템에 들어오고 나가는 ICMP 패킷을 스니핑할 수 있습니다.
>>> from scapy.all import *
>>> send( IP()/ICMP()/b'abcdef' )
그러나 아래와 같이 잘못된 IP 헤더 길이 필드를 설정하면 Wireshark에서 ICMP 에코 요청만 표시되고 응답을 받지 못하며 패킷 스니퍼의 출력도 표시되지 않습니다.
>>> from scapy.all import *
>>> send( IP(len=4000)/ICMP()/b'abcdef' )
내 생각엔 Linux 커널이 잘못된 IP 헤더 "총 길이" 필드가 있는 패킷을 삭제하는 것 같습니다. 내 시스템이 이러한 패킷을 삭제하는 것을 어떻게든 방지할 수 있습니까? 내 컴퓨터가 이러한 패킷에 응답하는지 여부는 중요하지 않지만 프로그래밍 방식으로 이러한 패킷의 내용에 액세스할 수 있기를 원합니다.
답변1
IP(인터넷 프로토콜)는 RFC 791에 정의되어 있습니다. RFC는 IP 헤더의 형식을 지정합니다. 헤더에는 헤더 길이를 32비트 단어로 지정하는 4비트 길이의 IHL(Internet Header Length) 필드가 있습니다. IHL 필드에는 0(이진수 0000)부터 15(이진수 1111)까지의 값을 담을 수 있습니다.
가장 긴 인터넷 헤더(IP 헤더) 크기는 15*32비트 = 480비트 = 60바이트일 수 있습니다.
가장 짧은 헤더 크기는 20바이트이며 인터넷 헤더 필드 값은 5(0101)입니다. 헤더의 모든 필수 필드에는 20바이트의 공간이 필요하기 때문입니다.