此文已由作者刘超授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验
三、解析br-int
br-int主要使用openvswitch中port的vlan功能
Port的一个重要的方面就是VLAN Configuration,有两种模式:
模式一:trunk port
这个port不配置tag,配置trunks
如果trunks为空,则所有的VLAN都trunk,也就意味着对于所有的VLAN的包,本身带什么VLAN ID,就是携带者什么VLAN ID,如果没有设置VLAN,就属于VLAN 0,全部允许通过。
如果trunks不为空,则仅仅带着这些VLAN ID的包通过。
模式二:access port
这个port配置tag,从这个port进来的包会被打上这个tag
如果从其他的trunk port中进来的本身就带有VLAN ID的包,如果VLAN ID等于tag,则会从这个port发出
从其他的access port上来的包,如果tag相同,也会被forward到这个port
从access port发出的包不带VLAN ID
如果一个本身带VLAN ID的包到达access port,即便VLAN ID等于tag,也会被抛弃。
例如要创建如下的虚拟网络和虚拟交换机
执行以下的命令
ovs-vsctl add-br ubuntu_br
ip link add first_br type veth peer name first_if
ip link add second_br type veth peer name second_if
ip link add third_br type veth peer name third_if
ovs-vsctl add-port ubuntu_br first_br
ovs-vsctl add-port ubuntu_br second_br
ovs-vsctl add-port ubuntu_br third_br
ovs-vsctl set Port vnet0 tag=101
ovs-vsctl set Port vnet1 tag=102
ovs-vsctl set Port vnet2 tag=103
ovs-vsctl set Port first_br tag=103
ovs-vsctl clear Port second_br tag
ovs-vsctl set Port third_br trunks=101,102
需要监听ARP,所以禁止MAC地址学习
ovs-vsctl set bridge ubuntu_br flood-vlans=101,102,103
实验结果如下:
从192.168.100.102来ping 192.168.100.103,应该first_if和second_if能够收到包
从192.168.100.100在ping 192.168.100.105, 则second_if和third_if可以收到包
从192.168.100.101来ping 192.168.100.104, 则second_if和third_if可以收到包
四、解析br-tun
br-tun主要使用openvswitch的tunnel功能和Flow功能。
Openvswitch支持三类Tunnel:gre,vxlan,ipsec_gre。
命令分别如下:
ovs-vsctl add-br testbr
ovs-vsctl add-port testbr gre0 -- set Interface gre0 type=gre options:local_ip=192.168.100.100 options:remote_ip=192.168.100.101
ovs-vsctl add-port testbr vxlan0 -- set Interface vxlan0 type=vxlan options:local_ip=192.168.100.100 options:remote_ip=192.168.100.102
ovs-vsctl add-port testbr ipsec0 -- set Interface ipsec0 type=ipsec_gre options:local_ip=192.168.100.101 options:remote_ip=192.168.100.102 options:psk=password
对于Flow Table的管理,由ovs-ofctl来控制
add−flow switch flow
mod−flows switch flow
del−flows switch [flow]
主要控制两类
Match Field
Actions
对于Match Field,不同网络层的表示方式不同,如下:
Actions有以下几类:
output:port 和 output:NXM_NX_REG0[16..31]
enqueue:port:queue
mod_vlan_vid:vlan_vid
strip_vlan
mod_dl_src:mac 和 mod_dl_dst:mac
mod_nw_src:ip 和 mod_nw_dst:ip
mod_tp_src:port 和 mod_tp_dst:port
set_tunnel:id
resubmit([port],[table])
move:src[start..end]−>dst[start..end]
load:value−>dst[start..end]
learn(argument[,argument]...)
我们模拟创建一个如下的网络拓扑结构,模拟OpenStack里面的行为
Flow Table的设计如下:
下面详细描述FlowTable的添加过程,OpenStack也是这样一个个规则添加进去的。
(1) 删除所有的Flow
ovs-ofctl del-flows br-tun
(2) Table 0
从port 1进来的,由table 1处理
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 in_port=1 actions=resubmit(,1)"
从port 2/3进来的,由Table 3处理
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 in_port=2 actions=resubmit(,3)"
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 in_port=3 actions=resubmit(,3)"
默认丢弃
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=0 actions=drop"
(3) Table 1
对于单播,由table 20处理
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=1 dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20)"
对于多播,由table 21处理
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=1 dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,21)"
(4) Table 2
默认丢弃
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=0 table=2 actions=drop"
(5) Table 3
默认丢弃
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=0 table=3 actions=drop"
Tunnel ID -> VLAN ID
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=3 tun_id=0x1 actions=mod_vlan_vid:1,resubmit(,10)"
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=3 tun_id=0x2 actions=mod_vlan_vid:2,resubmit(,10)"
(6) Table 10
MAC地址学习
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=10 actions=learn(table=20,priority=1,hard_timeout=300,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1"
Table 10是用来学习MAC地址的,学习的结果放在Table 20里面,Table20被称为MAC learning table
NXM_OF_VLAN_TCI这个是VLAN Tag,在MAC Learning table中,每一个entry都是仅仅对某一个VLAN来说的,不同VLAN的learning table是分开的。在学习的结果的entry中,会标出这个entry是对于哪个VLAN的。
NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[]这个的意思是当前包里面的MAC Source Address会被放在学习结果的entry里面的dl_dst里面。这是因为每个switch都是通过Ingress包来学习,某个MAC从某个port进来,switch就应该记住以后发往这个MAC的包要从这个port出去,因而MAC source address就被放在了Mac destination address里面,因为这是为发送用的。
load:0->NXM_OF_VLAN_TCI[]意思是发送出去的时候,vlan tag设为0,所以结果中有actions=strip_vlan
load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[]意思是发出去的时候,设置tunnel id,进来的时候是多少,发送的时候就是多少,所以结果中有set_tunnel:0x3e9
output:NXM_OF_IN_PORT[]意思是发送给哪个port,由于是从port2进来的,因而结果中有output:2
(7) Table 20
这个是MAC Address Learning Table,如果不空就按照规则处理
如果为空,就使用默认规则,交给Table 21处理
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=0 table=20 actions=resubmit(,21)"
(8) Table 21
默认丢弃
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=0 table=21 actions=drop"
VLAN ID -> Tunnel ID
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1table=21dl_vlan=1 actions=strip_vlan,set_tunnel:0x1,output:2,output:3"
ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1table=21dl_vlan=2 actions=strip_vlan,set_tunnel:0x2,output:2,output:3"
五、解析Router
使用namespace中的routing table
ip netns exec qrouter-5a74908c-712c-485c-aa9f-6c1e8b57e3e1 route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 16.158.164.1 0.0.0.0 UG 0 0 0 qg-52de6441-db
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-e0967604-78
16.158.164.0 0.0.0.0 255.255.252.0 U 0 0 0 qg-52de6441-db
Floating IP使用namespace中的iptables的nat
ip netns exec qrouter-5a74908c-712c-485c-aa9f-6c1e8b57e3e1 iptables -t nat -nvL
六、解析br-ex
将namespace中的网络和namespace外的网络连接起来
相关阅读:觉得OpenStack的网络复杂?其实你家里就有同样一个网络(1)
更多网易技术、产品、运营经验分享请点击。