前述

我们知道无论是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 虚拟机网卡探究的更多相关文章

  1. 基于QMP实现对qemu虚拟机进行交互

    本文详解QMP,包含qmp.hmp.qemu-guest-agent的介绍.工作原理.配置方法.范例 小慢哥的原创文章,欢迎转载 目录 ▪ QMP介绍 ▪ QMP语法 ▪ 单独使用qemu,启用QMP ...

  2. 没有国产主机,怎么开发:交叉编译和QEMU虚拟机

    1. 背景 近期国产化的趋势越来越浓,包括国产操作系统.国产CPU等.时隔十多年,QQ for Linux也更新了.做为软件开发人员,"有幸"也需要适配国产化.至于国产化的意义等就 ...

  3. 利用QMP和QEMU虚拟机交互的几种方式

    QMP是一种基于JSON格式的传输协议,我们能利用它与一个QEMU虚拟机实例进行交互,例如查询,更改虚拟机的状态,获取设备信息等等.下面是几种创建QMP的方法以及对其它的一些基本命令的使用: 1.基于 ...

  4. Hyper-V下的Linux虚拟机网卡丢失问题原因及解决办法

    Hyper-V下的Linux虚拟机网卡丢失问题原因及解决办法   虚拟化大势所趋 公司推行了虚拟化,全部用的是Microsoft Windows 2008 R2 Enterprise with Hyp ...

  5. 当Azure里的虚拟机网卡被禁用

    当Azure里的虚拟机网卡被禁用了之后…… 这样的想法来自于一个假设,如果网卡被禁用之后,用户该如何处理,Azure又该如何处理,对于设置在虚拟机中的禁用网卡选项是否还有存在的意义?通常情况下,点选了 ...

  6. vmware克隆Centos6.7虚拟机网卡无法启动问题

    快速处理办法: cat /etc/sysconfig/network-scripts/ifcfg-eth0 sed -i '/UUID/d' /etc/sysconfig/network-script ...

  7. vmware克隆Centos6.4虚拟机网卡无法启动问题

    vmware克隆Centos6.4虚拟机网卡无法启动问题                 2014-02-26 16:44:54 标签:老男孩培训 vmware克隆问题 网卡无法启动          ...

  8. VM虚拟机网卡LAN区段模拟内网使用教程

    目录   1. 测试环境   2. 设置LAN区段并测试    2.1. 添加LAN区段    2.2. 在虚拟机中设置静态IP地址    2.3. 测试同一LAN区段的主机是否可以联通    2.4 ...

  9. Qemu虚拟机 玩树莓派最新版系统 (截止2017-04-10)

    Qemu虚拟机可以玩 树莓派,大家都知道了吧.可是网上的教程好老,都是2012年的.我按照教程下载了最新版版本的树莓派系统怎么也跑不起来. 研究了好久,终于找到一个简单的方法,特意分享出来.转载请注意 ...

随机推荐

  1. 手把手教你在win10下搭建pytorch GPU环境(Anaconda+Pycharm)

    Anaconda指的是一个开源的Python发行版本,其主要优点如下: Anaconda默认安装了常见的科学计算包,用它搭建起Python环境后不用再费时费力安装这些包: Anaconda可以创建互相 ...

  2. 【EFCore】利用Entityframework Core创建数据库模型

    利用Entityframework Core创建数据库模型 本文中Entityframework Core版本为v3.1.6 简介 Entity Framework (EF) Core 是微软轻量化. ...

  3. Mybatis_day2

    二 mybatis配置详解 MyBatis最关键的组成部分是SqlSessionFactory,我们可以从中获取SqlSession, 并执行映射的SQL语句.SqlSessionFactory对象可 ...

  4. 结构体深度比较 reflect.DeepEqual

    demo1 package main import ( "fmt" "reflect" ) func main() { sliceMap1 := make([] ...

  5. Eligibility Traces and Plasticity on Behavioral Time Scales: Experimental Support of neoHebbian Three-Factor Learning Rules

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 大多数基本行为,如移动手臂抓住物体或走进隔壁房间探索博物馆,都是在几秒钟的时间尺度上进化的:相反,神经元动作电位则是在几 ...

  6. Jmeter+Ant+jenkins实现api自动化测试的持续集成

    0基础上手教程 @jmeter的使用 jmeter是一个基于java语言编写的开源测试工具,广泛应用于接口测试,性能测试,自动化测试. 接口自动化的编写教程,将于后续分享. 问题一:为什么用ant,而 ...

  7. Java面试题(Hibernate篇)

    Hibernate 113.为什么要使用 hibernate? 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. Hibernate是一个基于JDBC的主流持久化框架,是一个 ...

  8. python+opencv 打开网络摄像头

    python+opencv 打开网络摄像头(手机)(转) #以下是最常用的读取视频流的方法import cv2url = 'rtsp://admin:admin@192.169.5.2:554/'#根 ...

  9. python数值运算 四则运算

    数值运算 描述 获得用户输入的一个字符串,格式如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬ ...

  10. PCIe例程理解(一)用户逻辑模块(接收)仿真分析

    前言 本文从例子程序细节上(语法层面)去理解PCIe对于事物层数据的接收及解析. 参考数据手册:PG054: 例子程序有Vivado生成: 为什么将这个内容写出来? 通过写博客,可以检验自己理解了这个 ...