更新:
我对我的问题进行了修改,使其更多地集中在问题上。
上下文
了解负载均衡工作原理的编码。Debian 64位。
负载均衡器127.0.0.1:36001后端127.0.0.1:36000
curl在负载均衡器上调用(36001)。
问题
我使用此代码来创建我的套接字socket code
我创建了一个非常简单的负载均衡器,一个服务器,我有一个对负载均衡器的curl请求。我的问题是,我不知道如何将客户端端口/ip传递到后端,以便在拼接时直接使用curl。
代码
curl请求
curl localhost:36001 -d“敬礼”
负载均衡器
static int pool_of_conn[2],
pool_of_pipes[2][2];
int sentinel , efd;
struct epoll_event event;
struct epoll_event *events;
...
off64_t offset = 0;
pipe(pool_of_pipes[0]);
/* This splice works but sends the loadbalancer ip and port. How to put the client's here ? How to alter events[i].data.fd ? */
bytes = splice(events[i].data.fd, NULL, pool_of_pipes[0][1], NULL, 4096, SPLICE_F_MOVE);
if (bytes == 0)
break;
splice(pool_of_pipes[0][0], NULL, pool_of_conn[0], NULL, bytes, SPLICE_F_MOVE);你能帮我个忙吗?
发布于 2014-08-27 16:43:35
您的问题的根本问题是HTTP通过TCP,这是一种面向连接的协议。因此,即使您可以使到后端的连接看起来来自客户端IP地址,也会在负载均衡器和后端之间建立TCP连接。因此,返回的TCP数据包也使用该连接。要以某种方式解决此问题,您需要让HTTP对请求和回复使用不同的TCP连接,并操纵本地IP路由以使后端回复仍然发送到实际的客户端。
如果你打算做一个HTTP负载均衡器,最简单的解决方案可能是在应用程序协议(即HTTP)级别。您可以使用HTTP重定向或其他更复杂的方法,比如在转发客户端请求之前将其包装在一些头中。我相信现有的HTTP负载均衡器提供了大量的例子和想法。
也就是说,如果您想要在TCP连接级别上解决这个问题,并且对应用程序协议是透明的,这是可行的,但它确实需要相当多的额外代码。此外,后端回复仍然通过负载均衡器。我的建议是研究IP选项IP_TRANSPARENT。它将允许您的负载均衡器在连接到后端时使用客户端IP地址作为源。(请注意,返回的流量也会通过负载均衡器,因此您的splice()会派上用场)
这是一个关于IP_TRANSPARENT Transparent proxying - how to pass socket to local server without modification?的老问题
下面是它的Linux内核文档https://www.kernel.org/doc/Documentation/networking/tproxy.txt
https://stackoverflow.com/questions/25507062
复制相似问题