套接字连接重新路由

时间:2011-11-04 11:49:33

标签: windows sockets tcp

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

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

(我现在假设远程系统无法继续进行任何操作。即代理无法通过发送实际服务器的IP地址和远程连接来响应连接。)

这将在vanilla Windows下(不是Server),所以不能使用像TCPCP这样的狡猾的东西。

3 个答案:

答案 0 :(得分:0)

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

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

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

  

(我现在假设不能再进一步了   远程系统。即代理无法响应连接   发送实际服务器的IP地址和远程连接   接着就,随即。 )

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

是否安全 - 您想确保连接真正进入代理所需的位置吗?如果是这种情况,你没有选择 - 你必须妥协。代理转发所有数据,它知道数据的去向,或者让客户端连接自己,但是你无法控制连接的位置。

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

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

答案 1 :(得分:0)

可能有一种方法可以执行此操作,但您需要使用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)拦截连接请求,并修改连接端点以连接到代理选择的服务器。这是至关重要的一点,因为您的连接来自外部,这是可能无法正常工作的部分。

答案 2 :(得分:-1)

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

客户 - > WHOIS PROXY.MAC
PROXY - > PROXY.IP是SERVER.IP

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