如何识别用户空间和内核空间之间的特定套接字?

How to identify a specific socket between User Space and Kernel Space?

我在用户空间中有一个库,可以拦截 socket()connect()accept() 等套接字层调用。我只处理 TCP 套接字。

在内核空间我有一个网络内核模块,它处理所有的 TCP 连接。我需要能够在驱动程序中识别用户空间库拦截了哪些套接字。

到目前为止,我一直在使用 struct sock(内核)中的 priority 字段,我可以在用户空间中使用 setsockopt() 进行设置。但那是一个相当肮脏的 hack。

是否有任何类型的 struct sock 私有字段我可以通过 setsockopt() 从用户空间安全使用和设置?

谢谢。


确实没有这样的"私有域"选项可以单独由用户空间和您的内核代码使用。

使用 SO_PRIORITY 选项似乎有点太侵入性,因为它可以改变堆栈处理数据包的方式,并且可能导致难以理解的结果。更安全的选择是将 SO_RCVBUFSO_SNDBUF 值从通常的默认值调整一些小的增量。 Linux 会将传入的值加倍,但您可以从默认值中查找增量,并知道增量的存在表明这是您的"拦截"套接字。


回答您最初的问题"我需要能够在驱动程序中识别用户空间库拦截了哪些套接字。"实际上有几个功能。

首先你需要知道所有现有的连接都存储在一个全局哈希表——"tcp_hashinfo"中,你可以在/proc/kallsyms中找到地址。

主要的函数是__inet_lookup_skb(),它调用了__inet_lookup(),分为__inet_lookup_established()(寻找已经建立的任何匹配的sockets)和__inet_lookup_listener()(寻找打开的监听器,但还没有建立连接) .

查找所需的主要输入是源/目标端口和 IP 地址信息,如果找到返回的指针是指向套接字的"struct sock *"。

IPv6 的名字和逻辑差不多。

函数 (__inet_lookup_skb()) 被声明为"静态内联" - 它无法从 /proc/kallsyms 中找到,驱动程序也无法看到它,因为它是内联编译的。但这没有问题,因为这调用了另外两个函数 - inet_lookup_listener() 和 inet_lookup_established() ,它们不是内联编译的。它的符号已导出,因此您可以安全地从内核模块中使用它。

读取此 hashinfo 表是一项关键操作,这一点很重要 - 多个 CPU 可能同时对其进行读取/写入,这就是为什么在读取完成时在函数的开头/结尾进行锁定的原因,以防止在阅读时被修改。由于很难访问这些 RCU 锁,即使它本质上是全局的,也不要重新实现这些功能,只需重用它们即可。


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161