`
haoningabc
  • 浏览: 1444733 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

tap的方式使用qemu建立虚拟机NAT网络

阅读更多
基本概念:
vm:虚拟机
主机:建立虚拟机的服务器


需求:用nat的方式,利用qemu建立一个虚拟机,使虚拟机可以访问外网
目前主机的ip为192.168.139.85
想设置vm的ip段为192.168.122.0段,dhcp自动获取ip,并访问外网

基本原理

使用tap的方式建立vm,
建立一个网桥virbr0,
把这个网桥作为网关192.168.122.1,
把tap绑定到这个网桥virbr0上,
tap设备是通到vm里面的eth0的,
所以建立的所有vm都在网桥上就可以互相访问,
在主机上使用dnsmasq建立dhcp服务,绑定到virbr0上,
这样所有绑定到网桥的vm即可使用dhcp服务,
在vm中使用dhclient就可以获取到主机dhcp服务提供的ip地址,
在主机上设置nat的iptables,
然后打开系统的转发功能。




需要安装:qemu,tap,brctl,iptables,需要一个内核文件bzImage,一个操作系统镜像文件hda.img
环境:Ubuntu 14.04.4 LTS

一.建立一个120M的简版linux的镜像hda.img,要求支持ip,ifconfig,iptables,dhclient等网络命令
建立方法
debootstrap        --variant=minbase         --include=util-linux,dhcp-client,ssh,vim,make,psmisc,mini-httpd,net-tools,iproute,iputils-ping,procps,telnet,iptables,wget,tcpdump,curl,gdb,binutils,gcc,libc6-dev,lsof,strace         --exclude=locales,aptitude,gnupg,cron,udev,tasksel,rsyslog,groff-base,manpages,gpgv,man-db,apt,debian-archive-keyring,sysv-rc,sysvinit,insserv,python2.6         --arch i386         etch etch         'http://archive.debian.org/debian'

这个debootstrap命令国内可能不通,去aws上操作吧,如果已经有了可用的img文件,直接看第二步

具体细节参考:使用qemu的建立基本的虚拟机 http://haoningabc.iteye.com/blog/2306941
得到bzImage的内核文件和hda.img的操作系统镜像

二.使用qemu建立虚拟机,配置主机的网络
qemu-system-i386 -kernel bzImage -drive file=hda.img,if=ide,cache=none -append "console=ttyS0 root=/dev/sda rw rdinit=/sbin/init notsc=1"  -nographic -boot order=dc,menu=on -net nic,vlan=0,macaddr=52:54:00:12:34:22,model=e1000,addr=08 -net tap,name=haha,ifname=tap1,script=no,downscript=no

-kernel 指定内核文件bzImage
-append 配合kernel使用的内核参数,这里指定了启动文件/sbin/init
-drive 指定硬盘文件 hda.img,也可以用 -hda hda.img
-nographic 不用图形化界面,如果没有这个就要指定-vnc 0.0.0.0:1参数通过vncviewer访问了
例如
 qemu-system-i386 -kernel /root/jslinux/obj/linux-x86-basic/arch/i386/boot/bzImage -drive file=hda_hasbacking_file.qcow2,if=ide,cache=none -append "root=/dev/sda rw rdinit=/sbin/init notsc=1"  -vnc 0.0.0.0:1 -boot order=dc,menu=on -net nic,vlan=0,macaddr=52:54:00:12:34:22,model=e1000,addr=08 -net tap,name=haha,ifname=tap1,script=no,downscript=no

-boot 是设置启动参数,d为光驱,c为第一个硬盘,
-net 指定网络配置(这里重要)
一共有三种
-net nic 必须有的基本配置,macaddr 设置mac地址,model是网卡的类型,可以model=?查看有哪些类型
-net tap 使用桥接模式的,需要指定启动script=和关闭downscript,
fd是指向已经有的tap设备,name是在monitor模式使用info network看到的名字,ifname是tap设备在主机中的名字
-net user 用户模式,qemu使用Slirp实现了一整套tcp/ip协议栈

一般nic必须有,tap和user选一个使用

这里注意使用-net tap,ifname=tap1 建立tap设备.



建立虚拟机后,
主机ip link show
发现多了个tap1设备
建立一个网桥,
把tap1绑定到桥上,
#建立网桥
brctl addbr virbr0
ip link set tap1 up
#把tap绑定到网桥
brctl addif virbr0 tap1

#设置nat的iptables
iptables -t nat -A POSTROUTING -s "192.168.122.0/255.255.255.0" ! -d "192.168.122.0/255.255.255.0" -j MASQUERADE


#设置linux内核的转发
echo 1 >/proc/sys/net/ipv4/ip_forward
#ifconfig eth0 promisc


三.主机上启动dnsmasq服务,提供dhcp的server功能,
注意参数指向刚建的virbr0桥上

dnsmasq --strict-order --except-interface=lo --interface=virbr0 --listen-address=192.168.122.1 --bind-interfaces  --dhcp-range=192.168.122.2,192.168.122.254 --conf-file=""  --pid-file=/var/run/qemu-dhcp-virbr0.pid  --dhcp-leasefile=/var/run/qemu-dhcp-virbr0.leases --dhcp-no-override 

关键点是--interface=virbr0
--dhcp-range 设置网段范围

四.在虚拟机中,dhcp配置网络
注意这里是在vm里面操作的,上面的都是在主机上操作
ip link set eth0 up
#获取ip
dhclient
#测试ping 网关
ping 192.168.122.1
ping www.baidu.com
#查看
ifconfig eth0
#成功设置ip 192.168.122.37
cat /etc/resolv.conf
#发现dns也自动建立了
#ip route查看路由
#也可以自己设置网关和ip
#route add default gw 192.168.122.1 netmask 255.255.255.0



如果使用普通桥接参考 桥接的方式使用qemu建立虚拟机http://haoningabc.iteye.com/blog/2306736


端口映射:

在vm中启动http服务,开启80端口:
mini-httpd 
netstat -nltp|grep 80

在主机上
iptables -t nat -A PREROUTING -p tcp -d 192.168.139.85 --dport 81 -j DNAT --to 192.168.122.37:80

192.168.139.85是主机ip
192.168.122.37是vm的ip
把vm的80端口映射到主机81上,
注意这里,在主机上netstat -nltp|grep 81是看不到的
iptables -t nat -L

查看变化
如果要删掉这条规则,把-A换成-D
访问http://192.168.139.85:81 就访问到vm内部了
  • 大小: 81.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics