linux - 通过 Linux 网关将 TCP 数据包发送到特定的后端工作人员
问题描述
我正在寻找一种方法来实现网关,该网关将根据某些特定标识符(task_id)将 TCP 数据包从客户端(1-4 个客户端主机)路由到特定的后端工作程序(docker 容器)。
组件: - 1 个具有公共 IP 的 Linux 服务器网关。- 所有后端服务器工作人员(容器)只有私有 IP(只能从网关访问)。- 1-4 个客户端主机。- 客户端始终只使用网关的 443 端口。
整个流程(为简单起见,有 1 个客户端):
- 客户端打开到网关的 TCP 连接(已知公共 IP)-套接字 s0(源端口 p0)-“管理”连接。
- 客户得到新任务。
- 客户端使用套接字 s0(源端口 p0)向网关发送“新任务”消息。
- 网关设置一个新容器,获取其私有 ip 并返回客户端 worker_id - w1。
- 客户端打开新的 TCP 连接(每个 worker_id 的新套接字+新源端口)到网关 - 套接字 s1(源端口 p1)。
- 所有通过套接字 s1/端口 p1 的客户端数据包都应转发到工作线程 w1。
- 每个将到达客户端的新任务都将再次触发步骤 2-6 - 创建新的后端工作程序、新的 TCP 连接(使用新的套接字和端口)。
- 要求的行为: - 所有通过套接字 s1/端口 p1 的客户端数据包仍应仅转发给工作人员 w1。- 所有通过套接字 s2/端口 p2 的客户端数据包都应该只转发给工作人员 w2。- 所有通过套接字 s3/端口 p3 的客户端数据包应仅转发到工作人员 w3。- 等等……</li>
- 任务完成后,worker 会杀死自己,并且应该清除网关中的相关映射。
- 附加要求:在任何连接断开的情况下,相应的连接也应断开(例如,容器崩溃 - w1,导致网关与工作线程 w1 断开连接,应导致网关与客户端套接字 s1 之间的连接断开连接)。
我用谷歌搜索并找到了几个方向,但我不确定哪一个会通过最简单的实现给我预期的行为:
- Linux iptables - 使用 linux NAT (DNAT) 的负载平衡/路由。
- Unix socat。
- C 代码使用 - select()、epoll() 或 kqueue()。
- Linux IP 命令。
- Socket 到 Socket 路由(应用层)——最不需要的(但如果这是我唯一的选择,你熟悉开源实现它吗?)
非常感谢!
解决方案
推荐阅读
- android - 使用 Gradle 为 android 编译 c++ - 在 Visual Studio 中编译但在 Gradle 中不编译?
- r - 效应量置信区间 (ETA2)
- math - 对残差平方的说明
- r - 如何在闪亮的情况下从 selectInput() 函数中绘制选定的输入?
- kubernetes - 保证 Kubernetes Job 中 preStop 的执行
- python - python相当于perl的“opendir”
- javascript - JS 承诺
回来 - python - 如何访问csv文件中的行
- php - 分页 - JQUERY
- performance - 为什么存在软件更新?