lxc网络
1 macvlan方式
macvlan方式有三种模式private、bridge、vepa
要容器与宿主机间,容器与其他主机间都能正常通信,需要使用bridge的模式,并且主机也需要配置macvlan虚拟设备(参考1.3),使用其他模式,不管配不配置主机,都只能和其他主机通信,不能和宿主机通信。
1.1 应用场景
1.2 数据收发方式
1.3 目前验证能够网络正常的通信设置:
config:
lxc.network.type=macvlan
lxc.network.link=eth0
lxc.network.flags=up
lxc.network.macvlan.mode=bridge
lxc.network.ipv4=128.5.160.94/24
lxc.network.ipv4.gateway=128.5.160.254
lxc.utsname=suse1
lxc.tty = 4
lxc.pts = 1024
lxc.rootfs = /home/w00227741/SUSE_sp2_template/rootfs
lxc.mount = /home/w00227741/SUSE_sp2_template/fstab
lxc.cgroup.devices.deny= a
# /dev/null andzero
lxc.cgroup.devices.allow= c 1:3 rwm
lxc.cgroup.devices.allow= c 1:5 rwm
# consoles
lxc.cgroup.devices.allow= c 5:1 rwm
lxc.cgroup.devices.allow= c 5:0 rwm
lxc.cgroup.devices.allow= c 4:0 rwm
lxc.cgroup.devices.allow= c 4:1 rwm
#/dev/{,u}random
lxc.cgroup.devices.allow= c 1:9 rwm
lxc.cgroup.devices.allow= c 1:8 rwm
lxc.cgroup.devices.allow= c 136:* rwm
lxc.cgroup.devices.allow= c 5:2 rwm
# rtc
lxc.cgroup.devices.allow= c 254:0 rwm
宿主机上:
配置前:
# ifconfig
eth0 Link encap:Ethernet HWaddr 80:FB:06:36:96:68
inet addr:128.5.160.34 Bcast:128.5.160.255 Mask:255.255.255.0
inet6 addr:fe80::82fb:6ff:fe36:9668/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:67 errors:0 dropped:0overruns:0 frame:0
TX packets:77 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7013 (6.8 Kb) TX bytes:10224 (9.9 Kb)
Memory:f9360000-f9380000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:27 errors:0 dropped:0overruns:0 frame:0
TX packets:27 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1863 (1.8 Kb) TX bytes:1863 (1.8 Kb)
配置:
#ifconfig eth0 0
#ip link add link eth0 name mac0 type macvlan modebridge
#ifconfig mac0128.5.160.34/24
#ip route adddefault via 128.5.160.254
配置后:
# ifconfig
eth0 Link encap:Ethernet HWaddr 80:FB:06:36:96:68
inet6 addr:fe80::82fb:6ff:fe36:9668/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2195 errors:0 dropped:0overruns:0 frame:0
TX packets:2398 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:200385 (195.6 Kb) TX bytes:731847 (714.6 Kb)
Memory:f9360000-f9380000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:102 errors:0 dropped:0overruns:0 frame:0
TX packets:102 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8291 (8.0 Kb) TX bytes:8291 (8.0 Kb)
mac0 Link encap:Ethernet HWaddr A2:43:7A:C1:7E:FE
inet addr:128.5.160.34 Bcast:128.5.160.255 Mask:255.255.255.0
inet6 addr:fe80::a043:7aff:fec1:7efe/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1016 errors:0 dropped:0overruns:0 frame:0
TX packets:998 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:90631 (88.5 Kb) TX bytes:344116 (336.0 Kb)
# netstat -r
Kernel IProuting table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 128.5.160.254 0.0.0.0 UG 0 0 0 mac0
loopback * 255.0.0.0 U 0 0 0 lo
128.5.160.0 * 255.255.255.0 U 0 0 0 mac0
(一段时间后BMC好像会变得不能用,连接后一片漆黑,木有图像)
1.4 三种模式的区别
2 vlan
使用vlan方式,只能与配置了同意vlan id的主机通信,lxc使用的vlan方式是linux下的vlan
2.1 应用场景
vlan是一种通过将局域网内的设备逻辑划分为一个个网段从而实现虚拟工作组的技术,是建立在物理网络基础上的一种逻辑子网,一个vlan组就是一个逻辑子网,即一个逻辑广播域,一个vlan内的广播和单播流量都不会转发到其他vlan中,通过对vlan的创建,隔离了广播,缩小了广播范围,可以控制广播风暴的产生。
2.2 数据收发方式
lxc中使用vlan的方式通信时,会根据指定的vlanid创建一个vlan设备,与真实的物理网卡进行绑定,并将其移入容器中。
数据收发送流程大致如下:
容器向外发送数据:
vlan设备对于上层协议而言,和实际的设备是平等的,因此也会参与路由的选择,当vlan设备被选为出口设备(容器内只有一个vlan设备,因此都是通过vlan设备对外发送数据),在hard_dev_start_xmit函数中检查到是vlan设备发送的数据包,就会插入vlan tag,并修改skb->proto=8021q,再调用vlan设备的ndo_start_xmit()函数发送数据,在该函数中会将skb重定向到宿主机上的真实物理设备,并调用真实物理设备发送数据。
当真实物理网卡接收到数据时,对数据进行检查,如果发现是vlan包,会将vlan tag移除,并将vlan id保存到skb->vlan_tci中,根据该设置的标志,将skb重定向到与真实物理网卡绑定的vlan设备,由vlan设备提交给协议栈上层,也就将数据传到了容器内。(vlan设备和真实物理设备的mac地址是一样的,所以发给vlan设备的数据包能被真实物理设备接受到)
2.3 配置方式
config:
lxc.network.type=vlan
lxc.network.link=eth2
lxc.network.flags=up
lxc.network.vlan.id= 1234
lxc.network.ipv4=128.5.130.65/24
lxc.utsname = suse1
lxc.tty = 4
lxc.pts = 1024
lxc.rootfs =/home/w00227741/SUSE_sp2_template/rootfs
lxc.mount = /home/w00227741/SUSE_sp2_template/fstab
lxc.cgroup.devices.deny = a
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm
在物理机上起的容器和宿主机以及和其他主机(配置同一vlan)都不能ping通,可能是和物理机上本身就划分了vlan的原因
在虚拟机上起vlan容器:
在另一虚拟机上配置vlan:
vconfig add eth1 1234
ifconfig eth1.1234 128.5.130.64/24
ifconfig eth1.1234 up
ifconfig eth1 0 (可选,测试发现并不影响)
这样虚拟机上的容器可以和配置同一vlan的其他虚拟机正常通信(不论是ping配置的vlan设备的ip还是vlan设备所在真是物理设备的ip),但是容器能和宿主机间不能互相ping通(不知道是不是虚拟机的问题)
2.4 vlan环境配置
l 同网段vlan通信:
为了避免网络风暴,二层交换机上通常会把网口设置成Access模式(交换机自动打上某个vlan id),这样只允许特定vlan通过,所以我们在单板上加入新vlan,数据包出去后会直接被二层交换机丢弃掉。为了解决这个问题需要:
1) 在二层交换机上把网口设置成trunk模式
2) 添加新vlan id
3) 允许新vlan通过
这样同网段vlan就可以通信了。
l 不同网段vlan通信
需要二层交换机和三层交换机配合完成,在上面的配置上还需要:
1) 在三层交换机上添加新vlan id
2) 三层交换机上为新vlan id配置新网关(每个vlan id都要有自己的网关)
3) 分别在二层交换机的出口和三层交换机对应的入口允许新vlan id通过,否则数据包不能到达三层交换机。
这样不同网段vlan就可以通信了。
上面是原理,具体操作请参见S5300交换机手册vlan章节。
2.5 应用场景
2.6 数据收发方式
2.7 配置方式
3 phys
3.1 应用场景
直接将一个现有的物理网卡分配给容器。
3.2 数据收发方式
3.3 配置方式
4 empty
4.1 应用场景
使用empty的网络类型在容器内只会创建loopback接口。
http://blog.youkuaiyun.com/dog250/article/details/7354590
https://blog.flameeyes.eu/2010/09/linux-containers-and-networking
http://www.cnblogs.com/zmkeil/archive/2013/04/18/3029339.html
http://www.kernelchina.org/node/215
http://wenku.baidu.com/view/b684f44fe45c3b3567ec8bf5.html
http://wenku.baidu.com/view/869c688984868762caaed5e2.html