QEMU 虚拟机网卡探究
前述
我们知道无论是VMware,Virtual Box还是HyperV 都支持 NAT/Bridge/Host-Only 三种上网方式。其中 NAT 是我最常用,最熟悉的。
需要说明的是,无论是NAT 还是 Bridge, 虚拟机与宿主机、虚拟机与虚拟机、虚拟机与外网、宿主机与外网之间都是通的!!!(不要相信CSDN某些人的博客,实践出真知!)
下面就用qemu 模拟实现下 NAT与Bridge。无论哪种本质上都是在宿主机侧的设置,因为虚拟机的IP网关设置不属于必须操作!
注:建议看完NAT自己实现下host-only模式. host-only 虚拟机是不通外网的(提示,按照NAT的步骤,但不设置防火墙试试)
NAT
NAT实现需要借助于防火墙,这里用iptables来做转发与网络地址转换!
涉及到虚拟机网卡 vnet0(虚拟机起来后,host端生成的网卡,不是虚拟机内的网卡),网桥 br,宿主机网卡 enp1s0
iptable与更详细的设置参考
宿主机设置:
brctl addbr br # 创建网桥
brctl addif br vnet0 # 添加成员
ifconfig br up
报文转发流程图
# 出栈
虚拟机网卡(eth0)-> 虚拟机网卡(vnet0)->网桥(br)---- iptable forward -----宿主机网卡(enp1s0)->发出
# 入栈
虚拟机网卡(eth0)<- 虚拟机网卡(vnet0)<-网桥(br)---- iptable forward -----宿主机网卡(enp1s0)<-收到
如上,需要配置iptable的转发,让报文能够从 br 转到 enp1s0 上,这步很重要(host-only 可以跳过)。(需要 /proc/sys/net/ipv4/ip_forward 为 1)
# 1. 简单粗暴的操作
iptables -F # 清空防火墙规则
iptables -P FORWARD ACCEPT # 接受所有转发
# 2. 也可以这样,定义精细的规则
iptables -A FORWARD -i br -o enp1s0 -j ACCEPT
iptables -A FORWARD -o br -i enp1s0 -j ACCEPT
另外要知道 NAT 发出的报文原地址是enp1s0 的地址,这就要求iptable也要做地址转换(host-only 可以跳过)
iptable -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE
至此,NAT 设置完毕,设置地址ping测试就行了
# 宿主机
ifconfig br 192.168.122.1/24
# 虚拟机内
ifconfig eth0 192.168.122.10/24
ip route add default via 192.168.122.1 dev eth0
这时候在虚拟机 eth0 上测试 ping 8.8.8.8 是ok的
虚拟机:

宿主机:

Bridge
网桥比较简单,这里是自己摸索的,因为没查到资料,不保证和VMWare 之类虚拟机方案一样。
宿主机报文转发流程图
# 出栈
网桥(br)-> 宿主机网卡(enp1s0)->发出
# 入栈
网桥(br)<- 宿主机网卡(enp1s0)<-收到
虚拟机报文转发流程图
思考为什么这时候不需要iptable做 forward 规则(因为vnet0,enp1s0 都是网桥子网卡,这时候相当于二层交换机的两个端口,因此是互通的,不需要三层的iptable支持转发)
# 出栈
虚拟机网卡(eth0)-> 虚拟机网卡(vnet0)->网桥(br)-> 宿主机网卡(enp1s0)->发出
# 入栈
虚拟机网卡(eth0)<- 虚拟机网卡(vnet0)<-网桥(br)<- 宿主机网卡(enp1s0)<-收到
宿主机设置:
brctl addbr br
brctl addif br enp1s0 # 添加网卡
brctl addif br vnet0 # 添加网卡
ifconfig br up
# 注意此时宿主机网卡不能配置地址,或者说配置地址也没用,需要把地址配置到网桥br上
ifconfig br 192.168.100.125/24
ip route add default via 192.168.100.1 dev br
宿主机:

虚拟机:

