网络虚拟化之linux虚拟网络基础
1 linux虚拟网络基础
1.1 Device
在linux里面devic(设备)与传统网络概念里的物理设备(如交换机、路由器)不同,Linux所说的设备,其背后指的是一个类似于数据结构、内核模块或设备驱动这样的含义。就是说device可能只是软件系统里的一个驱动,一个函数接口。
1.2 Tap
Tap位于二层数据链路层,tun位于三层网络层,两者在linux里的函数结构几乎一致,除了一个flag值区分tap/tun。在linux中二层特指以太网(Ethernet)(传统网络里二层分Ethernet,P2P,HDLC,FR,ATM),因此有时tap也叫“虚拟以太设备”。有意思的是linux创建tap需要用到tun模块。Linux创建tap/tun都使用tun模块。
1.3 Namespace
Namespace类似传统网络里的VRF,与VRF不同的是:VRF做的是网络层三层隔离。而namespace隔离的更彻底,它做的是整个协议栈的隔离,隔离的资源包括:UTS(UnixTimesharing System的简称,包含内存名称、版本、 底层体系结构等信息)、IPS(所有与进程间通信(IPC)有关的信息)、mnt(当前装载的文件系统)、PID(有关进程ID的信息)、user(资源配额的信息)、net(网络信息)。
从网络角度看一个namespace提供了一份独立的网络协议栈(网络设备接口、IPv4/v6、IP路由、防火墙规则、sockets等),而一个设备(Linux Device)只能位于一个namespace中,不同namespace中的设备可以利用vethpair进行桥接。

1.4 veth pair
veth pair不是一个设备,而是一对设备,以连接两个虚拟以太端口。操作vethpair,需要跟namespace一起配合,不然就没有意义。如图

1.5 Bridge
在Linux的语境里,Bridge(网桥)与Switch(交换机)是一个概念。因为一对veth pair只能连接两台device,因此如果需要多台设备互联则需要bridge。
如图:4个namespace,每个namespace都有一个tap,每个tap与网桥vb1的tap组成一对veth pair,这样,这4个namespace就可以二层互通了。

1.6 Router
Linux创建Router并没有像创建虚拟Bridge那样,有一个直接的命令brctl,而且它间接的命令也没有,不能创建虚拟路由器……因为它就是路由器(Router) !
如图:我们需要在router(也就是我们的操作系统linux上增加去往各NS的路由)。

1.7 tun
tun是一个网络层(IP)的点对点设备,它启用了IP层隧道功能。Linux原生支持的三层隧道。支持隧道情况:ipip(ipv4 in ipv4)、gre(ipv4/ipv6 over ipv4)、sit(ipv6 over ipv4)、isatap(ipv6/ipv4隧道)、vti(ipsec接口)。
学过传统网络GRE隧道的人更容易理解,如图:
NS1的tun1的ip 10.10.10.1与NS2的tun2的ip 10.10.20.2建立tun
NS1的tun的ip是10.10.10.1,隧道的外层源ip是192.168.1.1,目的ip是192.168.2.1,是不是跟GRE很像。

