通过特定 IP 路由来自 Docker 容器的传出连接

通过特定 IP 路由来自 Docker 容器的传出连接

我有一台 docker 主机,它有一个物理网络接口(eth0)和使用 IP 别名分配给它的多个 IP 地址(eth0:1、eth0:2、eth0:3)。

我想运行多个 Docker 容器,以便每个容器都使用自己的 IP 地址向互联网发出呼叫。最好在容器之间连接时也可以通过同一个 IP 访问它们。

如何设置 docker 和 iptables 才能使其正常工作?然后我需要使用哪些参数来运行每个容器?

答案1

eth0-> 192.168.0.1

eth0:1-> 192.168.0.2

eth0:2-> 192.168.0.3

eth0:3-> 192.168.0.4

docker run --name=web01 -p 192.168.0.1:80:80 ....

docker run --name=web02 -p 192.168.0.2:80:80 ....

docker run --name=web03 -p 192.168.0.3:80:80 ....

docker run --name=web04 -p 192.168.0.4:80:80 ....

他们将创建 DNAT 规则:

链 DOCKER(2 个引用)pkts 字节目标 prot 选择加入源目标
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 192.168.0.1 tcp dpt:80 to:172.17.0.1:80

pkts 字节目标协议选择加入退出源目标
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 192.168.0.2 tcp dpt:80 to:172.17.0.2:80

...

产生流量的容器属于以下规则:

链 POSTROUTING(策略接受 430M 数据包,26G 字节)pkts 字节目标 prot opt in out 源目标
0 0 MASQUERADE 全部 -- * !docker0 172.17.0.0/16 0.0.0.0/0

附言

在 Linux 中我们可以使用多个 IP,无需别名

ip aa 192.168.0.1/24 dev eth0

ip aa 192.168.0.2/24 dev eth0 ....

答案2

期望状态

多个 Docker 容器,每个容器都使用来自我们单个网络接口的特定主机 IP,该接口:

  1. 仅在其主机 IP 上接收流量
  2. 代表其主机 IP 向互联网发送流量

解决方案

对于(1),我们可以使用docker 端口绑定像这样(这将创建DNAT用于将流量路由到相关容器的 iptable 规则):

docker run -p 192.168.1.101:80:80
docker run -p 192.168.1.102:80:80
...

对于 (2),我们可以使用SNATiptable 规则来更改传出流量的 IP 标头(请参阅此链接更多示例):

iptables -t nat -I POSTROUTING 1 -s 172.18.0.1 -j SNAT --to-source 192.168.1.101
iptables -t nat -I POSTROUTING 1 -s 172.18.0.2 -j SNAT --to-source 192.168.1.102
...

笔记iptables:请谨慎使用上述命令。另外,请注意这些命令将在POSTROUTING表链的第一个顺序插入规则nat

我尝试总结出目前针对此类问题的解决方案之一。希望它能有所帮助!

相关内容