分享一下个人配置kvm虚拟机时使用过的几种网桥配置方式。独服的提供商有非常多,但是每家的网络配置情况可能都不太一样。上游播额外IP的网络配置也可能都不太一样,这里我列出了三种常见上游网络额外IP配置情况。以下内容为我个人使用经验,如果有误或者需要补充的欢迎指正。
单网段
上游路由器IP,宿主机IP和虚拟机IP在同一网段。如果上游只提供了一个网段,那么就是这种配置方式。
网络架构大致如图
最基本最简单的网络配置方式。
通常情况下我们的宿主机被上游放到一个单独的VLAN里面(图中显示为VlanX)。假设我们的上游给我们分配了123.123.123.0/24 的IP段可以使用。VLAN里面会有一个上游提供的路由器地址123.123.123.1 上游路由器大部分情况下会把网络数据包untagged成不含vlan的数据包。这样的话宿主机是感受不到vlan的存在。宿主机可以使用123.123.123.0/24里面除了路由器IP以外的任何一个可用IP。这里我们假设使用了123.123.123.2并绑定到网桥vmbr0上,vmbr0和物理网卡eth0直接连接。对于虚拟机vm0 vm1 vm2来说,虚拟机的网口会直接连接到vmbr0上面。此时vmbr0可以理解为一个完整的L2交换机。在这个架构下,宿主机和所有虚拟机共用同一网段。统一使用上游路由器123.123.123.1作为gateway。上游路由器会自动学习mac地址,也就是说什么样的MAC地址路由器都会被路由器接受并存入路由器的路由表里。
以Debian为例,该网络下宿主机的配置文件(/etc/network/interfaces)配置例子如下:
auto lo
iface lo inet loopback
iface eth0 inet manual
auto vmbr0
iface vmbr0 inet static
address 123.123.123.2/24
gateway 123.123.123.1
bridge-ports eth0
bridge-stp off
bridge-fd 0
在虚拟机管理系统面板(SolusVM, Virtualizor, virtfusion, proxmox等等)里面,每个面板的配置逻辑都不太一样,但是都有共同的配置项。这些共同的配置项应该被如下配置:
额外IP Gateway:123.123.123.1
虚拟机可使用IP:123.123.123.3 到 123.123.123.254
保留IP(虚拟机不可使用)
123.123.123.0 网段地址
123.123.123.1 上游路由器(gateway)地址
123.123.123.2 宿主机地址
123.123.123.255 网段广播地址
如果面板设置正确,在虚拟机内,面板应该将网络自动配置成如下:
假设虚拟机运行Debian
auto lo
iface lo inet loopback
iface eth0 inet static
address 123.123.123.3/24
gateway 123.123.123.1
额外IP与宿主机IP不同段,共用同一上游路由器(静态MAC地址路由)
常见使用厂商:OVH,Hetzner
在静态MAC地址路由下,虚拟机网卡的IP的网段不一定需要和路由器的IP的网段一样。
网络架构大致如图
和第一种网络配置非常相似。宿主机和上游使用同一网段的IP。但是最大的区别就是上游给我们宿主机分配了和宿主机IP不一样网段的额外IP地址。图中额外ip为66.66.66.0/24。其中vm0被分配到了66.66.66.1,vm1被分配到了66.66.66.2,vm2被分配到了66.66.66.3.
这个网络架构的实现方法为,上游路由器内部有一个固定的IP地址对应MAC地址表(比如OVH里叫做Virtual MAC),同时路由器关闭了MAC地址学习。路由器只会处理从表里的MAC地址发来对应源IP的数据包,或者把IP数据包发送给对应的IP地址的MAC地址上。这就要求虚拟机的IP地址必须和虚拟机的网卡地址进行一对一的绑定。
在这个网络架构下,宿主机配置和第一种网络架构配置一样。
以Debian为例,该网络下宿主机的配置文件(/etc/network/interfaces)配置例子如下:
auto lo
iface lo inet loopback
iface eth0 inet manual
auto vmbr0
iface vmbr0 inet static
address 123.123.123.2/24
gateway 123.123.123.1
bridge-ports eth0
bridge-stp off
bridge-fd 0
在虚拟机管理系统面板(SolusVM, Virtualizor, virtfusion, proxmox等等)里面,每个额外IP对应的MAC地址都需要单独配置:
额外IP Gateway:123.123.123.1
虚拟机可使用IP:
66.66.66.1
绑定虚拟机vm0网卡MAC地址
66.66.66.2
绑定虚拟机vm1网卡MAC地址
66.66.66.3
绑定虚拟机vm2网卡MAC地址
(如果你有一大堆ip地址,没错,你要一个个手动绑定)
如果面板设置正确,在虚拟机内,面板应该将网络自动配置成如下:
假设虚拟机vm0运行Debian,虚拟机内网卡名为eth0
auto lo
iface lo inet loopback
iface eth0 inet static
address 66.66.66.1/24
gateway 123.123.123.1
hwaddress ether vm0的eth0网卡MAC地址 #有可能缺省,一般面板会自动配置
post-up route add 123.123.123.1 dev eth0 #告诉系统123.123.123.1是在eth0接口后面
post-up route add default gw 123.123.123.1 dev eth0 #设置默认路由为123.123.123.1
其中我们需要特别告诉系统如果想找123.123.123.1就去eth0. 同时也要把默认路由设置成123.123.123.1。一般情况下面板会自动帮我们配置的。
额外IP与宿主机IP不同段,不共用路由器(间接路由)
常见使用厂商及方法:斯巴达,宿主机播BGP,隧道
和第二种类似。但是上游路由器没有配置静态MAC地址路由,取而代之的是把额外ip整段直接路由到宿主机IP上。剩下来的静态MAC地址路由则是交给了我们宿主机去做。
网络架构大致如图
这次,上游网络会将所有的和66.66.66.0/24有关的数据包都路由到123.123.123.2 在linux里类似的路由命令相当于
route add 66.66.66.0/24 via 123.123.123.2 dev 宿主机连接的网口 #上游网络里配置的,我们不用配置
宿主机的IP则是要把123.123.123.2 IP直接绑定到网卡eth0上。vmbr0不和eth0网口直接相连。取而代之的是我们在网卡和vmbr0之间手动配置静态路由。将整个66.66.66.0/24继续路由到vmbr0上。在linux里类似的命令相当于
ip route add 66.66.66.0/24 dev vmbr0
以Debian为例,该网络下宿主机的配置文件(/etc/network/interfaces)配置例子如下:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 123.123.123.2/24
gateway 123.123.123.1
auto vmbr0
iface vmbr0 inet static
#dummy ip,我们实际上不使用这个IP。但是Linux bridge可能需要至少一个ip去启动
address 10.0.0.1 #dummy ip,不一定是10.0.0.1
bridge-ports none
bridge-stp off
bridge-fd 0
post-up route add 66.66.66.0/24 dev vmbr0
在虚拟机管理系统面板(SolusVM, Virtualizor, virtfusion, proxmox等等)里面:
额外IP Gateway:123.123.123.2 (注意是2不是1)
虚拟机可使用IP:66.66.66.1 到 66.66.66.254
虚拟机IP网段:分配的网段,或者分配的网段长度减去2(起始IP得改)
虚拟机网段长度减去2是一个可选配置方法,理论上这样的话网段ip和广播ip都能拿来用。可以最大化利用IP地址段(比如上面的66.66.66.0和66.66.66.255都可以拿来用)。缺点就是可能有些安全性问题同时邻居外部网段虚拟机会无法访问(被当作同一内网了)。
如果面板设置正确,在虚拟机内,面板应该将网络自动配置成如下:
假设虚拟机vm0运行Debian,虚拟机内网卡名为eth0
auto lo
iface lo inet loopback
iface eth0 inet static
address 66.66.66.1/24
gateway 123.123.123.2
post-up route add 123.123.123.2 dev eth0 #告诉系统123.123.123.1是在eth0接口后面
post-up route add default gw 123.123.123.2 dev eth0 #设置默认路由为123.123.123.1