linux 虚拟网络设备的使用
1. linux 常见虚拟网络设备分类
常见虚拟网络设备有:bridge, tun/tap, veth-pairs, macvlan, macvtap等。有一篇博文写的挺好的,图文并茂:虚拟网络设备,然而这篇文章是一篇译文而且内容不全,详见英文原版连接:Introduction to Linux interfaces for virtual networking
2. bridge设备
bridge设备就是桥接设备,可以看作是一个简单的交换机,创建方式很简单:
ip link add dev br0 type bridge # 添加一个网桥设备br0
ip link set tap0 master br0 # 将网卡tap0连接到br0
ip link set enth0 master br0
如果装过livirtd,它会产生一个名称为virbr0的bridge设备和一个名叫virbr0-nic的tap设备。
3. tap设备的使用
虽然有这么多博文,但是我还是看不懂tap设备是个什么东西。经过搜索以及实践,大概明白了tap设备的工作方式。
tap设备是一个工作在二层的设备,可以看作是一个与二层设备进行交互的接口,或者看作是一个特殊的网卡。但是,这个特殊网卡需要有程序来使用它,比如说虚拟机软件或者vpn软件。tap设备的一端连接者网络设备,一般是网桥(bridge),另一端连接着使用这个tap设备的应用程序,比如说虚拟机软件。tap设备不需要配置ip地址也可以工作。注意:虚拟机软件使用tap设备,而里面的虚拟机使用的是虚拟机软件虚拟出来的一个跟tap设备关联的一个虚拟网卡(有点绕口(汗!)
一个实践的例子
创建一个tap设备tap0,然后将tap0用到kvm虚拟机当中。
ip tuntap add dev tap0 mode tap # 创建tap0
ip link set tap0 master virbr0 # 将tap0连接到virbr0上,virbr0是libvirtd自带的网桥设备。
ip link set tap0 up # 开启tap0设备
创建虚拟机,编辑网卡设备的xml,填入如下内容:
<interface type="ethernet">
<mac address="52:54:00:25:57:81"/>
<target dev="tap0" managed="no"/>
<model type="virtio"/>
<address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
</interface>
注意此处managed="no"意思是不让libvirtd管理该设备。否则,tap0设备属性会被libvirtd修改,导致连接失败。
然后启动虚拟机看看网络是否畅通。
4. veth-pairs设备的使用
在之前的systemd-nspawn实践中已经接触过veth-pairs了,即--network-veth选项。这个选项会在主机中创建一对儿veth设备,这对设备两端是联通的,可以用于不同网络命名空间的通信,如containers之间的通信。启动centos container,在Host的/sys/class/net目录下会出现设备:
ve-centos7@if2
这就是在当前命名空间中的veth pairs设备的其中一个,另一个存在于container的命名空间中。在centos7容器中执行ip addr,可看到:
host0@if5
此时的问题在于,如何从Host上访问container中的veth设备,毕竟container只是一个命名空间而非虚拟机。然而由于systemd-nspawn使用的是匿名的命名空间(anonymous namespace),ip netns只能处理命名的命名空间(named network namespace)。经过查阅,在进程相应/proc/<PID>/ns目录下可以找到对应命名空间文件。参考How to access an unnamed network namespace,这个连接可能由于众所周知的原因无法访问,我把内容复制到这里:
Some programs might create network namespaces without registering them in /run/netns as iproute2 does. This makes it hard to access them with readily available tools like ip netns exec. However, there is a way to register those network namespace, after they have been created.
The following session creates and enters an unnamed namespace:
# unshare -n bash
# ip a l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# echo $$
6508
The pid is the only information which we need. Of course we could also gather that by using ps auxf or a variety of other methods.
Now, to register the namespace, we can run the following in another shell:
# touch /run/netns/new_namespace
# mount -o bind /proc/6508/ns/net /run/netns/new_namespace
After this is done, we can access it like any other network namespace created by iproute2:
# ip netns exec unnamed1 bash
# ip link set lo up
And now, if we run ip a l again in the shell we spawned with unshare:
# ip a l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
访问进程的namespace的方法有了,关于如何寻找container对应的命名空间,可以使用ps aux | grep systemd命令,找到<PID>较大的那个/lib/systemd/systemd进程,该进程的namespace就是centos7容器所在的namespace。通过上述方法挂载该container的命名空间,通过ip netns exec <name> bash进入到container的命名空间内。手动mount挂载很麻烦,经过查阅发现可以使用ip netns命令自动挂载,以centos7容器为例,将其命名空间挂载到/run/netns/centos7,可以在Host中使用下面方法:
ip netns attach centos7 <PID> # 此处的PID就是container的systemd在Host中的PID
ip netns exec centos7 bash # 切换到centos7容器的命名空间
然后ip addr就可以看到host0网卡了。至此,systemd-nspawn的veth网卡终于搞明白了。
veth设备能不能用于qemu虚拟机呢?并不能。参考use veth device with qemu。根据这个网页所说,qemu不能直接用veth设备,但是可以使用macvtap设备连接到veth设备。动手试试:
ip link add veth0 type veth peer name veth1 # 创建veth设备对
ip link set veth0 master virbr0 # 将veth0连接到virbr0网桥上
ip link add mac-veth1 link veth1 type macvtap mode vepa # 创建一个macvtap设备
ip link set <device> up # 把上面三个设备都打开,否则无法联网
虚拟机编辑xml文件如下:
<interface type="ethernet">
<mac address="6a:47:6c:b4:d0:41"/> <!-- 注意此处的mac地址跟mac-veth1的mac地址一样 -->
<target dev="mac-veth1" managed="no"/>
<model type="virtio"/>
<address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
</interface>
基本上跟tap设备没有差别,唯一要注意的地方是mac地址必须跟macvtap设备的mac地址一样。开机试试,成功联网!如果不想自己创建macvtap设备,也可以让虚拟机自己创建。如下:
<interface type='direct' trustGuestRxFilters='no'>
<mac address="6a:47:6c:b4:d0:41"/>
<source dev='veth1' mode='vepa'/>
<model type="virtio"/>
<address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
</interface>
5. macvlan和macvtap设备的使用
macvlan原理就是在一个物理网卡上创建多个有mac地址的虚拟网卡。macvtap设备是基于macvlan实现的,只不过macvtap创建了一个设备文件(/dev/tapX,X是一个数字),以便于跟应用程序交互。它们都包含四种模式:vepa, bridge, private,passthru四种。区别如下:
- vepa:全称Virtual Ethernet Port Aggregator mode,所有虚拟网卡帧都要发给外部交换机。外部交换机需要支持harpin模式才能使虚拟网卡之间相互通信。
- bridge:所有虚拟网卡之间是联通的,可以直接进行通信。
- private:禁止虚拟网卡之间的通信,即使外部交换机支持harpin模式也不行。
- passthru:只允许创建一个虚拟网卡,所有物理网卡的流量都会转发到这个虚拟网卡,常用于macvtap模式。
至于数据包流程图可以文章开头的参考连接。
macvlan和macvtap区别就在于,macvlan一般用于系统本身,如container等,macvtap一般用于应用程序,如虚拟机等。
创建语法:
ip link add link DEVICE name NAME type { macvlan | macvtap } mode { private | vepa | bridge | passthru [ nopromisc ] | source }
其中DEVICE是目标物理网卡,NAME是要创建的虚拟网卡名。创建完成后的网卡名称一般是“虚拟网卡名@物理网卡名”。
systemd-nspawn也可以指定使用macvlan。选项--network-macvlan=<interface_name>会创建一个macvlan虚拟网卡,<interface_name>是对应物理网卡的名称。
最后补充一点:使用macvlan或macvtap时,不论使用哪种模式,虚拟网卡都无法跟物理网卡直接通信。
linux 虚拟网络设备的使用的更多相关文章
- Linux 虚拟网络设备 veth-pair 详解,看这一篇就够了
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 前面这篇文章介 ...
- Linux 虚拟网络设备详解之 Bridge 网桥
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 前面几篇文章介 ...
- 一文总结 Linux 虚拟网络设备 eth, tap/tun, veth-pair
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Linux 虚 ...
- [转]Linux虚拟网络设备之tun/tap
转, 原文:https://segmentfault.com/a/1190000009249039 -------------------------------------------------- ...
- [转]UOS 中的虚拟网络设备
随着网络技术,虚拟化技术的发展,越来越多的高级网络设备被加入了到了 Linux 中,这些设备在 UOS 中起到了广泛而关键的作用,包括 Open vSwitch.TAP 设备.Veth 设备等等,梳理 ...
- 云计算底层技术-虚拟网络设备(Bridge,VLAN)( 转发)
云计算底层技术-虚拟网络设备(Bridge,VLAN) Posted on September 24, 2017 by opengers in openstack openstack底层技术-各种虚拟 ...
- [原创] 详解云计算网络底层技术——虚拟网络设备 tap/tun 原理解析
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 在云计算时代, ...
- Linux 抽象网络设备简介
Linux 抽象网络设备简介 和磁盘设备类似,Linux 用户想要使用网络功能,不能通过直接操作硬件完成,而需要直接或间接的操作一个 Linux 为我们抽象出来的设备,既通用的 Linux 网络设备来 ...
- 【转】Linux虚拟网络基础——tap
原文:https://blog.csdn.net/chengqiuming/article/details/80071073 ------------------------------------- ...
随机推荐
- vue实现事件代理(通过事件冒泡实现)
事件代理/事件委托以ul>li来模拟 使用冒泡的用法:使用冒泡的用法来实现事件代理 分离出来 动态根据索引添加类名:
- vue 熟悉项目结构 创建第一个自己的组件
* vue开发环境搭建 * 项目入口文件 ./src/main.js // The Vue build version to load with the `import` command // (ru ...
- sqlite3 import/export db sqlite 导入 导出 数据
export: $ sqlite3 xxx.db3 > .output xxx.sql >.dump > .q import: $ sqlite3 xxx.db3 > .rea ...
- 朴素贝叶斯原理、实例与Python实现
初步理解一下:对于一组输入,根据这个输入,输出有多种可能性,需要计算每一种输出的可能性,以可能性最大的那个输出作为这个输入对应的输出. 那么,如何来解决这个问题呢? 贝叶斯给出了另一个思路.根据历史记 ...
- python学习笔记(六)-集合
集合是一个无序不重复元素的集.基本功能包括关系测试和消除重复元素.集合对象还支持union(联合),intersection(交),difference(差)和sysmmetric differenc ...
- IdentityServer4[1]:开篇
1.开篇 首先明确一点,文章只是学习过程的笔记,参考目前网络上的博客,主要便于自己加深理解,同时也督促自己持续学习,没有其他目的.感谢网上资源的提供者. IdentityServer是为ASP.NET ...
- Java MD5和SHA256等常用加密算法
前言 我们在做java项目开发的时候,在前后端接口分离模式下,接口信息需要加密处理,做签名认证,还有在用户登录信息密码等也都需要数据加密.信息加密是现在几乎所有项目都需要用到的技术,身份认证.单点登陆 ...
- Markdown 编写技巧汇总(一)
编写文档,有很多格式选择,也有不同平台选择.下面就自己接触到的MarkDown编写文档的各种技巧做简单梳理,供自己参阅,也希望帮到网友. [1]添加空格 ① 这种写法比较老土,但是,很实用!注意都 ...
- WEB 标准以及 W3C 的理解与认识
01. WEB标准 ① web标准 简单来说可以分为结构.表现和行为. ② 结构:主要是有HTML标签组成(通俗点说,在页面body里面我们写入的标签都是为了页面的结构) 表现:即指css样 ...
- 题解「BZOJ4310」跳蚤
题目传送门 Description 现在有一个长度为 \(n\) 的字符串,将其划分为 \(k\) 段,使得这 \(k\) 段每一段的字典序最大子串中字典序最大的字符串字典序尽量小.求出这个字符串. ...