저는 현재 원시 소켓을 사용하여 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
이로 인해 커널이 패킷을 무시하고 핸드셰이크에 응답하지 않게 됩니다.