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