如何配置Docker容器作为路由器实现跨多网络流量转发?
Docker多网络路由器容器配置方案
步骤1:创建三个独立的Docker网络
先创建三个不同子网的网络,避免IP段冲突:
docker network create --subnet=192.168.1.0/24 net1 docker network create --subnet=192.168.2.0/24 net2 docker network create --subnet=192.168.3.0/24 net3
步骤2:创建并配置路由器容器
- 启动基础路由器容器,开启特权模式(需修改系统网络参数),先绑定第一个网络:
docker run -d --name router --privileged --network net1 ubuntu:latest sleep infinity
- 将另外两个网络连接到路由器容器,让它同时接入三个网络:
docker network connect net2 router docker network connect net3 router
- 进入容器开启IP转发功能(核心的路由转发开关):
docker exec -it router bash # 临时开启IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 配置永久生效,编辑/etc/sysctl.conf,添加或修改一行: net.ipv4.ip_forward=1 # 让配置立即生效 sysctl -p
步骤3:部署业务容器并指定网关
- 先查看路由器在各网络的IP地址:
docker inspect router | grep -A20 "Networks"
输出里会看到路由器在net1、net2、net3对应的独立IP(例如分别为192.168.1.2、192.168.2.2、192.168.3.2)。
- 分别在三个网络启动业务容器,将网关指定为路由器对应网络的IP:
# net1中的业务容器 docker run -d --name container1 --network net1 --ip 192.168.1.10 --gateway 192.168.1.2 ubuntu:latest sleep infinity # net2中的业务容器 docker run -d --name container2 --network net2 --ip 192.168.2.10 --gateway 192.168.2.2 ubuntu:latest sleep infinity # net3中的业务容器 docker run -d --name container3 --network net3 --ip 192.168.3.10 --gateway 192.168.3.2 ubuntu:latest sleep infinity
步骤4:在路由器容器中捕获流量
进入路由器容器,安装tcpdump即可抓取各网络的数据包:
docker exec -it router bash apt update && apt install -y tcpdump # 抓取net1网络的流量(对应网卡eth0) tcpdump -i eth0 # 抓取net2网络的流量(对应网卡eth1) tcpdump -i eth1 # 抓取net3网络的流量(对应网卡eth2) tcpdump -i eth2
关键说明
你之前用--net=router-container的方式是让业务容器共享路由器的网络命名空间,导致IP重叠,不符合需求。正确逻辑是让路由器容器同时加入三个独立网络,每个网络拥有独立IP;业务容器在各自网络内将网关指向路由器的对应IP,这样跨网络的流量必须经过路由器转发,路由器就能完全捕获所有网络的数据包。
内容的提问来源于stack exchange,提问作者Pavan Kumar
相关产品推荐
相关产品推荐

