[b]基本概念:[/b]
vm:虚拟机
主机:建立虚拟机的服务器
[b]需求:用nat的方式,利用qemu建立一个虚拟机,使虚拟机可以访问外网[/b]
目前主机的ip为192.168.139.85
想设置vm的ip段为192.168.122.0段,dhcp自动获取ip,并访问外网
[b]基本原理[/b]:
[color=darkred]
使用tap的方式建立vm,
建立一个网桥virbr0,
把这个网桥作为网关192.168.122.1,
把tap绑定到这个网桥virbr0上,
tap设备是通到vm里面的eth0的,
所以建立的所有vm都在网桥上就可以互相访问,
在主机上使用dnsmasq建立dhcp服务,绑定到virbr0上,
这样所有绑定到网桥的vm即可使用dhcp服务,
在vm中使用dhclient就可以获取到主机dhcp服务提供的ip地址,
在主机上设置nat的iptables,
然后打开系统的转发功能。
[/color]
[b]需要安装[/b]:qemu,tap,brctl,iptables,需要一个内核文件bzImage,一个操作系统镜像文件hda.img
[b]环境[/b]:Ubuntu 14.04.4 LTS
[b]一.建立一个120M的简版linux的镜像hda.img,要求支持ip,ifconfig,iptables,dhclient等网络命令[/b]
建立方法
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文件,直接看第二步
具体细节参考:[b]使用qemu的建立基本的虚拟机[/b] [url]http://haoningabc.iteye.com/blog/2306941[/url]
得到bzImage的内核文件和hda.img的操作系统镜像
[b]二.使用qemu建立虚拟机,配置主机的网络[/b]
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 指定网络配置([b]这里重要[/b])
一共有三种
[color=red]-net nic [/color]必须有的基本配置,macaddr 设置mac地址,model是网卡的类型,可以model=?查看有哪些类型
[color=red]-net tap [/color]使用桥接模式的,需要指定启动script=和关闭downscript,
fd是指向已经有的tap设备,name是在monitor模式使用info network看到的名字,ifname是tap设备在主机中的名字
[color=red]-net user [/color]用户模式,qemu使用Slirp实现了一整套tcp/ip协议栈
一般nic必须有,tap和user选一个使用
这里注意使用[color=red]-net tap,ifname=tap1[/color] 建立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
[b]三.主机上启动dnsmasq服务,提供dhcp的server功能,
注意参数指向刚建的virbr0桥上[/b]
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
关键点是[color=red]--interface=virbr0 [/color]
--dhcp-range 设置网段范围
[b]四.在虚拟机中,dhcp配置网络[/b]
[color=red]注意这里是在vm里面操作的,上面的都是在主机上操作[/color]
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
[img]http://dl2.iteye.com/upload/attachment/0118/2212/ebc449d3-f159-31bc-b5c9-10404c4522ab.png[/img]
如果使用普通桥接参考 [b]桥接的方式使用qemu建立虚拟机[/b]:[url]http://haoningabc.iteye.com/blog/2306736[/url]
[b]端口映射:[/b]
在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内部了