우리는 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
어차피 전자에만 적용되어야 함).