是否有已关联接收套接字的 netfilter 挂钩?

Is there a netfilter hook that has the receiving socket already associated?

NF_INET_LOCAL_OUT 挂钩 skb->sk 指向发送数据包的套接字的 struct sock。是否有一个钩子为接收数据包的套接字设置了钩子?在 NF_INET_LOCAL_IN 挂钩中,skb->sk 为空。

我必须使用 __inet_lookup_skb() 吗?如果是这样,该函数的复杂度是多少?

编辑:看起来 __inet_lookup_skb() 仅适用于 TCP,因为没有 udp_hashinfo。我最初是为 UDP 做的。

似乎没有,但对于我来说,LSM 钩子 socket_recvmsg 是合适的。它得到一个指向 struct sock 的指针,它指向接收队列中的 struct sk_buff

作为一个小小的补充:
UDP 输入路径有点不同(与 TCP):
NF_INET_LOCAL_IN hooks->
->ip_local_deliver_finish()->udp_rcv()->__udp4_lib_rcv()->__udp4_lib_lookup()

__udp4_lib_lookup() 获取特定 IP 地址和端口的 struct sock
当然,在 L3 的输入路径上(您的 Netfilter 挂钩在哪里)仍然没有套接字查找(因此没有套接字)。这是传输层的工作,取决于特定的协议。

所以是的,在这种情况下,LSM 钩子可以派上用场。另外,根据您的需要,您可以开发相应的内核补丁。