Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Linux网关向特定后端工作者发送TCP数据包_Linux_Sockets_Network Programming_Gateway - Fatal编程技术网

通过Linux网关向特定后端工作者发送TCP数据包

通过Linux网关向特定后端工作者发送TCP数据包,linux,sockets,network-programming,gateway,Linux,Sockets,Network Programming,Gateway,我正在寻找一种实现网关的方法,该网关将根据特定标识符(任务id)将TCP数据包从客户端(1-4个客户端主机)路由到特定的后端工作程序(docker容器) 组成部分: -1个具有公共IP的Linux服务器网关。 -所有后端服务器工作程序(容器)只有专用IP(所有 仅可从网关访问)。 -1-4台客户端主机。 -客户端始终仅使用网关的端口443 整个流程(为了简单起见,有一个客户端): 客户端打开到网关(已知公共IP)的TCP连接-套接字s0(源端口p0)- “管理”连接 客户端获得新任务 客户端使用

我正在寻找一种实现网关的方法,该网关将根据特定标识符(任务id)将TCP数据包从客户端(1-4个客户端主机)路由到特定的后端工作程序(docker容器)

组成部分: -1个具有公共IP的Linux服务器网关。 -所有后端服务器工作程序(容器)只有专用IP(所有 仅可从网关访问)。 -1-4台客户端主机。 -客户端始终仅使用网关的端口443

整个流程(为了简单起见,有一个客户端):

  • 客户端打开到网关(已知公共IP)的TCP连接-套接字s0(源端口p0)- “管理”连接
  • 客户端获得新任务
  • 客户端使用套接字s0(源端口p0)向网关发送“新任务”消息
  • 网关设置一个新的容器,获取它的私有ip并返回到客户端worker_id-w1
  • 客户端打开到网关的新TCP连接(每个工作者id的新套接字+新源端口)—— 套接字s1(源端口p1)
  • 套接字s1/端口p1上的所有客户端数据包都应转发给工作者w1
  • 每个将到达客户端的新任务将再次触发步骤2-6-创建新后端 工作者,新TCP连接(使用新套接字和端口)
  • 所需行为: -但是,套接字s1/端口p1上的所有客户端数据包应仅转发给工作者w1。 -套接字s2/端口p2上的所有客户端数据包应仅转发给工作者w2。 -套接字s3/端口p3上的所有客户端数据包应仅转发给工作程序w3。 -等等
  • 任务完成后,工作人员将自杀,并应清除网关中的相关映射
  • 附加要求:在任何连接断开的情况下,相应的 连接也应该断开 (例如,容器崩溃-w1导致网关与工作进程w1之间的断开,应导致网关与客户端套接字s1之间的连接断开)
  • 我在谷歌上搜索并找到了几个方向,但我不确定哪一个方向能提供最简单实现的预期行为:

  • Linux iptables-使用Linux NAT(DNAT)的负载平衡/路由
  • unixsocat
  • C代码使用-select()、epoll()或kqueue()
  • Linux IP命令
  • Socket-to-Socket路由(应用层)-最不需要的(但如果这是我唯一的选择,您熟悉开源吗 实施它?)

  • 非常感谢

    此描述无法用于正确执行任务,因为它不完整(或不明确)并且使用了错误的术语。若你们只是复制你们从其他人那个里得到的粘贴任务描述,那个么你们肯定需要在征求意见之前澄清一些事情。看起来“源端口”用于引用网关上的侦听端口。因此,您可以使用docker run将工作端口映射到主机:*docker run-p$new\u port:$container\u service\u port**此描述无法用于正确执行任务,因为它不完整(或不明确)并且使用了错误的术语。若你们只是复制你们从其他人那个里得到的粘贴任务描述,那个么你们肯定需要在征求意见之前澄清一些事情。看起来“源端口”用于引用网关上的侦听端口。因此,您可以使用docker run将工作端口映射到主机:*docker run-p$new\u port:$container\u service\u port**