【问题标题】:Functionality to catch arriving connection on tcp port在 tcp 端口上捕获到达连接的功能
【发布时间】:2020-09-18 11:51:23
【问题描述】:

我有一个在 TCP 端口 4000 上运行的应用程序,我想对与端口 4000 连接的 IP 执行一些验证。所以,我已经有了验证 API,它基本上是一个 post API。每当任何新的客户端 IP 连接到端口 4000 时,我都期待调用此 API。 这在 Linux 中可以用任何语言实现吗?

【问题讨论】:

  • 您有应用程序在 4000 端口上监听 TCP 的源代码吗?或者你有外部应用程序在 4000 端口上运行和监听?如果您有源代码,则可以在接受连接后获取地址 IP 并执行检查
  • 这是一个外部应用程序

标签: linux tcp linux-kernel


【解决方案1】:

如果我正确理解您的问题,您需要客户端的 IP 地址连接到您的服务器的 4000 端口。然后您希望通过 HTTP POST 将该 IP 地址发送到您的 API,具体取决于您将接受的结果或删除客户端。

您似乎唯一真正缺少的是getpeername 系统调用。无论您使用哪种语言,当您接受或创建 TCP 连接时,操作系统中都会创建一个套接字,并且数据会在它和您的应用程序之间发送和接收。创建此套接字后,您可以通过 getpeername 系统调用查询操作系统以告诉您连接中的远程 IP 地址/TCP 端口是什么。在“C”中有一个函数可以为您执行此操作,称为getpeername。如果您使用另一种语言,您可能有其他功能,或者数据可能已经在连接时收集并放置在数据结构中(在 Go 中,您只需调用 Conn.RemoteAddr())。

了解这一点后,您可以执行以下操作:

  • 接受客户端连接,但不读取/写入任何数据
  • 从 getpeername 系统调用中获取客户端的 IP 地址
  • 通过 POST 将 IP 地址发送到您的 API
  • 如果 API 返回授权响应,则向客户端读取和写入数据,否则断开连接

【讨论】:

  • 嗨,@Liam 感谢您提供如此有用的答案。我们可以将这种方法用于外部应用程序使用的 tcp 端口吗?因为我们没有代码可以访问应用程序。
  • 在这种情况下,您可能会更好地编写客户端连接的代理应用程序,执行上述操作,并在授权后代理与原始服务器建立连接并向/从转发流量它和客户。您需要使用 POST API 调用会阻止其他更有效的选项。 stackoverflow.com/questions/25090690/…
  • 其实你可以写一个 XDP Socket 应用程序,但是技术性要强得多。
  • @stark SCM_RIGHTS 机制要求其他应用程序监听共享的 unix 套接字,对吗?这不起作用,因为代码在原始服务器上不可用。或者这种机制真的可以伪造原始服务器中典型的accept(...) 服务器逻辑吗?
  • 是的。 TCP 没有简单的方法。代理可能是最好的。
【解决方案2】:

您可以使用tcpdump 侦听 4000 端口上的新连接,并对来自tcpdump 的每个标准输出行执行操作,并使用 sed 提取地址 IP。然后您可以使用例如xargs 进行操作。

要过滤tcpdump,您可以使用

tcpdump -n 'tcp[tcpflags] & tcp-syn != 0 and port 4000 and inbound'

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 2016-06-20
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    相关资源
    最近更新 更多