我现在使用 Ubuntu 16.04。
我现在有一个小办公室。过去,交通情况如下:
客户端 --- 服务器 --- 路由器 --- 互联网
我像这样设置网络:
- 我有一个登录页面。如果客户端尚未进入网络,则客户端将首先被重定向到登录页面。
- 如果登录成功,我将创建 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 个容器。我这样做是因为它更容易记录来自客户端的流量。
我的问题是:
- 我可以仅使用 iptables 来解决这个问题吗?
- 我可以将一个特定的 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 引擎将自动对该出站流量进行伪装。