【问题标题】:Socket connection rerouting套接字连接重路由
【发布时间】:2011-12-21 23:13:57
【问题描述】:

大多数代理服务器执行转发数据到适当的“真实”服务器的工作。然而,我正在设计一个分布式系统,当“代理”接收到 TCP/IP 套接字连接时,远程系统实际上连接到代理指定的真实服务器。所有后续数据都从远程流向真实服务器。

那么是否可以“转发”socket连接请求,让远程系统连接到真实服务器呢?

(我暂时假设远程系统无法做任何进一步的事情。即代理无法通过发送实际服务器的 IP 地址和远程连接来响应连接。)

这将在普通 Windows(不是服务器)下,所以不能使用 TCPCP 之类的狡猾的东西。

【问题讨论】:

    标签: windows sockets tcp


    【解决方案1】:

    可能有一种方法可以做到这一点,但您需要使用 Windows 驱动程序来实现它。当连接来自 localhost 以外的 IP 时,我没有尝试过这个,但它可能会工作。

    看看 NetFilter SDK。有一个试用版,功能齐全,最多可支持 100000 个 TCP 和 UDP 连接。另一种可能性是自己编写一个 Windows 驱动程序,但这并不简单。

    http://www.netfiltersdk.com

    基本上它的工作原理如下:

    1) 你创建了一个继承自 NF_EventHandler 的类。在那里,您可以提供自己的方法实现,例如 tcpConnectRequest,以允许您将 TCP 连接重定向到其他地方。

    2) 通过调用 nf_init 来初始化库。这提供了驱动程序和代理之间的链接,因为您向它提供了 NF_EventHandler 实现的实例。

    还有一些示例程序供您查看重定向的发生。例如,要将端口 80 上的连接从进程 id 214 重定向到 127.0.0.0:8081,您可以运行:

    TcpRedirector.exe -p 80 -pid 214 -r 127.0.0.1:8081

    对于您的代理,将按如下方式使用:

    1) 从您的客户端应用程序连接到代理。

    2) 连接请求被 NetFilterSDK (tcpConnectRequest) 拦截,并修改连接端点以连接代理选择的服务器。这是至关重要的一点,因为您的连接来自外部,这是可能无法正常工作的部分。

    【讨论】:

    • 考虑到这一点,我的方法行不通。 NetFilter SDK API 只会拦截驱动程序所在机器发出的 TCP/UDP 连接请求。因此,当您从代理外部连接时,我怀疑是否可以修改连接。所以你必须改用透明代理。
    【解决方案2】:

    我假设您的“远程系统”是发起连接尝试的系统,即代理的客户端。

    如果我做对了:当“远程系统”想要连接到某个地方时,您希望“代理服务器”决定连接真正去哪里(“真正的服务器”)。做出决定后,您不想再让代理服务器参与进来——连接的数据不应该通过代理,而是直接在“远程系统”和“真实服务器”之间传递。

    问题是,如果要真正直接连接,“远程系统”必须知道“真实服务器”的IP地址,反之反之亦然。

    (我暂时假设没有什么可以做的 远程系统。即代理无法通过以下方式响应连接 发送实际服务器的 IP 地址和远程连接 接着就,随即。 )

    就像我说的,不可能。为什么让“代理”发回实际 IP 地址会出现问题?

    安全吗?您想确保连接真的到达代理想要的地方吗?如果是这样的话,你别无选择——你必须妥协。要么代理转发所有数据,它知道数据的去向,要么让客户端自己连接,但你无法控制它连接到哪里。

    只要您完全控制整个网络,大多数网络问题都可以解决。例如,在这里,您可以在“远程系统”和“真实客户端”之间的路径上使用路由器,以确保连接是直接的并且它可以到达代理想要的地方。但这很复杂,在实践中可能不是一个选择(因为您可能无法控制这些路由器)。

    折衷方案可能是在网络中分布多个“中继服务器”来转发连接,而​​不是让实际的代理服务器转发它们。当代理做出决定时,它会找到最好的(最近的)中继服务器,告诉它连接情况,然后命令客户端连接到中继服务器,从而确保连接到达代理打算去的地方。

    【讨论】:

    • 我对远程客户端进行约束的原因是它是一个硬件,而不是计算机,因此固件中可能有一个固定的连接策略,我可能会也可能不会更新。我的问题是“如果是这样的话,有没有办法解决这个问题?”你说“不”。这对我来说是有用的信息。正在解决的部分问题是创建一个分布式系统,以便我们可以扩展我们处理的连接数量。传统代理成为数据瓶颈和单点故障。我们的系统需要更好的可扩展性和稳健性。
    • 好吧,如果您将代理放在靠近远程客户端(例如同一个 LAN)的地方,那应该不是问题。而且我猜你会有多个代理(分布式,对吗?)所以这不应该是一个问题。
    • 远程客户端是移动设备(不是电话,但他们可能会在专用网络上使用 GPRS),因此它不能是 LAN-local。
    【解决方案3】:

    听起来像是路由问题,比TCP/IP低一层;
    你实际上是在寻找ARP like proxy: 我会说你需要管理 ARP 数据包,检查 ARP 请求:

    CLIENT -> WHOIS PROXY.MAC
    PROXY -> PROXY.IP 是 SERVER.IP

    然后通过 TCP/IP 从客户端到服务器的正常套接字连接。

    【讨论】:

    • 我看不出这与 ARP 有什么关系。 ARP 用于解析本地 IP 地址的MAC 地址。当你想选择一个特定的internet IP地址去哪里时它是没有用的——这可以通过路由器来完成,而不涉及ARP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多