桥接的意义和目的
虚拟机是Linuxer常用的一个软件,因为有些应用在Linux是无法完成,必须在虚拟机内完成。不过虚拟机联网确实是一个比较麻烦的问题。NAT虽然简单,但是不能和宿主机通信确实一个遗憾。而且桥接可以使虚拟机在局域网内具有同等的地位,虚拟机也可以有自己的IP。所以桥接联网可以算是现在最好的方式。
eth0为静态IP的情况下
首先安装bridge-utils和tunctl
su -c 'yum install bridge-utils tunctl'
然后查看tun模块是否已经被加载
lsmod | grep tun
如果没有,则需要手动加载tun模块
su -c 'modprobe tun'
一切完成以后,则可以开始搭建桥接网络。首先是新建一个名为tap0的虚拟网卡,所有者为当前用户。
su -c ‘tunctl -t tap0 -u $USERNAME’
新建一个名为br0的网桥
su -c 'brctl br0'
使eth0进入promiscuous模式,不过执行此步之前最好记录原来eth0的IP,避免后面出现IP冲突。
su -c 'ifconfig eth0 0.0.0.0 promisc'
将eth0加入br0
su -c 'brctl addif br0 eth0'
设定br0的IP,最好使用原来eth0的IP,假设原来eth0的IP为192.168.1.1
su -c 'ifconfig br0 192.168.1.1 netmask 255.255.255.0'
删除原来旧的网关,设定新的网关,假定网关为192.168.1.1
su -c 'route del default' su -c 'route add default 192.168.1.1 gw'
将tap0加入br0
su -c ‘brctl addif br0 tap0’
激活tap0
su -c 'ifconfig tap0 up'
设定tun设备的读写权限
su -c 'chmod a+rw /dev/net/tun'
然后在虚拟机的选择tap0作为网卡即可。
eth0为动态IP的情况下
eth0为动态IP的情况跟在静态IP的情况。基本一致。在保证dhclient已经被安装后,只需要把“设定br0的IP”、“删除旧网关”和“设定新网关”这三步替换为如下两步即可。
激活br0
su -c ‘ifconfig br0 up’
获取br0的IP
su -c ‘dhclient br0’
开机后自动搭建桥接网络
因为当机器重启或者关闭以后,设定的桥接网络就会自动被系统移除。所以当机器每一次重启的时候,都搭建一次桥接网络,就显得麻烦了。不过我们可以借用bash脚本来实现开机后自动搭建桥接网络。 以eth0为动态获取IP,桥接两个虚拟网卡为例 在$HOME目录新建一个vmbridge.sh文件,打开后把以下内容复制粘贴下去,并保存
#!/bin/bash modprobe tun tunctl -t tap0 -u $USERNAME tunctl -t tap1 -u $USERNAME brctl addbr br0 ifconfig eth0 0.0.0.0 promisc brctl addif br0 eth0 ifconfig br0 up dhclient br0 brctl addif br0 tap0 brctl addif br0 tap1 ifconfig tap0 up ifconfig tap1 up chmod a+rw /dev/net/tun
然后添加vmbridge.sh的执行权限
su -c ‘chmod +x $HOME/vmbridge.sh’
把该脚本添加到rc.local开机脚本去,实现开机自动构建桥接网络
su -c 'echo "$HOME/vmbridge.sh" >> /etc/rc.local' 或者 su -c ‘cat $HOME/vmbridge.sh >> /etc/rc.local’
注意事项
1. 桥接后,br0的IP就是宿主机的IP,而虚拟机的IP需要在虚拟机内设定。至于是动态IP还是静态IP,需要根据使用者的需要来设定。因为虚拟机桥接接入局域网以后,虚拟机就相当于是局域网内的一台实体计算机,与宿主机平行,所以IP的设定要谨慎一些。如果宿主机是静态IP,而虚拟机是动态IP,那么请确保局域网内有一台DHCP服务器来分配IP。
2. 设定虚拟机IP的时候,请不要跟br0的IP相同,否则会造成IP冲突,导致宿主机或虚拟机不能连接网络。
3. 如果出现虚拟机、宿主机和网关能够互相ping通,但虚拟机不能浏览网络等情况,请检查虚拟机的DNS设置。如果出现宿主机或虚拟机断开网络,请检查桥接网络中网桥是否连接好,网关是否设置好。
4. 本方法适用于XEN、KVM、QEMU和版本较旧的VirtualBox。