解决方法来源:https://smalloutcome.com/2021/07/18/Docker-%E4%BD%BF%E7%94%A8-macvlan-%E7%BD%91%E7%BB%9C%E5%AE%B9%E5%99%A8%E4%B8%8E%E5%AE%BF%E4%B8%BB%E6%9C%BA%E7%9A%84%E9%80%9A%E4%BF%A1%E8%BF%87%E7%A8%8B/
原因
- 宿主机在物理层,默认通过 eth0 转发同网段流量
- 容器在macvlan0层,通过->macvlan0->eth0传递流量
从上面来看,其实从容器到宿主机是可以发出去的,但是从宿主机到容器却直接从eth0发出去了。
解决思路:
- 建立一个虚拟网卡,桥接macvlan0和host的物理网卡eth0
- 通过路由将容器IP指向虚拟网卡,这样来回就都通了。
配置命令
# 开启宿主机网卡的混杂模式,这样可以同一接口使用不同MAC地址
ip link set eth0 promisc on
# 添加一个虚拟网卡,将eth0和macvlan网络层桥接起来
ip link add link eth0 macvlan0-host type macvlan mode bridge
# 启用网卡
ip link set dev macvlan0-host up
# 再添加一个表态路由,将容器流量通过桥接网卡转发到macvlan网络层
ip route add 10.1.1.11 dev macvlan0-host
# 这样配置完成之后,就通过路由分流,将10.1.1.11的流量转发到macvlan网络层了。