NF_INET_LOCAL_OUT
钩子中有skb->sk
指向发送数据包的套接字的struct sock
。是否为接收数据包的套接字设置了挂钩?在NF_INET_LOCAL_IN
挂钩中,skb->sk
为空。
我必须使用 __inet_lookup_skb()
吗?如果是这样,该函数的复杂性是什么?
编辑:__inet_lookup_skb()
似乎仅用于TCP,因为没有udp_hashinfo
。我最初是针对UDP的。
NF_INET_LOCAL_OUT
钩子中有skb->sk
指向发送数据包的套接字的struct sock
。是否为接收数据包的套接字设置了挂钩?在NF_INET_LOCAL_IN
挂钩中,skb->sk
为空。
我必须使用 __inet_lookup_skb()
吗?如果是这样,该函数的复杂性是什么?
编辑:__inet_lookup_skb()
似乎仅用于TCP,因为没有udp_hashinfo
。我最初是针对UDP的。
只是一个很小的补充:
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挂钩进行救援。另外,根据您的需要,您可以开发适当的内核补丁。
,似乎没有,但是对于我来说,LSM钩子socket_recvmsg是合适的。它获得指向struct sock
的指针,该指针指向接收队列中的struct sk_buff
。