IP_MINTTL은 원시 소켓에서 작동하지 않습니다.

IP_MINTTL은 원시 소켓에서 작동하지 않습니다.

우리는 OSPF에 대한 TTL 보안 기능을 구현하고 있습니다. 이 작업의 일부로 ttl 값을 기반으로 들어오는 ospf 패킷의 유효성을 검사해야 합니다.

이를 위해 IP_MINTTL 소켓 옵션을 사용하여 들어오는 패킷을 확인합니다. 그러나 TTL 값에 관계없이 패킷이 삭제되지 않는 것을 관찰했습니다.

ospf 수신 및 전송에 원시 소켓을 사용하고 있으므로 이 IP_MINTTL은 이 소켓에 설정됩니다.

하지만 작동하지 않습니다. 이 옵션이 RAW 소켓에 작동합니까? 이것을 이해하도록 도와주세요.

우리는 리눅스 4.18 커널 버전을 사용하고 있습니다.

감사합니다, 라제쉬.

답변1

2010년 올해부터그린넷 기사(또한 *BSD 기능이 개선되거나 완료되었을 수 있지만 Linux에는 아무런 변경 사항이 없는 것 같습니다.)

Linux 패치는 매우 간단하며 구현은 BSD 커널과 동일합니다. 소켓의 최소 TTL을 변경할 수 있는 새로운 옵션( IP_MINTTL)이 추가되었습니다 . setsockopt()설정된 경우, TCP 코드 검사값을 설정하고 TTL이 더 작은 패킷을 삭제합니다.패치는 UDP 또는 IPv6 등가물과 같은 다양한 기타 프로토콜에 대한 지원을 추가하지 않습니다.,지금 바로 IPV6_MINHOPLIMIT.

Linux에서는 이 옵션이 TCP 소켓에서만 작동하는 것 같습니다. RAW 소켓이 TCP 패킷을 수신하더라도 TCP 소켓이 아닙니다.

커널 5.18에 대한 관련 커널 코드는 커널 소스 코드에서 다음 명령을 사용하여 찾을 수 있습니다 IP_MINTTL(4.18에 대한 배포판을 확인해야 함).

$ grep -Ewrl 'IP_MINTTL|min_ttl'  net
net/netrom/sysctl_net_netrom.c
net/mptcp/sockopt.c
net/ipv4/tcp_ipv4.c
net/ipv4/ip_sockglue.c

ip_sockglue.c소켓 옵션 자체는 처리되지만 실제로 패킷 내용과 비교할 수 있는 유일한 장소는 다음과 같습니다.tcp_ipv4.c(아래의 동일한 블록은 이 파일에서 거의 동일하게 두 번 나타납니다):

  if (static_branch_unlikely(&ip4_min_ttl)) {
      /* min_ttl can be changed concurrently from do_ip_setsockopt() */
      if (unlikely(iph->ttl < READ_ONCE(inet_sk(sk)->min_ttl))) {
          __NET_INC_STATS(net, LINUX_MIB_TCPMINTTLDROP);
          goto discard_and_relse;
      }
  }

이는 2010년 LWN 기사 이후 아무것도 변경되지 않았음을 의미합니다.

가능한 해결 방법: 방화벽 규칙. 바라보다iptablesIPv4ttl일치하거나nftablesIPv4ttl표현하다. "AF_INET, SOCK_RAW" 소켓은 괜찮지만 "AF_PACKET, SOCK_RAW" 소켓은 그렇지 않습니다. 방화벽 규칙이 발생하기 전에 데이터를 수신하게 됩니다( IP_MINTTL어차피 전자에만 적용되어야 함).

관련 정보