kvm通过桥接访问宿主机与外网
通过艰难的过程, 终于使用 libvirt 安装完 qemu kvm 虚拟机了. 但是发现虚拟机不能上网. 虚拟机想要上网, 有很多中方法.
先说两个定义: Guest 机器为虚拟机, Host 机器为开机运行的真实机器.
查看 libvirt 的教程, 看到网络配置有许多中方式. 详情可以访问 http://libvirt.org/formatdomain.html#elementsNICS
- NAT (默认上网) 虚拟机利用 host 机器的 ip 进行上网. 对外显示一个 ip
- Bridge 将虚拟机桥接到 host 机器的网卡上, guest 和 host 机器都通过 bridge 上网. 对外不同的 ip,
- …
Bridge 桥接原理
Bridge 方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立 IP 的主机。
桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。

Bridge 桥接原理
如上图,网桥的基本原理就是创建一个桥接接口 br0,在物理网卡和虚拟网络接口之间传递数据。
在 host 机器配置桥接网络
首先可以按照 ibm 文章的虚拟机配置一下 host 机的网络情况, 这个的目的就是让 host 生成一个不日多个桥接, 大家都通过这个桥接上网. 下面我们来看看具体的步骤.
查看网卡是否工作
确保你想使用 bridge 网桥的网卡能够为 kvm 虚拟机模块提供网络连接能力并且网卡是否可以工作. 这个网卡应该要能够给 guest 的 kvm 虚拟机提供相同的网络支持. 接下来例子说明了网卡的配置, 并且可以被外部网络访问. 这个例子中, 使用 eth0 网卡.
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:14:5E:C2:1E:40
inet addr:10.10.1.152 Bcast:10.10.1.255 Mask:255.255.255.0
inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:664 errors:0 dropped:526 overruns:0 frame:0
TX packets:163 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:69635 (68.0 KiB) TX bytes:25091 (24.5 KiB)
Interrupt:74 Memory:da000000-da012800
................
备份 network-scripts 网络脚本文件
备份网络配置到不同的目录下, 将来可以用来恢复网络配置,. 根据下面的命令将网络脚本ifcfg-eth0 网卡到 /root目录:
# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /root/.
注意: 不要把文件 copy 到 /etc/sysconfig/network-scripts/ 目录或者其子目录
进入 network-scripts 目录
进入/etc/sysconfig/network-scripts/目录.
cd /etc/sysconfig/network-scripts/
为桥接新建配置文件
为 Linux 的 bridge 创建一个新的配置文件为/etc/sysconfig/network-scripts/ifcfg-br0, 这里br0是 bridge 网桥的名字, 同 eth0 类似. 使用以下命令
cp ifcfg-eth0 ifcfg-br0
具体的内容是基于已有的配置文件来进行的.
编辑 bridge 网桥配置文件
编辑配置文件, 让数据包通过 bridge(网桥) 进行上网. 你的网络配置很可能是通过静态 ip(BOOTPROTO=static) 上网或者是从 DHCP 服务器获得 ip(BOOTPROTO=dhcp) 上网的.
如果你的网络是通过静态 ip 地址来配置的, 那么你的配置很可能是和下面一样的:
DEVICE=eth0 BOOTPROTO=static HWADDR=00:14:5E:C2:1E:40 IPADDR=10.10.1.152 NETMASK=255.255.255.0 ONBOOT=yes
下面的表格显示了 eth0 和 br0 的静态 ip 配置内容, 可以根据下面进行编辑
| /etc/sysconfig/network-scripts/ifcfg-eth0 | /etc/sysconfig/network-scripts/ifcfg-br0 |
|---|---|
| DEVICE=eth0 TYPE=Ethernet HWADDR=00:14:5E:C2:1E:40 ONBOOT=yes NM_CONTROLLED=no BRIDGE=br0 | DEVICE=br0 TYPE=Bridge NM_CONTROLLED=no BOOTPROTO=static IPADDR=10.10.1.152 NETMASK=255.255.255.0 ONBOOT=yes |
下面表格显示的 eth0 和 br0 的 DHCP 配置情况.
| /etc/sysconfig/network-scripts/ifcfg-eth0 | /etc/sysconfig/network-scripts/ifcfg-br0 |
|---|---|
| DEVICE=eth0 TYPE=Ethernet HWADDR=00:14:5E:C2:1E:40 ONBOOT=yes NM_CONTROLLED=no BRIDGE=br0 | DEVICE=br0 TYPE=Bridge NM_CONTROLLED=no BOOTPROTO=dhcp ONBOOT=yes |
重启网络服务
重启网络以验证网络配置是否工作.
如果网络配置不正确, 网络连接将会断开, 你的电脑将失去访问能力. 这样的话, 检查以下配置文件, 然后使用以下的命令重启以下网络服务:
# service network restart
禁用网络过滤器
向文件/etc/sysctl.conf添加以下代码:
net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0
重新加载 kernel 参数
# sysctl -p net.ipv4.ip_forward = 1 ... net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0
验证配置是否成功
通过运行ifconfig来验证以下配置是否成功. 如果出现两个项, 即网桥的 br0 和现在在工作的 eth0:
br0 Link encap:Ethernet HWaddr 00:14:5E:C2:1E:40
inet addr:10.10.1.152 Bcast:10.10.1.255 Mask:255.255.255.0
inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:125 errors:0 dropped:0 overruns:0 frame:0
TX packets:81 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:16078 (15.7 KiB) TX bytes:18542 (18.1 KiB)
eth0 Link encap:Ethernet HWaddr 00:14:5E:C2:1E:40
inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:206 errors:0 dropped:0 overruns:0 frame:0
TX packets:58 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:27308 (26.6 KiB) TX bytes:13881 (13.5 KiB)
Interrupt:74 Memory:da000000-da012800
注意: 你可能发现 eth0 的网络信息里面没有 ipv4 的地址了. 或者你的 GUI 界面的网络显示你是断网的. 这不用担心. 因为 eth0 的网络能力已经通过 br0 进行工作. 你的 host 网络还是能正常工作的.
也可以使用以下的命令来查看网桥是否工作.
# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.000000000000 yes br0 8000.000e0cb30550 no eth0
如果是类似的输出, 那么你的 Linux 的 Bridge 网桥就配置的差不多了.
为 Guest 虚拟机配置网络
配置 Guest 虚拟机的 xml 文件
在虚拟机的 xml 配置文件进行设置网络的连接方式为 bridge 桥接, 并且桥接的设备为 br0. 其中 mac 地址要改变! 不然 MAC 相同, 局域网 MAC 地址相同的电脑不能上网.
<interface type="bridge"> <!--虚拟机网络连接方式-->
<source bridge="br0" /> <!-- 当前主机网桥的名称-->
<mac address="00:16:e4:9a:b3:6a" /> <!--为虚拟机分配mac地址,务必唯一,否则dhcp获得同样ip,引起冲突-->
</interface>
在虚拟机配置网络
我使用的是 CentOS Minimal Installation 的发行版. 使用以下命令就可以进行上网了. 一开始只有 lo 显示. 没有看到 eth0, 后来想到了 eth0 被禁用了, 于是开启即可.
# ifconfig eth0 up # dhclient eth0
现在还有个问题是, 网络不随开机启动. 我打开 / etc/sysconfig/network-scripts/ifcfg-eth0 显示:
DEVICE=eth0 HWADDR=52:54:00:12:34:56 ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=dhcp
虽然设置了开机启动, 但是每次开机都需要运行上面的两个命令. 这样就没办法远程控制主机了.
后来发现是 udev 弄的. udev 在 / etc/udev/rules.d / 下面搞了一个持久命名规则 (persistent-net.rules),对于网卡的持久命令,就采取了 MAC 地址的匹配方式
原来虚拟机安装后自带 MAC 网卡地址和我 xml 定义的网卡不一样. 于是我就将虚拟机的 MAC 网卡提取出来, 替换 xml 文件的 MAC 网卡信息. 然后 undefine 和 define 以下虚拟机.
重启虚拟机, 发现这次网络能够自动开机获得了.
参考资料
- http://blog.csdn.net/samlei/article/details/7598541
- http://www.linuxtopia.org/online_books/rhel6/rhel_6_virtualization/rhel_6_virtualization_sect-Virtualization-Network_Configuration-Bridged_networking_with_libvirt.html
- IBM – Configuring the network
- http://ueaner.iteye.com/blog/1291350
- http://blog.csdn.net/xiyuan1999/article/details/5125002
全文完本文由 简悦 SimpRead 优化,用以提升阅读体验使用了 全新的简悦词法分析引擎 beta,点击查看详细说明