然后在虚拟机做dhcp,或者手动配置(手动配置需要确保地址与宿主机网卡地址在同一网段,比如地址设为 192.168.100.10/24)
现在在虚拟机ping 网关,主机或者8.8.8.8 都是通的
QEMU 虚拟机网卡探究的更多相关文章
- 基于QMP实现对qemu虚拟机进行交互
本文详解QMP,包含qmp.hmp.qemu-guest-agent的介绍.工作原理.配置方法.范例 小慢哥的原创文章,欢迎转载 目录 ▪ QMP介绍 ▪ QMP语法 ▪ 单独使用qemu,启用QMP ...
- 没有国产主机,怎么开发:交叉编译和QEMU虚拟机
1. 背景 近期国产化的趋势越来越浓,包括国产操作系统.国产CPU等.时隔十多年,QQ for Linux也更新了.做为软件开发人员,"有幸"也需要适配国产化.至于国产化的意义等就 ...
- 利用QMP和QEMU虚拟机交互的几种方式
QMP是一种基于JSON格式的传输协议,我们能利用它与一个QEMU虚拟机实例进行交互,例如查询,更改虚拟机的状态,获取设备信息等等.下面是几种创建QMP的方法以及对其它的一些基本命令的使用: 1.基于 ...
- Hyper-V下的Linux虚拟机网卡丢失问题原因及解决办法
Hyper-V下的Linux虚拟机网卡丢失问题原因及解决办法 虚拟化大势所趋 公司推行了虚拟化,全部用的是Microsoft Windows 2008 R2 Enterprise with Hyp ...
- 当Azure里的虚拟机网卡被禁用
当Azure里的虚拟机网卡被禁用了之后…… 这样的想法来自于一个假设,如果网卡被禁用之后,用户该如何处理,Azure又该如何处理,对于设置在虚拟机中的禁用网卡选项是否还有存在的意义?通常情况下,点选了 ...
- vmware克隆Centos6.7虚拟机网卡无法启动问题
快速处理办法: cat /etc/sysconfig/network-scripts/ifcfg-eth0 sed -i '/UUID/d' /etc/sysconfig/network-script ...
- vmware克隆Centos6.4虚拟机网卡无法启动问题
vmware克隆Centos6.4虚拟机网卡无法启动问题 2014-02-26 16:44:54 标签:老男孩培训 vmware克隆问题 网卡无法启动 ...
- VM虚拟机网卡LAN区段模拟内网使用教程
目录 1. 测试环境 2. 设置LAN区段并测试 2.1. 添加LAN区段 2.2. 在虚拟机中设置静态IP地址 2.3. 测试同一LAN区段的主机是否可以联通 2.4 ...
- Qemu虚拟机 玩树莓派最新版系统 (截止2017-04-10)
Qemu虚拟机可以玩 树莓派,大家都知道了吧.可是网上的教程好老,都是2012年的.我按照教程下载了最新版版本的树莓派系统怎么也跑不起来. 研究了好久,终于找到一个简单的方法,特意分享出来.转载请注意 ...
随机推荐
- 手把手教你在win10下搭建pytorch GPU环境(Anaconda+Pycharm)
Anaconda指的是一个开源的Python发行版本,其主要优点如下: Anaconda默认安装了常见的科学计算包,用它搭建起Python环境后不用再费时费力安装这些包: Anaconda可以创建互相 ...
- 【EFCore】利用Entityframework Core创建数据库模型
利用Entityframework Core创建数据库模型 本文中Entityframework Core版本为v3.1.6 简介 Entity Framework (EF) Core 是微软轻量化. ...
- Mybatis_day2
二 mybatis配置详解 MyBatis最关键的组成部分是SqlSessionFactory,我们可以从中获取SqlSession, 并执行映射的SQL语句.SqlSessionFactory对象可 ...
- 结构体深度比较 reflect.DeepEqual
demo1 package main import ( "fmt" "reflect" ) func main() { sliceMap1 := make([] ...
- Eligibility Traces and Plasticity on Behavioral Time Scales: Experimental Support of neoHebbian Three-Factor Learning Rules
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 大多数基本行为,如移动手臂抓住物体或走进隔壁房间探索博物馆,都是在几秒钟的时间尺度上进化的:相反,神经元动作电位则是在几 ...
- Jmeter+Ant+jenkins实现api自动化测试的持续集成
0基础上手教程 @jmeter的使用 jmeter是一个基于java语言编写的开源测试工具,广泛应用于接口测试,性能测试,自动化测试. 接口自动化的编写教程,将于后续分享. 问题一:为什么用ant,而 ...
- Java面试题(Hibernate篇)
Hibernate 113.为什么要使用 hibernate? 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. Hibernate是一个基于JDBC的主流持久化框架,是一个 ...
- python+opencv 打开网络摄像头
python+opencv 打开网络摄像头(手机)(转) #以下是最常用的读取视频流的方法import cv2url = 'rtsp://admin:admin@192.169.5.2:554/'#根 ...
- python数值运算 四则运算
数值运算 描述 获得用户输入的一个字符串,格式如下: ...
- PCIe例程理解(一)用户逻辑模块(接收)仿真分析
前言 本文从例子程序细节上(语法层面)去理解PCIe对于事物层数据的接收及解析. 参考数据手册:PG054: 例子程序有Vivado生成: 为什么将这个内容写出来? 通过写博客,可以检验自己理解了这个 ...