重新找一台主机 host3,通过打开 ip_forward 把它改造成一台路由器(至于为什么可以这样,可以参考我之前的一篇文章),用来打通两个 macvlan 网络,大概的图示如下所示:
1 首先对 host3 执行 sysctl -w net.ipv4.ip_forward=1 打开路由开关。
2 然后创建两个 VLAN 子接口,一个作为 macvlan 网络 mac10 的网关,一个作为 mac20 的网关。
[root@localhost ~]# vconfig add enp0s8 100 [root@localhost ~]# vconfig add enp0s8 200 [root@localhost ~]# vconfig set_flag enp0s8.100 1 1 [root@localhost ~]# vconfig set_flag enp0s8.200 1 1 # 对 vlan 子接口配置网关 IP 并启用 [root@localhost ~]# ifconfig enp0s8.100 172.16.10.1 netmask 255.255.255.0 up [root@localhost ~]# ifconfig enp0s8.200 172.16.20.1 netmask 255.255.255.0 up3 这样之后再从 d1 ping d2 和 d4,就可以 ping 通了。
root@ubuntu:~# docker exec d1 ping -c 2 172.16.20.10 PING 172.16.20.10 (172.16.20.10): 56 data bytes 64 bytes from 172.16.20.10: seq=0 ttl=63 time=0.661 ms 64 bytes from 172.16.20.10: seq=1 ttl=63 time=0.717 ms --- 172.16.20.10 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.661/0.689/0.717 ms root@ubuntu:~# docker exec d1 ping -c 2 172.16.20.11 PING 172.16.20.11 (172.16.20.11): 56 data bytes 64 bytes from 172.16.20.11: seq=0 ttl=63 time=0.548 ms 64 bytes from 172.16.20.11: seq=1 ttl=63 time=0.529 ms --- 172.16.20.11 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.529/0.538/0.548 msPS:可能有些系统做了安全限制,可能 ping 不通,这时候可以添加以下 iptables 规则,目的是让系统能够转发不通 VLAN 的数据包。
iptables -t nat -A POSTROUTING -o enp0s8.100 -j MASQUERADE iptables -t nat -A POSTROUTING -oenp0s8.200 -j MASQUERADE iptables -A FORWARD -i enp0s8.100 -o enp0s8.200 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i enp0s8.200 -o enp0s8.100 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i enp0s8.100 -o enp0s8.200 -j ACCEPT iptables -A FORWARD -i enp0s8.200 -o enp0s8.100 -j ACCEPT为什么配置 VLAN 子接口,配上 IP 就可以通了,我们可以看下路由表就知道了。
首先看容器 d1 的路由:
root@ubuntu:~# docker exec d1 ip route default via 172.16.10.1 dev eth0 172.16.10.0/24 dev eth0 scope link src 172.16.10.10我们在创建容器的时候指定了网关 172.16.10.1,所以数据包自然会被路由到 host3 的接口。再来看下 host3 的路由:
[root@localhost ~]# ip route default via 192.168.108.1 dev enp0s3 proto dhcp metric 100 172.16.10.0/24 dev enp0s8.100 proto kernel scope link src 172.16.10.1 172.16.20.0/24 dev enp0s8.200 proto kernel scope link src 172.16.20.1 192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.122 metric 101 192.168.108.0/24 dev enp0s3 proto kernel scope link src 192.168.108.2 metric 100可以看到,去往 172.16.10.0/24 网段的数据包会从 enp0s8.100 出去,同理 172.16.20.0/24 网段也是,再加上 host3 的 ip_forward 打开,这就打通了两个 macvlan 网络之间的通路。
02 总结macvlan 是一种网卡虚拟化技术,能够将一张网卡虚拟出多张网卡。
macvlan 的四种通信模式,常用模式是 bridge。
在 Docker 中,macvlan 只支持 bridge 模式。
相同 macvlan 可以通信,不同 macvlan 二层无法通信,可以借助三层路由完成通信。
思考一下:
macvlan bridge 和 bridge 的异同点
还有一种类似的技术,多张虚拟网卡共享相同 MAC 地址,但有独立的 IP 地址,这是什么技术?
后台回复“加群”,带你进入高手如云交流群
我的公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。
参考:
https://www.cnblogs.com/CloudMan6/p/7400580.html
https://blog.csdn.net/dog250/article/details/45788279
https://www.hi-linux.com/posts/40904.html