将收入流量从主机上的客户端转发到容器

将收入流量从主机上的客户端转发到容器

我现在使用 Ubuntu 16.04。

我现在有一个小办公室。过去,交通情况如下:

客户端 --- 服务器 --- 路由器 --- 互联网

我像这样设置网络:

  1. 我有一个登录页面。如果客户端尚未进入网络,则客户端将首先被重定向到登录页面。
  2. 如果登录成功,我将创建 iptables 规则,让客户端访问互联网

例如这样:

  • IP 客户端 : 192.168.99.0/24
  • IP服务器:192.168.0.15
  • IP 页面登录:192.168.0.2,端口 4000(我使用 Flask 应用程序)

首先我要做的是设置 iptables 规则,将所有客户端重定向到登录页面:

iptables -I FORWARD 1 192.168.99.0/24 -J REJECT
iptables -I FORWARD 1 -s 192.168.99.0/24 -d 192.168.0.2 --dport 4000 -j ACCEPT
iptables -t nat -I PREROUTING 1 -p tcp -s 192.168.99.0/24 --dport 80 -j DNAT --to 192.168.0.2:4000

然后,如果客户端打开网站(任何内容),客户端将首先重定向到登录页面。如果登录成功,我会创建一个新规则:例如:IP 客户端:192.168.99.100

iptables -I FORWARD 1 -s 192.168.99.100 -j ACCEPT
iptables -t nat -I PREROUTING -s 192.168.99.100 -j ACCEPT
iptables -t nat -I POSTROUTING 1 -o wlp3s0 -j MASQUERADE -s 192.168.99.100

成功了!客户端可以访问互联网。现在,我想更改流量,如下所示:

客户端 --- 服务器 --- 容器 --- 服务器 --- 路由器 --- 互联网

我在服务器内部使用 docker 容器。或者,如果你想看到这样的图像:

图表

所以我想让 1 个客户端有 1 个容器。所以如果有 3 个客户端,那么也会有 3 个容器。我这样做是因为它更容易记录来自客户端的流量。

我的问题是:

  1. 我可以仅使用 iptables 来解决这个问题吗?
  2. 我可以将一个特定的 IP 从客户端路由到一个特定的 IP 容器吗?

或者有最好的方法来做到这一点?

答案1

假设每个容器都在执行路由的本地服务器上监听不同的端口,那么似乎可以使用源 IP 作为决定将其路由到哪个端口(容器)的因素。

例如,您有 3 个容器,每个容器监听不同的端口 7771、7772、7772:

IF FROM CLIENT_1_SRC_IP -> localhost:7771
IF FROM CLIENT_2_SRC_IP -> localhost:7772
IF FROM CLIENT_3_SRC_IP -> localhost:7773

记住,我不知道你的“容器”实际上在做什么, 但假设他们一旦接受了传入的数据包,就能够适当地将传入的流量路由到互联网。

还要记住,一旦出站流量离开容器,Docker 引擎将自动对该出站流量进行伪装。

相关内容