1.8 iptable
我们通常把iptable说成是linux的防火墙,实际上这种说法并不准确。实际上iptable只是一个运行在用户空间的命令行工具,真正实现防火墙功能的是内核空间的netfilter模块。
这里我们先知道防火墙执行模块netfilter位于内核空间,命令行iptable位于用户空间。我们在通过iptable配置的防火墙策略(包括NAT)会在netfilter执行。
iptables有5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
l PREROUTING:报文进入网络接口尚未进入路由之前的时刻;
l INPUT:路由判断是本机接收的报文,准备从内核空间进入到用户空间的时刻;
l FORWARD:路由判断不是本机接收的报文,需要路由转发,路由转发的那个时刻;
l OUTPUT:本机报文需要发出去 经过路由判断选择好端口以后,准备发送的那一刻;
l POSTROUTING:FORWARD/OUTPUT已经完成,报文即将出网络接口的那一刻。
DNAT用的是PREROUTING,修改的是目的地址,SNAT用的是POSTROUTING,修改的是源地址。
Iptable有5个表:filter,nat,mangle,raw, security,raw表和security表不常用。主流文档都是说5链4表,没有包括security表。
l Raw表——决定数据包是否被状态跟踪机制处理
l Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
l Nat表——用于网络地址转换(IP、端口)
l filter表——过滤数据包
l security 表(用于强制访问控制网络规则,例如:SELinux)
4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter。RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。
下面讲下数据包流向与处理:
- 如果是外部访问的目的是本机,比如用户空间部署了WEB服务,外部来访问。数据包从外部进入网卡----->PREROUTING处理----->INPUT处理----->到达用户空间程序接口,程序处理完成后发出----->OUTPUT处理----->POSTROUTING处理。每个处理点都有对应的表,表的处理顺序按照raw-->mangle-->nat-->filter处理。
- 如果用户访问的目的不是本机,linux只是一个中转(转发)设备,此时需要开启ip forward功能,数据流就是进入网卡-----> PREROUTING处理-----> FORWARD处理-----> POSTROUTING处理。

