前言
宿主机中有多个网卡
ens160 192.168.4.23/20 内网通信用
ens192 10.31.116.128/24 出公网访问-1
ens193 10.31.116.128/24 出公网访问-2
现在需要不同容器中不同出网访问,举例
容器1 192.168.0.1/20 网段走宿主机 ens160网卡,否则全部走ens192 网卡
容器2 192.168.0.1/20 网段走宿主机 ens160网卡,否则全部走ens193 网卡
思路
主要能想到2个办法
- 硬件: 让ens192、ens193 连接的路由器也连接到192.168.0.1/20 这个网段中,然后设置路由策略,192.168.0.1/20 的请求路由转发,这种方式更高效,但是不知道为啥我ros 一直不成功
- 软件:centos 自带的iptables 做nat 转换,大哥的帖子给的思路
这里介绍的是软件方法
简单说就是创建一个新的docker net,把不同的容器设置不同的ip,利用iptables 的规则将不同ip走不同的网卡,
比如说
容器1 设置的ip 是 10.10.11.2 ,iptables 如下设置
iptables -t nat -I POSTROUTING -p all -s 10.10.11.2 -j SNAT --to-source 10.31.116.128(指定网卡的地址)
容器1 设置的ip 是 10.10.11.3 ,iptables 如下设置
iptables -t nat -I POSTROUTING -p all -s 10.10.11.3 -j SNAT --to-source 10.32.116.128(指定网卡的地址)
这就解决了出公网,内网差不多
iptables -t nat -I POSTROUTING -p all -d 192.168.0.1/20 -j SNAT --to-source 192.168.4.23(内网网卡地址)
实现
实验环境无三张网卡,我就使用虚拟网卡
ifconfig ens192:1000 10.32.116.128/24
可以看到两个网卡出网ip 不同的
docker 新建net
docker network create --subnet 10.10.11.0/24 --gateway 10.10.11.1 hostw
net 映射
iptables -t nat -I POSTROUTING -p all -s 10.10.11.2 -j SNAT --to-source 10.31.116.128
iptables -t nat -I POSTROUTING -p all -s 10.10.11.3 -j SNAT --to-source 10.32.116.128
# 内网访问
iptables -t nat -I POSTROUTING -p all -d 192.168.0.1/20 -j SNAT --to-source 192.168.4.23
启动容器
docker run -d -it --network=hostw --ip=10.10.11.2 --name ce1 centos /bin/bash -c "tail -f /dev/null"
docker run -d -it --network=hostw --ip=10.10.11.3 --name ce2 centos /bin/bash -c "tail -f /dev/null"
最终验证实现效果