接上篇,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模块,还需要重新编译内核
qemu-ifup-nat脚本如下:
#!/bin/bash
#
BRIDGE=virbr0
NETWORK=192.168.7.0 #设置nat的网段
NETMASK=255.255.255.0
GATEWAY=192.168.7.1 #网关
DHCPRANGE=192.168.7.2,192.168.7.30 #地址池
function check_bridge() #检测虚拟网桥是否存在
{
if brctl show | grep -q "^$BRIDGE" ; then
return 1
else
return 0
fi
}
function create_bridge() #创建虚拟网桥
{
brctl addbr $BRIDGE
brctl stp $BRIDGE on
brctl setfd $BRIDGE 0 #设置网桥转发延迟
ifconfig $BRIDGE $GATEWAY netmask $NETMASK up
}
function enable_ip_forward() #开启数据包转发
{
echo 1 > /proc/sys/net/ipv4/ip_forward
}
function add_filter_rules() #nat功能,即出去的包修改源地址,masquerade表示iptables自己会探测自己的ip,不用手动指定
{
iptables -t nat -A POSTROUTING -s $NETWORK/$NETMASK ! -d $NETWORK/$NETMASK -j MASQUERADE
}
function start_dnsmasq() #开启dnsmasq功能,即dhcp功能,这里使用最简单的写法,更多参数参考dnsmasq --help
{
ps -ef | grep dnsmasq | grep - v grep &> /dev/null
if [ $? - eq 0 ]; then
return 1
fi
dnsmasq --listen-address=$GATEWAY --dhcp-range=$DHCPRANGE
}
function setup_bridge_nat() #启动所有功能
{
check_bridge $BRIDGE
if [ $? - eq 0 ]; then
create_bridge
fi
enable_ip_forward
add_filter_rules
start_dnsmasq
}
if [ -n $1 ]; then
setup_bridge_nat #真正的程序开始的地方,其实是引用上面的函数
ifconfig $1 0.0.0.0 up #$1被虚拟成网桥,所以本身不需要ip,但是要启用
brctl addif $BRIDGE $1 #把$1绑定到虚拟网桥
else
exit 1
fi
qemu-ifdown-nat脚本如下:
#!/bin/bash
#
BRIDGE=virbr0
if [ -n $1 ]; then
ip link set $1 down
brctl delif $BRIDGE $1
brctl delbr $BRIDGE
iptables -t nat -F
exit 0
else
exit 1
fi
3.qemu内部的用户模式网络
默认情况下,qemu-kvm启动客户机的时候使用slirp实现tcp/ip协议栈,并虚拟出一套nat网络,它使用简单易用,独立性好,但是不能跟宿主机和外部网络直接通信
命令:
例子:
本文转自biao007h51CTO博客,原文链接:http://blog.51cto.com/linzb/1877755 ,如需转载请自行联系原作者