2011-11-04 97 views
0

大多数代理服务器执行作业将数据转发到适当的“真实”服务器。但是,我正在设计一个分布式系统,其中当“代理”接收到TCP/IP套接字连接时,远程系统实际上是连接到代理提名的真实服务器。所有后续数据从远程服务器流向真实服务器。套接字连接重新路由

那么是否有可能“转发”套接字连接请求,以便远程系统与真实服务器连接?

(我现在假设远程系统没有进一步的工作,即代理无法通过发送实际服务器的IP地址和远程连接来响应连接。)

这将在香草Windows(不是服务器)下,所以不能使用TCPCP等狡猾的东西。

回答

-1

听起来像路由问题,比TCP/IP低一层;
你实际上是在寻找ARP like proxy: 我说你需要管理ARP报文,chekcing的ARP请求:

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

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

+0

我不明白这与ARP有什么关系。 ARP用于解析*本地* IP地址的MAC地址。当你想选择一个特定的*互联网* IP地址时,这是没用的 - 这可以通过路由器来完成,而不涉及ARP。 –

0

我假设你的“远程系统”是启动连接尝试的那个,即代理的客户端。

如果我得到这个权利:当“远程系统”想要连接某个地方时,您希望“代理服务器”决定连接将在哪里真的去(“真正的服务器”)。做出决定后,您不希望进一步涉及代理服务器 - 连接的数据不应该通过代理,而是直接在“远程系统”和“真实服务器”之间。

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

(我假设的,没有什么可以进一步与 完成远程系统的时刻。即代理无法连接通过 发送实际服务器的IP地址和远程连接 回应)

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

它是否安全 - 您想确保连接真的去哪里代理想要?如果是这样的话,你没有选择 - 你必须妥协。代理可以转发所有数据,并知道数据在哪里发生,也可以让客户端自行连接,但您无法控制连接的位置。

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

妥协可能是在网络周围分布几个“中继服务器”,它们将转发连接,而​​不是让实际的代理服务器转发它们。当一个代理做出决定时,它会找到最好的(最接近的)中继服务器,告诉它有关连接,然后命令客户端连接到中继服务器,这可以确保连接到代理希望去的地方。

+0

我把约束放在远程客户端上的原因是它是一个硬件,而不是一台计算机,因此固件中的固定连接策略可能会或可能无法更新。我的问题是“如果这样的话,有没有办法解决这个问题?”你在说“不”。对我来说这是有用的信息。 正在解决的问题的一部分是创建一个分布式系统,以便我们可以扩展我们处理的连接数量。传统代理成为数据瓶颈和单点故障。我们的系统需要更好的可扩展性和健壮性。 –

+0

那么,如果你把代理放到远程客户端(例如同一个局域网),它应该不成问题。我想你会有多个代理(分布式的,对吧?),这应该不成问题。 –

+0

远程客户端是移动设备(不是电话,但他们可能会在专用网络上通话GPRS),因此它不能局域网。 –

0

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

看看NetFilter SDK。有一个试用版可以完全实现100000个TCP和UDP连接。另一种可能性是自己编写一个Windows驱动程序,但这不是微不足道的。

http://www.netfiltersdk.com

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

1)创建从NF_EventHandler继承的类。在那里你可以提供你自己的方法实现,比如tcpConnectRequest,让你可以在别的地方重定向TCP连接。

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

还有一些示例程序让你看到发生重定向。例如,重定向从进程ID 214 127.0.0.0:8081在端口80的连接,则可以运行:

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

为您的代理,这将使用如下:

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

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

+0

对此稍加思考后,我的方法将无法使用。 NetFilter SDK API将仅拦截从驱动程序所在机器发出的TCP/UDP连接请求。所以,当您从代理外部连接时,我怀疑连接是否可以修改。所以你必须改用透明代理。 – rushman