IP_MINTTL は raw ソケットでは動作しません。

IP_MINTTL は raw ソケットでは動作しません。

私たちはOSPFのTTLセキュリティ機能を実装しています。この操作の一部として、ttl値に基づいて着信ospfパケットを検証する必要があります。

これを行うには、IP_MINTTLソケットオプションを使用して着信パケットを確認します。しかし、TTL値に関係なくパケットが破棄されないことを観察した。

ospf の受信と送信にネイティブソケットを使用しているため、この IP_MINTTL はこのソケットに設定されます。

しかし、うまくいきません。このオプションはRAWソケットで機能しますか?これを理解するのを手伝ってください。

私たちはLinux 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(以下の同じブロックは、このファイルでほぼ同じように2回表示されます):

  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とにかく電子にのみ適用する必要があります)。

おすすめ記事