接上篇,kvm的网络配置,参考书本:《kvm虚拟化技术 实现以及原理解析》
2. nat模式
nat模式自动获取ip需要dhcp服务,nat功能本身需要ip伪装,既然是一个网络,所以还需要虚拟网桥功能,所以需要的软件如下:
dhcp功能:dnsmasq
ip伪装:iptables
虚拟网桥:bridge-utils
实现:
(1)yum install dnsmasq iptables bridge-utils -y#如果iptables是为内核的netfilter模块提供规则,如果内核不支持nat模块,还需要重新编译内核
(2)提供为客户机建立nat用的qemu-ifup-nat脚本和关闭的脚本qemu-ifdown-nat模式
qemu-ifup-nat脚本如下:
<code>#!/bin/bash</code>
<code>#</code>
<code>BRIDGE=virbr0</code>
<code>NETWORK=192.168.7.0</code><code>#设置nat的网段</code>
<code>NETMASK=255.255.255.0</code>
<code>GATEWAY=192.168.7.1</code><code>#网关</code>
<code>DHCPRANGE=192.168.7.2,192.168.7.30</code><code>#地址池</code>
<code>function</code> <code>check_bridge()</code><code>#检测虚拟网桥是否存在</code>
<code>{ </code>
<code> </code><code>if</code> <code>brctl show |</code><code>grep</code> <code>-q </code><code>"^$BRIDGE"</code> <code>;</code><code>then</code>
<code> </code><code>return</code> <code>1</code>
<code> </code><code>else</code>
<code> </code><code>return</code> <code>0</code>
<code> </code><code>fi</code>
<code>}</code>
<code>function</code> <code>create_bridge()</code><code>#创建虚拟网桥</code>
<code>{</code>
<code> </code><code>brctl addbr $BRIDGE </code>
<code> </code><code>brctl stp $BRIDGE on</code>
<code> </code><code>brctl setfd $BRIDGE 0</code><code>#设置网桥转发延迟</code>
<code> </code><code>ifconfig</code> <code>$BRIDGE $GATEWAY netmask $NETMASK up</code>
<code>function</code> <code>enable_ip_forward()</code><code>#开启数据包转发</code>
<code> </code><code>echo</code> <code>1 > </code><code>/proc/sys/net/ipv4/ip_forward</code>
<code>function</code> <code>add_filter_rules()</code><code>#nat功能,即出去的包修改源地址,masquerade表示iptables自己会探测自己的ip,不用手动指定</code>
<code> </code><code>iptables -t nat -A POSTROUTING -s $NETWORK/$NETMASK ! -d $NETWORK/$NETMASK -j MASQUERADE</code>
<code>function</code> <code>start_dnsmasq()</code><code>#开启dnsmasq功能,即dhcp功能,这里使用最简单的写法,更多参数参考dnsmasq --help</code>
<code> </code><code>ps</code> <code>-ef |</code><code>grep</code> <code>dnsmasq |</code><code>grep</code> <code>-</code><code>v</code> <code>grep</code> <code>&> </code><code>/dev/null</code>
<code> </code><code>if</code> <code>[ $? -</code><code>eq</code> <code>0 ];</code><code>then</code>
<code> </code><code>dnsmasq --listen-address=$GATEWAY --dhcp-range=$DHCPRANGE</code>
<code>function</code> <code>setup_bridge_nat()</code><code>#启动所有功能</code>
<code>check_bridge $BRIDGE</code>
<code>if</code> <code>[ $? -</code><code>eq</code> <code>0 ];</code><code>then</code>
<code>create_bridge</code>
<code>fi</code>
<code>enable_ip_forward</code>
<code>add_filter_rules </code>
<code>start_dnsmasq </code>
<code>if</code> <code>[ -n $1 ];</code><code>then</code>
<code>setup_bridge_nat</code><code>#真正的程序开始的地方,其实是引用上面的函数</code>
<code>ifconfig</code> <code>$1 0.0.0.0 up</code><code>#$1被虚拟成网桥,所以本身不需要ip,但是要启用</code>
<code>brctl addif $BRIDGE $1</code><code>#把$1绑定到虚拟网桥</code>
<code>else</code>
<code>exit</code> <code>1</code>
qemu-ifdown-nat脚本如下:
<code>ip link </code><code>set</code> <code>$1 down</code>
<code>brctl delif $BRIDGE $1</code>
<code>brctl delbr $BRIDGE</code>
<code>iptables -t nat -F</code>
<code>exit</code> <code>0</code>
(3)启动客户机
首先给予脚本执行权限: chmod +x /etc/qemu*
qemu-system-x86_64 -m 4096 -smp 8 -net nic -net tap,ifname=tap1,script=/etc/qemu-ifup-nat,downscript=/etc/qemu-ifdown-nat kvm_vhost/redhat6.qcow2 -daemonize
(4) 查看结果
客户机:ip a查看是否获取到了192.168.7.0段的地址,并测试是否能与外网ip通信
<a href="http://s5.51cto.com/wyfs02/M02/8A/D4/wKioL1g9LgbBL1lKAABFWhjvQUQ391.png-wh_500x0-wm_3-wmp_4-s_3822579014.png" target="_blank"></a>
宿主机:ip a可以看到有个虚拟网口virbr0,并且ip地址为192.168.7.1
(5)如果想让客户机提供的某些服务,外网可以访问,那么可以在宿主机加这么一条规则
iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.7.2:80
# 这里假设提供web服务,且客户端获取到的ip为192.168.7.2
3.qemu内部的用户模式网络
默认情况下,qemu-kvm启动客户机的时候使用slirp实现tcp/ip协议栈,并虚拟出一套nat网络,它使用简单易用,独立性好,但是不能跟宿主机和外部网络直接通信
命令:
qemu-system-x86_64 -net user[,option][,option][,...]
vlan=n : 将用户模式网络栈连接到编号为n的vlan中,默认0
name=NAME :网络别名
net=addr[/mask]:设置客户机可以看到的ip地址,默认10.0.2.0/24
host=addr:指定客户机可见宿主机的地址
restrict=y|yes|no|n:如果此选项被打开,那么客户机会被隔离,即客户机无法与外界通信,默认no
hostname=name :设置在宿主机dhcp服务器中保存的客户机主机名
dhcpstart=addr :设置分配给客户机的第一个ip
dns=addr:指定虚拟dns的地址
tftp=dir:激活qemu内嵌的tftp服务器
hostfwd=[tcp/udp]:[hostaddr]:hostport-[guestaddr]:guestport :将访问宿主机的hostport端口tcp/udp链接重定向到客户机的guestport端口上,可以多次使用
guestfwd=[tcp]:server:port-dev,将客户机中访问ip地址为server的端口连接转发到宿主机的dev这个字符设备上
bootfile=file:让file文件成为客户机可以使用的bootp启动镜像文件,它与tftp选项联合使用,可以实现从网络启动客户机的功能
smb=dir[,smbserver=addr]:激活samba功能
例子:
qemu-system-x86_64 -m 4096 -smp 8 -net nic -net user,tftp=/root/tftp,hostfwd=tcp::5022-:22 redhat6.qcow2
这里我们把宿主机的5022端口转发到客户机的22端口,结果如下:
<a href="http://s1.51cto.com/wyfs02/M01/8A/D4/wKioL1g9LlnAws1-AABuNRJ6S-Y278.png-wh_500x0-wm_3-wmp_4-s_740611133.png" target="_blank"></a>
本文转自biao007h51CTO博客,原文链接:http://blog.51cto.com/linzb/1877755 ,如需转载请自行联系原作者