TUN/TAP虚拟网络设备为用户空间程序提供了网络数据包的发送和接收能力。他既可以当做点对点设备(TUN),也可以当做以太网设备(TAP)。实际上,不仅Linux支持TUN/TAP虚拟网络设备,其他UNIX也是支持的,他们之间只有少许差别。

    TUN/TAP虚拟网络设备的原理比较简单,他在Linux内核中添加了一个TUN/TAP虚拟网络设备的驱动程序和一个与之相关连的字符设备/dev/net/tun,字符设备tun作为用户空间和内核空间交换数据的接口。当内核将数据包发送到虚拟网络设备时,数据包被保存在设备相关的一个队列中,直到用户空间程序通过打开的字符设备tun的描述符读取时,它才会被拷贝到用户空间的缓冲区中,其效果就相当于,数据包直接发送到了用户空间。通过系统调用write发送数据包时其原理与此类似。

    QEMU虚拟机网络的缺省模式是NAT方式,即虚拟机可以通过host访问外网,但host和外网无法访问虚拟机。如果要想让host访问虚拟机,则可以使用TAP方式。

它会将guestsystem的网络和host system的网络连在一起。

通过TUN/TAPadapter,会生成一个在host system上的虚拟网卡tap,而tun建立了point to point的网络设备,使得guest system的网卡和tap虚拟网卡成为一对,从而guest system的所有网络包,host system都能收到。

如图所示:

 

创建的过程如下

(1) 在Host机器上创建bridge br0

brctl addbr br0

(2) 将br0设为up

ip link set br0 up

(3) 创建tap device

# tunctl –b tap0

(4) 将tap0设为up

ip link set tap0 up

(5) 将tap0加入到br0上

brctl addif br0 tap0

(6) 启动虚拟机

qemu-system-x86_64-enable-kvm -name ubuntutest  -m 2048 -hda ubuntu-14.04.img -boot c -vnc:19 -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no

虚拟机连接tap0,tap0连接br0

(7) 虚拟机启动后,网卡没有配置,所以无法连接外网,先给br0设置一个ip

ifconfig br0192.168.57.1/24

(8) 在虚拟机里面,给网卡设置地址

ifconfig eth0192.168.57.2/24

这个时候在虚拟机里面可以ping的通192.168.57.1了,但是还是无法访问外网

(9) 在Host上设置NAT,并且enable ip forwarding

# sysctl -p
net.ipv4.ip_forward = 1

sudo iptables -t nat -APOSTROUTING -o eth0 -j MASQUERADE

(10) 在虚拟机里面设置默认网关

route add –net defaultgw 192.168.57.1

这个时候,可以ping的通外网网关了

ping 16.158.164.1

(11) 然后在虚拟机里面设置dns,则可以进行apt-get

# cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BEOVERWRITTEN
nameserver 16.110.135.52
nameserver 16.110.135.51

 

(12)所以如上所说

我们可以在openstack环境上验证该特性在虚拟机上的使用:

# 通过登录计算节点查看
# virsh dumpxml instance-00000517
<interface type='bridge'>
  <mac address='fa:16:3e:5c:fd:01'/>
  <source bridge='qbr7522d763-26'/>
  <target dev='tap7522d763-26'/>
  <model type='virtio'/>
  <alias name='net0'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

# ps -ef|grep instance-00000517
root      3421  2874  0 16:46 pts/30   00:00:00 grep --color=auto instance-00000517
qemu     31996     1  3 Dec06 ?        19:59:03 /usr/libexec/qemu-kvm -name guest=instance-00000517 -netdev tap,fd=30,id=hostnet0,vhost=on,vhostfd=39 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:5c:fd:01,bus=pci.0,addr=0x3 …

虚拟机关联的tap设备是tap7522d763-26 (tap+neutron分配的端口的前11位)

虚拟机关联的bridge是qbr7522d763-26

虚拟机网络的模式是tap方式

 

参考文档:

https://www.cnblogs.com/popsuper1982/p/3841838.html

http://blog.csdn.net/batmancn/article/details/50668399

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