docker 多网卡指定网卡出网

发布于:2024-07-02 ⋅ 阅读:(11) ⋅ 点赞:(0)

前言

宿主机中有多个网卡
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"

最终验证实现效果
在这里插入图片描述
在这里插入图片描述