7.如何用vxlan隧道分割局域网
Last updated
Was this helpful?
Last updated
Was this helpful?
这一篇的内容很长, 因为vxlan网络本身基于一些基础方案实现的, 这一节我们先简单介绍一下这个神秘的家伙到底是什么, 想要处理什么问题, 以及实现过程中可能遇到的一些tricky的点在哪儿
我们想象一下云服务的基本场景, 就是好几个人要共享一个很大的服务器, 作为提供商, 你的服务器上会有好几个租户. 保证他们彼此相互隔离是一个很重要的议题, 这句话带出了两个隐藏条件:
不同的服务器之间, 同一个服务器上的不同租户之间是三层可达的(IP报文互通)
某租户的服务可能落在好几个服务器上, 要求服务彼此互通, 同时也只能收到自己服务的消息, 我不想收到别人服务的消息
那么在这个租户眼里看来, 他自己一大堆的, 跨越了好几个服务器的服务, 彼此组成了一种类似局域网的东西. 多个租户累加在一起, vxlan想要解决的问题, 就是如何在一众服务器上管理诸多局域网的问题, vxlan, virtual extensible local area network
, 虚拟局域网, 顾名思义就是来处理这种问题的
vxlan其实也是一种隧道网络, 只不过跟ipip那种点对点的隧道网络不一样, 它是一种多对多的网络, 这是一个四通八达的隧道, 不同租户之间大家一起用这个大隧道. 一个vxlan包含好多个端点(vtep, virtual tunnel endpoint
), 这些端点可能属于不同的租户, 每个隧道里的包通过包头的标识符(vni, network identifier
)表名自己属于哪个租户, 你是不可能收到别的租户 / 别的vni的包的
vxlan并不需要你改动原先的网络, 只要你是三层互通的, 那么我们就在这个基础上布置vxlan就可以了.
我们说原先的网络他是: "三层互通, 指的是物理层+MAC+IP",
那么在上面包装一层vxlan头, 就变成了:"两层, 指的是内层(原IP消息), 与外层(vxlan封装出来的头)"
有了这样的概念以后, 我们就继续往下说, 一次发消息的过程是你发出了IP包, 然后这个包会被你所属的vtep包装出vxlan报头, 里面包含vni信息, 到达对端以后, 对端的vtep会把这个报头拿掉, 然后把这条消息拿去给收件人
vxlan工作的原理就围绕着这个vxlan报头展开, 假设你想要发一条IP报文, 这说明原先就有IP报头, 以及MAC报头. 这里的IP指的是收件人的IP以及MAC. 接着本机的vtep继续封装, 依次添加上vtep报头(包含vni信息), 以及一个UDP报头(对端vtep的mac+ip+udp报头). 我们总结一下, 为了让你发一条消息, 你一共需要这些信息:
内层: 一条IP报文
收件人IP: 这你是知道的
收件人mac: 需要想个办法知道
外层: 一个vxlan头+一个udp头
vni, 来构建vxlan报头: 你只往你自己的局域网发, 因此就填你自己的vni就好
udp报头: 本vtep的发出端口随机确定, 对端的udp监听端口写死4789
对端vtep的ip: 需要想个办法知道
对端vtep的mac: 如果知道ip就能通过arp知道对端的mac, 毕竟vtep之间是三层互通的
所以为了能让vxlan工作起来发消息, 我们要解决两个问题: 内层mac + 外层的vtep-ip. 常用的解决方法是让vxlan内的
所有vtep加入同一个多播网络, 每次想要知道以上信息的时候就通过多播来查询(村口大喇叭喊人)
设置控制中心, 设置一个agent, 里面存了所有机器的所有信息, 每次vtep想要知道这些信息的时候直接来这个agent里查就好了