在不相关的进程之间共享套接字(监听)

Posted

技术标签:

【中文标题】在不相关的进程之间共享套接字(监听)【英文标题】:Share socket (listen) between unrelated processes 【发布时间】:2017-01-19 04:02:09 【问题描述】:

在 Linux 3.9 内核及更高版本中运行,我有一个应用程序 X,它在特定套接字上侦听连接。我想写一个不相关的应用程序,Y,它跟踪连接到这个套接字的尝试次数、源IP等。

是否可以在 C++ 中(理想情况下通过 Qt 库)共享/监视已被不相关进程使用的套接字?我发现了几个 *** 问题,建议分叉共享套接字,但在这种情况下这是不可能的。

【问题讨论】:

你可以使用tcpdump:superuser.com/questions/604998/… 一种方法(不依赖于任何特殊的操作系统级功能)是让 Y 代表 X 接受连接并充当 X 的代理(通过连接到 X 的端口和来回转发流量)。不过,Y 需要接受不同端口上的连接。不过,如果您有能力这样做,直接检测 X 可能会更容易。 【参考方案1】:

可以将文件描述符传输到另一个进程,其行为类似于跨进程 dup(2)。有关详细信息,请参阅Can I open a socket and pass it to another process in Linux。但这需要明确完成,即一个进程发送文件描述符,另一个进程接收它。因此,“不相关”的过程必须合作。

但监听套接字不能用于监控。套接字只能接受一个连接,但无法查看另一个进程是否接受了同一个套接字上的连接,无论套接字是与 fork、threading 共享还是通过文件描述符传递。

如果有正确的权限和操作系统,您可以使用 ptrace(2) 或类似接口在系统调用级别监控应用程序的行为。在那里你可以看到应用程序是否使用了接受以及它返回的内容。或者像评论中建议的那样,您可以使用数据包捕获(tcpdump、原始套接字)来简单地观察流量并从成功的 TCP 握手中推断出某些(未知)进程必须接受连接。

【讨论】:

@Telium:它为您留下了 ptrace 和数据包捕获。或者您可以尝试拦截 libc 调用以接受。

以上是关于在不相关的进程之间共享套接字(监听)的主要内容,如果未能解决你的问题,请参考以下文章

在不相关的进程之间复制 Windows 套接字

有没有办法让多个进程共享一个监听套接字?

C#:在多个进程和/或线程之间共享数据的最佳方式

网络:多个进程能否监听同一个端口号?

进程之间的套接字传递

Linux在Linux中查看进程占用的端口号