
저는 현재 원시 소켓을 사용하여 Linux 사용자 공간에서 실행되는 TCP/IP 스택을 작업하고 있습니다.
이를 테스트하려면 커널이 내 구현(예: 핸드셰이크에 응답하는 커널)을 방해하지 않도록 특정 포트에 대한 Linux 커널 TCP 코드를 비활성화해야 합니다.
제가 참고한이것, 이는 원시 소켓이 넷필터를 우회한다고 말하지만 테스트 중에 원시 소켓에서 패킷을 수신하지 못했습니다.
더 많은 연구 끝에 나는 그것을 발견했습니다.내 AF_INET 소켓이 여전히 TCP/IP 스택에 있습니다., 그러나 이더넷 프레임을 구현하고 싶지 않습니다.
AF_PACKET을 사용하지 않고 특정 포트에서 커널 처리를 비활성화할 수 있습니까?
편집하다:
다음과 같이 소켓을 생성하고 있습니다 socket(AF_INET, SOCK_RAW, IPPROTO_TCP)
. 그런 다음 HDRINCL을 설정했습니다.setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on))
답변1
이를 수행하려면 IPTables의 RAW 테이블을 사용할 수 있습니다. 다음과 같은 규칙을 사용하세요.
iptables -t raw -A PREROUTING -p tcp --dport <your port> -j DROP
이로 인해 커널이 패킷을 무시하게 되고 핸드셰이크에 응답하지 않게 됩니다.