是否有已关联接收套接字的 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 钩子可以派上用场。另外,根据您的需要,您可以开发相应的内核补丁。
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 钩子可以派上用场。另外,根据您的需要,您可以开发相应的内核补丁。