首页 > 解决方案 > 通过 Linux 网关将 TCP 数据包发送到特定的后端工作人员

问题描述

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

组件: - 1 个具有公共 IP 的 Linux 服务器网关。- 所有后端服务器工作人员(容器)只有私有 IP(只能从网关访问)。- 1-4 个客户端主机。- 客户端始终只使用网关的 443 端口。

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

  1. 客户端打开到网关的 TCP 连接(已知公共 IP)-套接字 s0(源端口 p0)-“管理”连接。
  2. 客户得到新任务。
  3. 客户端使用套接字 s0(源端口 p0)向网关发送“新任务”消息。
  4. 网关设置一个新容器,获取其私有 ip 并返回客户端 worker_id - w1。
  5. 客户端打开新的 TCP 连接(每个 worker_id 的新套接字+新源端口)到网关 - 套接字 s1(源端口 p1)。
  6. 所有通过套接字 s1/端口 p1 的客户端数据包都应转发到工作线程 w1。
  7. 每个将到达客户端的新任务都将再次触发步骤 2-6 - 创建新的后端工作程序、新的 TCP 连接(使用新的套接字和端口)。
  8. 要求的行为: - 所有通过套接字 s1/端口 p1 的客户端数据包仍应仅转发给工作人员 w1。- 所有通过套接字 s2/端口 p2 的客户端数据包都应该只转发给工作人员 w2。- 所有通过套接字 s3/端口 p3 的客户端数据包应仅转发到工作人员 w3。- 等等……</li>
  9. 任务完成后,worker 会杀死自己,并且应该清除网关中的相关映射。
  10. 附加要求:在任何连接断开的情况下,相应的连接也应断开(例如,容器崩溃 - w1,导致网关与工作线程 w1 断开连接,应导致网关与客户端套接字 s1 之间的连接断开连接)。

我用谷歌搜索并找到了几个方向,但我不确定哪一个会通过最简单的实现给我预期的行为:

  1. Linux iptables - 使用 linux NAT (DNAT) 的负载平衡/路由。
  2. Unix socat。
  3. C 代码使用 - select()、epoll() 或 kqueue()。
  4. Linux IP 命令。
  5. Socket 到 Socket 路由(应用层)——最不需要的(但如果这是我唯一的选择,你熟悉开源实现它吗?)

非常感谢!

标签: linuxsocketsnetwork-programminggateway

解决方案


推荐阅读