macvlan亲测

Macvlan
最近做一个项目,需要把container的ip暴露给外面,Google了一下发现使用macvlan或者overlay技术来实现。同时macvlan的配置更简单,并且没有使用docker的bridge,转发效率更高。因此这里就简单对macvlan学习了一下,并做了实验。这个链接还行,有抓包分析https://www.cnblogs.com/iiiiher/p/8067226.html
,我这里就不贴抓包结果了。
关于macvlan的理解
首先,从网上我们可以看到,macvlan技术就是在物理网卡下,添加另一张虚拟网卡,其实就是在物理网卡下添加了一个条件分支。我们可以认为报文从物理网卡进入之后,会做一个switch判断,如果该报文mac属于macvlan,则直接发往macvlan后面的网络,否则就发往原host的网络。这里简单的做个试验就知道了。

macvlan原理.png

首先我们创建一个macvlan docker网络:
docker network create -d macvlan
–subnet=192.168.1.0/24
–ip-range=192.168.1.0/24
-o macvlan_mode=bridge
-o parent=enp0s3 macvlan

然后我们起一个container,ip为192.168.1.11:
docker run -d --net=macvlan --ip=192.168.1.11 --name ngix ngix

ok,按照网上的说法,这个container确实没法ping通host,但是它是能够ping通外接的switch,这个我在公司有做过,介于公司的隐私问题,这里就不贴出来了。这里我想给出一个方案,使得container能够ping通host,网上多数关于macvlan的教程并没有提到这点。
我们利用linux创建一个macvlan类型的link,同时赋予一个与container同网段的ip:
sudo ip link add mymacvlan link enp0s3 type macvlan mode bridge
sudo ip addr add 192.168.1.10/24 dev mymacvlan
sudo ifconfig mymacvlan up

再尝试ping, ok完全没问题,ping通:
➜ ping 192.168.1.11
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.142 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=0.050 ms
64 bytes from 192.168.1.11: icmp_seq=4 ttl=64 time=0.066 ms
64 bytes from 192.168.1.11: icmp_seq=5 ttl=64 time=0.062 ms
64 bytes from 192.168.1.11: icmp_seq=6 ttl=64 time=0.064 ms

这里贴出tcpdump的抓包结果,可以看到是由我们添加的link192.168.1.10发起的icmp请求。我理解其实就是通过macvlan的bridge模式建立了一条与container之间的通路。

抓包结果

带vlan的macvlan
我理解的带vlan的macvlan其实并不是macvlan实现的,实际上是linux的子接口本身就是利用vlan来区别不同的子接口,而macvlan依附在子接口上,为子接口上加了一个mac,因此从子接口macvlan出来的报文都会带有vlan tag。
ok,再做一次实验, 这次配置与上面类似,只是用的是子接口:
docker network create -d macvlan
–subnet=192.168.2.0/24
–ip-range=192.168.2.0/24
-o macvlan_mode=bridge
-o parent=enp0s3.20 macvlan20

docker run -d --net=macvlan20 --ip=192.168.2.11 --name ngix ngix

sudo ip link add mymacvlan20 link enp0s3.20 type macvlan mode bridge
sudo ip addr add 192.168.2.10/24 dev mymacvlan20
sudo ifconfig mymacvlan20 up

同时我们看一看interface:
➜ ~ ip -d link
34: enp0s3.20@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 08:00:27:0a:7c:d0 brd ff:ff:ff:ff:ff:ff promiscuity 1
vlan protocol 802.1Q id 20 <REORDER_HDR> addrgenmode eui64

可以看到我们添加了一个子接口,同时这个子接口有带vlan id 20
,使用的802.1q协议。
再来ping一次,完全没问题:
➜ ~ ping 192.168.2.11
PING 192.168.2.11 (192.168.2.11) 56(84) bytes of data.
64 bytes from 192.168.2.11: icmp_seq=1 ttl=64 time=0.175 ms
64 bytes from 192.168.2.11: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 192.168.2.11: icmp_seq=3 ttl=64 time=0.126 ms
64 bytes from 192.168.2.11: icmp_seq=4 ttl=64 time=0.061 ms

如果抓包看看,出去的报文应该是带了vlan20的tag,在公司有做实验,本人电脑太挫就没法贴出结果了。

作者:大雄good
链接:https://www.jianshu.com/p/593ce40e7df0
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值