在使用虚拟机时,因为经常网络不通导致各种操作不方便,本文对qemu-kvm下的虚拟机网络配置进行了整理
一、环境说明
本文只介绍nat模式(nat模式好处是虚拟机可以与物理机不在同一个网段,不点用工作网络的IP地址),假设物理机使用网络:192.168.18.0/24, 虚拟机使用网络:192.168.6.0/24。
目标:物理机A是linux操作系统,安装虚拟机,物理机B是windows操作系统(个人工作机器),需要和虚拟机之间要实现互访,同时虚拟机可以访问internet网络。物理机A的IP地址:192.168.18.24, 物理机B的IP地址:192.168.18.110,虚拟机配置的IP地址为:192.168.6.16
二、配置虚拟机网卡
1、给虚拟机分配网卡
在物理A(虚拟机宿主机)执行以下命令,生成一个虚拟网卡:
#ip tuntap add tap-qemu mode tap
#ip addr add 192.168.6.1/24 dev tap-qemu
#ip link set tap-qemu up
执行完以上命令后,通过ifconfig命令可以看到系统中增加了一个名为 tap-qemu 的网卡,如下图所示:
tap-qemu: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.6.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::80f9:25ff:fe25:8344 prefixlen 64 scopeid 0x20<link>
ether 82:f9:25:25:83:44 txqueuelen 1000 (以太网)
RX packets 49685 bytes 5135568 (5.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 95881 bytes 118790764 (118.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2、开启数据包转发功能
临时开启:
#echo 1 > /proc/sys/net/ipv4/ip_forward
永久开启,开机自动加载配置:
#echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf
#sysctl -p
命令:sysctl -p 使用配置立即生效
3、启动虚拟机
在启动虚拟机时,需要增加以下参数,为虚拟机指定使用的虚拟网卡:
-nic tap,ifname=tap-qemu,script=no
4、配置虚拟机IP地址
虚拟机IP地配置网上相关文档很多,本文不再说明。下面是虚拟机网格配置信息:
IP:192.168.6.16
mask:255.255.255.0
网关:192.168.6.1
dns: 114.114.114.114
8.8.8.8
说明:IP地址必须与宿主机分配的IP地址是在一个网段(需要与物理机A分配给虚拟网卡tap-qemu的地址在同一个网段),网关必须为物理机A分配给虚拟网卡tap-qemu的地址。
通过以上步骤,可以实现宿主机与虚拟机之间的网络互通,即在宿主机(物理机A)可以ping通192.168.6.16地址,在虚拟机上可以ping通192.168.18.24。
三、让虚拟机器以访问互联网
通过第二步配置,虚拟机如果无法访关互联网,则需要在宿主机上增加路由转发功能,将虚拟机的请求转发到外网,可以先用iptables命令查看宿机(物理机A)的路由转发信息, 没有相关源地址为192.168.6.0/24网段的转发规则:
# iptables -t nat -nL --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destinationChain INPUT (policy ACCEPT)
num target prot opt source destinationChain OUTPUT (policy ACCEPT)
num target prot opt source destinationChain POSTROUTING (policy ACCEPT)
num target prot opt source destination
在宿主机(物理机A)用以下命令增加一条转发规则,将收到的192.168.6.0/24网段数据转发到192.168.18.24上,再通过18网段转出外网,命令如下:
iptables -t nat -A POSTROUTING -s 192.168.6.0/24 -j SNAT --to-source 192.168.18.24
执行完上述命令后, 再查看转发规则如下:
iptables -t nat -nL --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destinationChain INPUT (policy ACCEPT)
num target prot opt source destinationChain OUTPUT (policy ACCEPT)
num target prot opt source destinationChain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 SNAT all -- 192.168.6.0/24 0.0.0.0/0 to:192.168.18.24
这时在虚拟机上就可以正常上网了。
四、让物理机B与虚拟机可以互通
通过第三步,虚拟机可以PING通通物理B,但物理机B一般还无法访问虚拟机。
1、物理机B增加转发路由
在物理机B增加一条路由信息,将192.168.6.0/24的网络数据转发到192.168.18.24机器上。首先用route命令查看机器的路由信息如下:
>route print -4
IPv4 路由表
================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 192.168.18.1 192.168.18.110 25
127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331
127.0.0.1 255.255.255.255 在链路上 127.0.0.1 331
127.255.255.255 255.255.255.255 在链路上 127.0.0.1 331
192.168.6.0 255.255.255.0 192.168.18.24 192.168.18.110 26
192.168.18.0 255.255.255.0 在链路上 192.168.18.110 281
192.168.18.110 255.255.255.255 在链路上 192.168.18.110 281
192.168.18.255 255.255.255.255 在链路上 192.168.18.110 281
255.255.255.255 255.255.255.255 在链路上 127.0.0.1 331
255.255.255.255 255.255.255.255 在链路上 192.168.18.110 281
执行以下命令,增加一条转发路由:
route ADD 192.168.6.0 MASK 255.255.255.0 192.168.18.24
再次查看路由,成功增加了一条路由如下:
>route print -4
IPv4 路由表
================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 192.168.18.1 192.168.18.110 25
127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331
127.0.0.1 255.255.255.255 在链路上 127.0.0.1 331
127.255.255.255 255.255.255.255 在链路上 127.0.0.1 331
192.168.6.0 255.255.255.0 192.168.18.24 192.168.18.110 26
192.168.6.0 255.255.255.0 192.168.18.24 192.168.18.110 26192.168.18.0 255.255.255.0 在链路上 192.168.18.110 281
192.168.18.110 255.255.255.255 在链路上 192.168.18.110 281
192.168.18.255 255.255.255.255 在链路上 192.168.18.110 281
255.255.255.255 255.255.255.255 在链路上 127.0.0.1 331
255.255.255.255 255.255.255.255 在链路上 192.168.18.110 281
2、物理机A增加nat路由
在物理机A上执行以下命令,增加一条转发路由
iptables -t nat -A POSTROUTING -s 192.168.18.110 -d 192.168.6.0/24 -j SNAT --to-source 192.168.18.1
或
iptables -t nat -A POSTROUTING -s 192.168.18.0/24 -d 192.168.6.0/24 -j SNAT --to 192.168.6.1
第一条命令只有192.168.18.110主机可以访问虚拟机,第二条命令使192.168.18.0/24网段的机器都可以访问虚拟机。下面是执行一条命令后的结果:
# iptables -t nat -nL --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destinationChain INPUT (policy ACCEPT)
num target prot opt source destinationChain OUTPUT (policy ACCEPT)
num target prot opt source destinationChain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 SNAT all -- 192.168.18.110 0.0.0.0/0 to:192.168.6.1
2 SNAT all -- 192.168.18.110 192.168.6.0/24 to:192.168.18.1
这时在物理机B上就可以ping通虚拟机地址了。
五、注意事项
1、如果机器无法ping通有可能是防火墙设置原因,所以需要注意查看防火墙状态。
2、在window上可以通过 tracert 命令,linux可以通过traceroute命令,诊断哪一段路由出了问题,有利于查找问题。下图是在物理机B上执行tracert命令结果:
>tracert 192.168.6.16
通过最多 30 个跃点跟踪
到 DESKTOP-I12IKM3 [192.168.6.16] 的路由:1 <1 毫秒 <1 毫秒 <1 毫秒 192.168.18.24
2 1 ms <1 毫秒 <1 毫秒 DESKTOP-I12IKM3 [192.168.6.16]跟踪完成。