【问题标题】:Is there a netfilter hook that has the receiving socket already associated?是否有一个 netfilter 钩子已经关联了接收套接字?
【发布时间】:2019-12-05 03:20:42
【问题描述】:
NF_INET_LOCAL_OUT 钩子有skb->sk 指向发送数据包的套接字的struct sock。如果有一个钩子为接收数据包的套接字设置了它?在NF_INET_LOCAL_IN 挂钩中,skb->sk 为空。
我必须使用__inet_lookup_skb() 吗?如果是这样,该函数的复杂性是多少?
编辑:看起来 __inet_lookup_skb() 仅适用于 TCP,因为没有 udp_hashinfo。我最初是为 UDP 做这个的。
【问题讨论】:
标签:
c
linux
sockets
linux-kernel
netfilter
【解决方案1】:
只是一个小补充:
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 挂钩可以提供帮助。此外,根据您的需要,您可以开发相应的内核补丁。
【解决方案2】:
似乎没有,但就我而言,LSM 挂钩 socket_recvmsg 是合适的。它得到一个指向struct sock的指针,它指向接收队列中的struct sk_buffs。