【问题标题】:Redirect TCP port traffic to other port so that the Java application knows which port was used将 TCP 端口流量重定向到其他端口,以便 Java 应用程序知道使用了哪个端口
【发布时间】:2014-08-25 15:16:56
【问题描述】:

我正在运行一个 Java 服务器应用程序(如果有人知道的话,Bungeecord),我正在为其编写插件。 Bungeecord 服务器在端口 A 上运行,但需要能够连接到端口 A 和 B 上的服务器。因此,如果一个连接到端口 A,一切都应该按预期工作。但是,如果一个连接到 B,则 B 的输入应该发送到端口 A,而 B 上的连接的输出需要从端口 B 发送。

问题是我的 Bungeecord Java 插件需要知道客户端是通过 A 还是 B 连接的。

我不能简单地创建两个ServerSocket 实例(一个用于端口 A,一个用于端口 B),因为这需要修改 Bungeecord(这不是我的项目)。这样做会非常耗时。

是否可以在 linux (debian) 和 Java 上解决此问题,或者我是否需要创建自己的轻量级代理应用程序,为 Java 插件提供信息,无论特定连接是连接到 A 还是 B?

【问题讨论】:

  • 我不明白这个问题,我正在查看旧的 bungeecord 问题以尝试正确标记它们。您可能已经知道,但是 bungee 可以根据连接的域来消除歧义,以及侦听多个端口。

标签: java linux tcp proxy bungeecord


【解决方案1】:

从 TCP 层,应用程序只提供有关它实际接收连接的端口的信息,在您的情况下,这将是端口 A。您可以使用netcat 之类的工具作为某种“漏斗”,因此到端口 A 和端口 B 的连接总是在端口 A 结束,但 TCP 层不会携带任何有关此的信息。

如果您需要在服务器应用程序中分离所有在同一端口接收的多个连接类型,您有以下选择:

  • 在应用层嵌入有关连接类型的信息。
  • 通过端口区分连接,即客户端的端口。 (那么,您可能会也可能不会使用netcat。不过,您仍然可以使用数据包重写/端口地址转换。)

【讨论】:

  • 我能确定传入的 TCP 连接真的来自数据包中发送的端口吗?因为人们实际上可以发送一个 TCP 数据包,说它来自 google.com,实际上来自我的 IP 和端口。
  • 不,你不能确定传入的 TCP 连接真的来自操作系统告诉你的端口,即使你可以验证双向通信是可能的,即如果你发送的数据是在另一端。当使用netcatssh 转发/隧道连接时,原始主机和端口将是隧道端点的主机和端口,而不是客户端应用程序的主机和端口。在沿路由进行网络/端口地址转换的情况下也是如此。如果这些问题对您来说很重要,您必须将连接类型嵌入到连接本身中。
猜你喜欢
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 2021-04-09
  • 2017-05-04
相关资源
最近更新 更多