2007-02-25

VirtualBox桥接局域网

一般情况下用VirtualBox虚拟个东西上网直接用"NAT"(guest安装VBoxGuestAdditions.iso后)就可以了,可以实现guest<->host及guest<->Intenet。
但要guest和局域网内的机器互访,还是虚拟个网卡后用bridge好些。

首先,需要内核的支持,在编译的时候加入"802.1d Ethernet Bridging" (in "Networking options") <CONFIG_BRIDGE>支持bridge 和 "Universal TUN/TAP device driver support" (in "Network device support")<CONFIG_TUN>支持tun设备(虚拟网卡)。

以下用到的命令tunctl在包uml-utilities中,brctl在包bridge-utils中。
(uml-utilities可以在 http://user-mode-linux.sourceforge.net/dl-sf.html 下载到,我只编译了uml_utilities_20040406.tar.bz2中的./tools/tunctl)

(注:其中'davy'是我的用户名,已加入'vboxusers'组)

# ifconfig eth0 down
# modprobe tun #如果没有/dev/net/tun的话用这个加载tun模块
# tunctl -t tap1 -u davy #创建虚拟网卡tap1
# brctl addbr br_vm #创建一个网桥br_vm
# brctl addif br_vm eth0 #向网桥br_vm添加物理网卡eth0
# brctl addif br_vm tap1 #向网桥br_vm添加虚拟网卡tap1
# ifconfig eth0 0.0.0.0 promisc up
#网桥的每个物理网卡作为一个端口,运行于混杂模式,而且是在链路层工作,所以就不需要IP了。
# ifconfig br_vm 192.168.1.21 netmask 255.255.255.0 broadcast 192.168.1.255 up
#然后给br_vm的虚拟网卡配置IP:192.168.1.21,那样就能远程管理网桥。
# route add default gw 192.168.1.2 dev br_vm #为br_vm添加网关
# ifconfig tap1 up
# chown root:vboxusers /dev/net/tun
# chmod 660 /dev/net/tun


VirtualBox中把Adapter0改成 Host interface,把Interface Name 那一栏添上tap1,然后启动虚拟系统,设置好IP,就可以访问局域网上的资源了。

用完后,删除桥接:
# ifconfig br_vm down
# brctl delif br_vm eth0 #移除和网桥间的关系
# brctl delif br_vm tap1
# brctl delbr br_vm #删除br_vm
# tunctl -d tap1 #删除虚拟网卡tap1
# ifconfig eth0 192.168.1.21 netmask 255.255.255.0 broadcast 192.168.1.255 up
# route add default gw 192.168.1.2 # 重新设置IP和网关


参考资料:
http://edeca.net/articles/bridging/index.html
http://linux-net.osdl.org/index.php/Bridge (http://bridge.sourceforge.net/)

//EOF

2 comments:

Davy Hawk said...

另外,这里有更多的配置方法:
VirtualBox网络配置详解

Davy Hawk said...

有人问“为什么能ping通外网IP但不能DNS解析呢?”
那很有可能是因为你没开防火墙的 UDP 53 端口。
重新配置iptable,让你刚创建的虚拟网卡能通过你的eth0访问外网的UDP 53端口。