如何实现LXD容器与主机同时捕获同一物理网卡的流量?
解决方案:通过禁用MAC学习的网桥实现主机与LXD容器共享镜像流量
要让主机和LXD容器同时捕获同一物理网卡的镜像流量,核心是打破普通网络设备的MAC过滤机制,让镜像流量能转发到主机和容器的接口。以下是具体实现步骤:
步骤1:清理现有无效配置
先移除之前的容器网卡和错误网桥:
# 移除容器内的eth1设备 lxc config device remove centos-worker1 eth1 # 删除之前创建的ens35网桥(如果存在) ip link del ens35
步骤2:创建专用抓包网桥
创建一个禁用MAC地址学习、开启混杂模式的网桥,确保所有流量能广播到所有端口:
# 创建名为br-mirror的网桥 ip link add br-mirror type bridge # 禁用网桥MAC地址学习(关键:让所有流量转发到所有端口) ip link set br-mirror type bridge learning off # 开启网桥混杂模式 ip link set br-mirror promisc on # 将ens34添加到网桥,并确保ens34保持混杂模式 ip link set ens34 master br-mirror ip link set ens34 promisc on # 启动网桥和ens34接口 ip link set ens34 up ip link set br-mirror up
步骤3:为容器添加网桥连接
将容器的网卡连接到br-mirror网桥,并在容器内开启混杂模式:
# 给容器添加bridged类型的网卡 lxc config device add centos-worker1 eth1 nic name=eth1 nictype=bridged parent=br-mirror # 进入容器,开启eth1的混杂模式并启动接口 lxc exec centos-worker1 -- ip link set eth1 promisc on lxc exec centos-worker1 -- ip link set eth1 up
验证效果
- 主机上执行:
tcpdump -i ens34或tcpdump -i br-mirror,可正常捕获镜像流量 - 容器内执行:
tcpdump -i eth1,现在能捕获到和主机一致的全部镜像流量
为什么之前的方法失败?
- nictype=physical:会独占物理网卡,导致主机无法使用,不符合共享需求
- macvlan:基于MAC地址过滤流量,仅转发目标MAC匹配容器的包,而镜像流量的目标MAC并非容器,因此无法捕获
- 普通网桥:默认开启MAC地址学习,仅将流量转发到匹配目标MAC的端口,镜像流量无法到达容器端口;禁用MAC学习后,网桥会将所有流量广播到所有连接的端口,容器就能获取全部镜像包
内容的提问来源于stack exchange,提问作者Jean Tohme
相关产品推荐
相关产品推荐