1.8.2 NAT
Netfilter中的NAT有三个点做处理,
(1) NAT-PREROUTING (DNAT)
数据报文进入PREROUTING,NAT模块就会处理,比如用户空间的WEB服务私网地址192.168.0.1,对外提供公网ip是220.1.1.1。
当外部ip访问220.1.1.1时,PREROUTING接受数据包,NAT模块处理将目的ip 220.1.1.1转换为私网ip192.168.0.1,这就是DNAT。
(2) NAT-POSTROUTING (SNAT)
用户空间应用程序访问外部网络,比如用户空间应用程序访问114.114.114.144,私网ip 192.168.0.1,此时数据包流经POSTROUTING,NAT模块会处理,将192.168.0.1转换为220.2.2.2,对于目的ip114.114.114.114来说,就是220.2.2.2访问它,这就是SNAT。
(3) NAT-OUTPUT (DNAT)
我们把内核空间想象成一台防火墙,防火墙自身对外发送报文访问外部时,就在OUTPUT做DNAT,此时不需要再POSTROUTING点再做NAT。因为此时从OUTPUT出来的源IP已经是公网地址了
1.8.3 Firewall
防火墙根据规则执行accept/reject动作,防火墙规则的元素如下:
入接口、出接口、协议、源地址/子网、目的地址/子网、源端口、目的端口。
Netfilter中的Firewall会在这三个点进行处理:INPUT/FORWARD/OUTPUT
1.8.4 Mangle
mangle表主要用于修改数据包的ToS( Type of Service,服务类型)、 TTL(Time to Live,生存周期)以及为数据包设置Mark标记,以实现QoS(Qualityof Service,服务质量)调整以及策略路由等应用。Netfilter每个点都可以做mangle。
1.9 总结
tap、tun、vethpair在Linux中都被称为设备,但是在与日常概念的类比中,常常被称作接口。而bridge和router这些日常称为设备的再linux中反而不称为设备。linux利用namespace做隔离,Bridge提供二层转发功能,Router提供三层转发功能。Router还常常借助iptable提供SNAT/DNAT功能。Bridge也常常借助iptable提供Firewall功能。
网络虚拟化之linux虚拟网络基础的更多相关文章
- Linux虚拟网络:Docker网络知识之基础篇
我们在工作中应用了docker容器化技术,服务的部署.维护和扩展都方便了很多.然而,近期在私有化部署过程中,由于不同服务器环境的复杂多变,常常遇到网络方面的问题,现象为容器服务运行正常,但宿主机.容器 ...
- 网络虚拟化之FlowVisor:网络虚拟层(下)
在前面两篇文章:网络虚拟化之FlowVisor:网络虚拟层(上)和网络虚拟化之FlowVisor:网络虚拟层(中)中分别介绍了FLowVisor的特性和实现,三连载的最后一篇介绍虚拟网络的隔离机制. ...
- 网络虚拟化之FlowVisor:网络虚拟层(中)
上一篇博客网络虚拟化之FlowVisor:网络虚拟层(上)主要对比了计算机虚拟化和网络虚拟化,引出了FLowVisor网络虚拟层,介绍了其一些特性,这篇博文深入讲解FLowVisor的技术. 一. 概 ...
- 网络虚拟化之FlowVisor:网络虚拟层(上)
概念解释:切片:虚拟网络的一个实例 一. 网络虚拟化(虚拟网络) 人类社会的发展在很大方面得益于自然界,飞机受益于鸟,雷达受益于蝙蝠等等,所以专门有个学科为仿生学就是研究和模仿生物的特殊本质,利用生物 ...
- Linux虚拟网络技术学习
一个执着于技术的公众号 地方 背景 在Linux虚拟化技术中,网络层面,通常重要的三个技术分别是Network Namespace.veth pair.以及网桥或虚拟交换机技术.今天就通过实验带大家一 ...
- 【转】Linux虚拟网络基础——tap
原文:https://blog.csdn.net/chengqiuming/article/details/80071073 ------------------------------------- ...
- Linux实战教学笔记55:开源虚拟化KVM(三)管理虚拟网络
六,管理虚拟网络 [x] Linux网桥基本概念 [x] qemu-kvm支持的网络 [x] 向虚拟机添加虚拟网络连接 [x] 基于NAT的虚拟网络 [x] 基于网桥的虚拟网络 [x] 用户自定义的隔 ...
- Docker核心实现技术(命名空间&控制组&联合文件系统&Linux网络虚拟化支持)
作为一种容器虚拟化技术,Docker深度应用了操作系统的多项底层支持技术. 早期版本的Docker是基于已经成熟的Linux Container(LXC)技术实现的.自Docker 0.9版本起,Do ...
- 【 Linux 网络虚拟化 】Netns
netns 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables等.总之,与网络有关的组件都是独立的. 创建网络空间: # ip netns ...
随机推荐
- 一、Redis 总结
官网 Redis 介绍 Redis 是一个开源的.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API. Redis 是一个 key-value 存储系统.为了 ...
- Java实现 LeetCode 547 朋友圈(并查集?)
547. 朋友圈 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指 ...
- Java实现 LeetCode 529 扫雷游戏(DFS)
529. 扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线) ...
- Java实现 LeetCode 67 二进制求和
67. 二进制求和 给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1 ...
- java实现排列为平方数
** 排列为平方数** 若干不同的数字,排列组合后能产生多少个平方数? 下面的代码解决了这个问题. 对于:1,6,9 排列后,可产生3个平方数: 169 196 961 请阅读下面的代码,填写缺失的部 ...
- github常用的协同开发流程
github的实用之处 对于刚刚工作的小白来说,顺利完成工作任务是首要考虑的事情,业余时间多了解了解其他的技术将有利于自己对该领域的熟悉,比如我们都拥有的github,除了在网站里查看优秀的代码,其还 ...
- 因为 MongoDB 没入门,我丢了一份实习工作
有时候不得不感慨一下,系统升级真的是好处多多,不仅让我有机会重构了之前的烂代码,也满足了我积极好学的虚荣心.你看,Redis 入门了.Elasticsearch 入门了,这次又要入门 MongoDB, ...
- AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
pyqt5信号要定义为类属性 #!/usr/bin/python3 # -*- coding: utf-8 -*- from PyQt5.Qt import * import sys class Wi ...
- apt用法详解
目录 1. 常规操作 2. apt-cache 3. 配置apt-get的缓存路径 4. 常用工具集 4.1. 开发工具 4.2. 系统辅助 1. 常规操作 更新仓库 sudo apt-get upd ...
- FastStone+ImageReady+Kutools plus导入图片到Excel单元格
先前打算自己做一个也附带训练下,发现有下面方法也好. 1)做帮助文档时需要一种格式(需要将图片导入到Excel中时,假如是按此法归类汇总) 2)FastStone滚动截图 粘贴到Photo ...