Linux双网卡的透明网桥概述 (linux双网卡透明网桥)

在现代的计算机网络中,网桥是一种重要的网络设备,它能够将多个网络分段连接起来,从而实现网络互联互通。在Linux操作系统中,也有许多关于网桥的实现方案,例如透明网桥就是其中较为重要的一种。

透明网桥是指连接多个网络的一种网桥,它能够在各个网络之间自动转发数据,而且不会干扰其他网络设备的通信。在Linux系统中,使用双网卡就能够实现透明网桥。下面就来具体介绍一下这种实现方案。

我们需要准备两块网卡。然后,就可以开始设置透明网桥了。在Linux系统中,我们可以使用Bridge-utils这个工具来配置透明网桥。它包含了bridge-utils和bridge-utils-dbg两个程序。其中,bridge-utils是用于配置透明网桥的工具包,而bridge-utils-dbg则包含了一些调试工具。

使用Bridge-utils配置透明网桥的过程如下:

1. 安ridge-utils包

在终端中输入以下命令即可安ridge-utils包:

# sudo apt-get install bridge-utils

2. 配置网卡

使用编辑器打开/etv/network/interfaces文件,在文件的结尾处添加以下内容:

# The primary network interface

auto eth0

iface eth0 inet dhcp

auto eth1

iface eth1 inet dhcp

3. 配置透明网桥

使用编辑器打开/etv/network/interfaces文件,在文件的结尾处添加以下内容:

# Bridge setup

auto br0

iface br0 inet dhcp

bridge_ports eth0 eth1

4. 保存并重启网络服务

在命令行中输入以下命令以保存并重启网络服务:

# service networking restart

以上就是使用Bridge-utils配置透明网桥的全部过程。当然,在实际操作中,可能会遇到一些问题,例如网卡IP地址冲突、网卡速度不一致等等。为了避免这些问题,我们可以使用一些工具来辅助实现透明网桥。下面就来介绍一下这些工具。

1. brctl

brctl是Bridge-utils工具包中最常用的工具之一,它可以用于配置和管理透明网桥。下面就来介绍一下brctl的常用命令。

创建网桥:

# brctl addbr br0

添加网卡:

# brctl addif br0 eth0

删除网卡:

# brctl delif br0 eth0

删除网桥:

# brctl delbr br0

2. ifconfig

ifconfig是Linux系统中一个常用的命令行工具,用于配置和管理网络接口。下面就来介绍一下ifconfig的常用命令。

启用网络接口:

# ifconfig eth0 up

禁用网络接口:

# ifconfig eth0 down

设置网卡IP地址:

# ifconfig eth0 192.168.0.1 netmask 255.255.255.0

3. iptables

iptables是Linux系统中一个强大的防火墙工具,它可以对网络流量进行过滤、修改、重定向等操作。当使用透明网桥时,我们可以使用iptables来实现流量转发。下面就来介绍一下iptables的常用命令。

开启转发:

# echo 1 > /proc/sys/net/ipv4/ip_forward

设置NAT:

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

以上就是使用一些工具来实现透明网桥的全部过程。在实际操作中,应该根据具体的应用场景选择合适的解决方案,以达到更好的性能和稳定性。

相关问题拓展阅读:

什么是网桥

工作在

数据链路层

的一种网络互连设备,它在互连的LAN之间实现帧的存储和转发。可以连接不同类型的局域网。根据MAC帧的目的地址对收到的帧进行转发。网桥具有过滤帧的功能。当网桥收到一个帧时,并不是向所有的

端口转发

此帧,而是先检查此帧的目的

MAC地址

,然后再确定将该帧转发到哪一个端口

网段

A和网段B如果是同构网是可以直接用电缆相连,但是如果是不同种类的网络,比如

以太网

和令牌环网不能直接用介质相连,这时候需要中转设备(网桥)进行相连

网桥只有若干个端口,因此一般直接相连的是网段,而不是主机

网桥的优点:

• 过滤通信量

• 扩大了物理范围(为了解决由于媒体访问控制导致的距离不能过长的问题。假如网段连接两段,这两段就相当于两个媒体访问控制。每一段有一个媒体访问控制的更大距离,两个距离加起来远远大于一个媒体访问控制的更大距离。而

中继器

解决的是由于距离过长而导致的信号衰减的问题,中继器所连接的各个网段最终还是单一的一个CA/CD

碰撞域

(冲突域),中继器只能在一个碰撞域内部延伸距离,每一个碰撞域是有一个更大距离限制的,中继器不可能延伸碰撞域本身所固定的更大距离。如果用网桥,有两个端口,可以连接两个碰撞域,这样范围就增大了)

• 提高了可靠性(各个碰撞域可以独立工作,一个碰撞域出问题不会影响其他碰撞域)

• 可互连不同

物理层

、不同MAC子层和不同速率(如10Mb/s和100Mb/s以太网)的局域网(一个以太网里能连接的用户数量是有限的,当超过这个限度的时候要接两个网,这两个网也要互相连接起来,这时的两个网是没有差异的,只是因为用户数量过多而分出两个网,这时就是同构网络连接。而由于技术不同,两个网对于传输可靠性的要求不一样,速率不一样等时,这就是异构网络连接)

网桥的缺点:

• 存储转发增加了时延

• 在MAC子层并没有

流量控制

功能(使用中继器互连的各个节点之间的收发速率没有不一样的,也就不存在流量控制问题。但是网桥是可以连接异构网络,这样两个网络的速率可能是不一样的,就出现了流量失配的问题。当高速网络向低速网络发送数宏正型据的时候就会出现问题)

• 具有不同MAC子层的网段连接在一起时时延更大(异构网络之间传输存在一个MAC协议的转换)

网桥只适合于用户数不太多(不超过几百个)和通信量不太大的局域蔽猜网,否则有时还会因传播过多的广播信息而产生网络拥塞。这就是所说的

广播风暴

。当用户数量庞大,通信量很大的情况之下就用路由器来进行主网规划。局域网不用路由器,因为局域网中只存在物理层和数据链路层,没有

网络层

,而路由器是应用在网络层的,因此局域网不用路由器。概念已而现在的局域网的经在扩大,不再只是用中继器和网桥连接网络,也会用路由器

网桥与集线器的区别

• 集线器在转发帧时,不对传播媒体进行检测

• 网桥在转发前必须执行CA/CD算法。若在发送过程中出现碰撞,就必须停止发送和进行退避(数据会在缓存里面储存,发送一次不成功就会一直发送,知道到16次清毁还没发送成功才会停止);在这一点上网桥的接口就像一个网卡(网卡有MAC地址,但是网桥没有),但网桥却没有网卡。由于网桥没有网卡,因此网桥并不改变它转发的帧的源地址(只是进行信息传输,并不会改变

数据帧

的内容以及源地址)

网桥工作在混杂方式;

(比如网卡,在正常方式下,网卡如果接收地址为当前网卡MAC地址,这时相当于单播通信,网卡就会把内容提交给上层。但是如果在广播信道里,即使不是数据的接收方也可以看到发送方发送的数据,这样网卡就会把所有它接收到的数据,不管是不是它这个节点应该接受的数据都会提交给上层)

网桥接收到一定帧后,通过查询地址/端口对应表来确定是丢弃还是转发;

网桥刚启动时,地址/端口对应表为空,采用洪泛方法转发帧(使用网桥时不需要对网桥进行配置,只需要物理上连接就可以。洪泛方法:采取广播的方式给所有节点发送);

在转发过程中采用逆向学习算法收集MAC地址。网桥通过分析帧的源MAC地址得到MAC地址与端口的对应关系,并写入地址/端口对应表(因为在刚开始表为空的的时候,是通过广播方式给所有节点转发数据的,所以是没法了解想要传送的节点的MAC目的地址的,因此用源MAC地址);

网桥软件对地址/端口对应表进行不断的更新,并定时检查,删除在一定时间内没有更新的地址/端口项;

透明网桥的帧转发

帧的转发过程:目的LAN与源LAN相同,则丢弃帧;目的LAN源LAN不同,则转发帧;目的LAN未知,则洪泛帧;均执行逆向学习

透明桥工作流程

网桥回路问题

↑图

假设

A发出了一个帧,假设不认识目标方,这时网桥会按照广播方式处理。正常来讲,F1和F2的时序不会完全一样。因为网桥的端口在发送数据之前需要进行媒介的载波倾听。它们会进行信道使用的竞争,因此存在一定的先后顺序。假设F1先发送,发给网桥2,F2发给网桥1,这样数据帧就会一直在信道里不停地传输;如果目标地址明确的话就不会出现这样的问题

解决多个网桥产生回路的问题:

让网桥之间互相通信,用一棵连接每个LAN的生成树覆盖实际的

拓扑结构

(任意两个节点之间只有唯一一条想通的连接,使备份的网桥处于休眠状态,只接受数据而不转发数据。会监控主要

网桥的作用

,一旦主要网桥失控就会重新构建生成树来保障中断网络的连通性,这时备用的网桥就变成了主要网桥)

※构造生成树:

每个桥广播自己的桥编号,号最小的桥称为生成树的根;每个网桥计算自己到根的最短路径,构造出生成树,使得每个LAN和桥到根的路径最短;当某个LAN或网桥发生故障时,要重新计算生成树;生成树构造完后,算法继续执行以便自动发现拓扑结构变化,重新生成树

源路由网桥

透明网桥容易安装,但网络资源的利用不充分。源路由网桥在发送帧时将详细的路由信息放在帧的首部中。源站以广播方式向欲通信的目的站发送一个发现帧,每个发现帧都记录所经过的路由。发现帧到达目的站时就沿各自的路由返回源站。源站在得知这些路由后,按照客户的要求,从所有可能的路由中选择出一个更佳路由之后发送帧。凡从该源站向该目的站发送的帧的首部,都必须携带源站所确定的这一路由信息。

以太网交换机

通常都有多个端口,以太网交换机实质上就是一个多端口的网桥

特点:

以太网交换机的每个端口都直接与主机(同构主机)相连(网桥的端口连接的是网段,可以连异构网段),并且一般都工作在全双工方式。交换机能同时联通许多对的端口,使每一对相互通信的主机都能像独占通信媒体那样,进行无碰撞的传输数据。以太网交换机由于使用了专用的交换结构芯片,其交换速率就较高。物理端口类型相同

计算机网络-k8s网络

K8S网络模型设计:扁袜备带平的可连通的网络

K8S的网络是一个极其复杂的网络,如果想要用两个简单的词来描述K8S网络,那么我觉得扁平和可连通是K8S网络更大的特点(不懂隔离性)。

何为连通呢?

二层网络的连通:如果能够直接通过MAC帧直接通信的网络便是二层连通的网络,LAN就是这种网络

比如无限WIFI网络,比如以太网

三层网络的连通:如果能够通过IP报直接通信的网络便是三层连通的网络,便是三层连通

三层网络的连通分为两个部分,之一个部分是三层网络中的每一个LAN都是二层连通的,其次需要存在能够连通的路由来保证;这里可以简单回顾下三层网络通信的流程

通过路由表确定目标ip是否在链路上

如果在链路上,通过arp协议获取对应主机的mac地址,发送mac帧到链路上;

如果不在同一个链路上,通过本地路由表发送mac帧给下一跳,然后下一跳解析mac帧,分析ip报,继续路由直到最终跳到目标网络再次通过mac帧发送到目标主机或者到达ttl消失。

假如其中任何一个步骤不满足或者出问题,三层网络就无法连通

何为扁平呢?

就是希望可以在pod内直接通过IP进行互相通信而不需要在pod内部使用vpn之类的东西来连接其他pod(基础架构告芦化),具体的可以看下k8s对网络的设计与要求。

k8s在设计其网络时,就希望网络对运行在其中的pod是透明的,因此提出了以下的一些要求与原则

k8s组网要求

所有的Pods之间可以在不使用 NAT网络地址转换 的情况下相互通信

所有的Nodes之间可以在不使用NAT网络地址转换的情况下相互通信

每个Pod自己看到的自己的ip和其他Pod看到的一致

k8s网络模型设计原则

每个Pod都拥有一个独立的 IP地址,而且 假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中 。

不管它们是否运行在同 一 个 Node (宿主机)中,都要求它们可以直接通过对方的 IP 进行访问。

设计这个原则的原因 是,用户不需要额外考虑如何建立 Pod 之间的连接,也不需要考虑将容器端口映射到主机端口等问题。

而要想深入了解K8S的网络,就不得不去了解Linux操作系统中的网络以及计算机网络协议栈和一些网络技术

其中关于计滚信算机网络协议栈道部分上次分享已经分享过了,所以本次的主题更多是Linux操作系统的网络以及一些网络技术

Linux操作系统中的网络

首先,我们来看下基本的linux网络,如下图所示

一个APP生成socket数据,然后经过网络协议栈包装IP报文,然后封装成MAC帧,在经过网络协议栈的过程中,会存在netfilters对数据进行一定的处理,同时也会存在路由的过程,

如果在同一个物理链路内,将直接通过ARP协议获取目标IP地址的MAC地址最终发送出去;

如果不在同一个物理链路则通过路由表确定下一跳的MAC地址,封装成MAC帧发送到目标地址。

在这个过程中,会根据路由表选择对应的端口,如果是lo端口,则会将帧原封不动的返回计算机网络协议栈,然后回到监听对应端口的SOCKET里。

如果是以太网端口则走以太网端口,如果是蓝牙或者无线网端口同理。

iptables与netfilters

iptables是一个用户空间的应用程序,通过该程序可以修改一些配置文件,这些文件定义了防火墙的一些行为,netfilters是操作系统内核的一部分,netfilters里有5个回调钩子会触发iptables里的规则;iptables只是Linux防火墙的管理工具而已,位于/in/iptables。真正实现防火墙功能的是

netfilter,它是Linux内核中实现包过滤的内部结构。

这里不具体讲述其实现的原理,仅仅列出netfilters的一些功能:

1)filter表——三个链:INPUT、FORWARD、OUTPUT

作用:过滤数据包 内核模块:iptables_filter.

2)Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT

作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat

3)Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)

4)Raw表——两个链:OUTPUT、PREROUTING

作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw

虚拟网络设备 tap/tun

TUN 和 TAP 设备是 Linux 内核虚拟网络设备,纯软件实现。TUN(TUNnel)设备模拟网络层设备,处理三层报文如 IP

报文。TAP 设备模拟链路层设备,处理二层报文,比如以太网帧。TUN 用于路由,而 TAP 用于创建网桥。OS 向连接到 TUN/TAP

设备的用户空间程序发送报文;用户空间程序可像往物理口发送报文那样向 TUN/TAP 口发送报文,在这种情况下,TUN/TAP

设备发送(或注入)报文到 OS 协议栈,就像报文是从物理口收到一样。

虚拟网络设备 veth-pairs

虚拟以太网电缆。使用双向有名管道实现。常用于不同 namespace 之间的通信,即 namespace 数据穿越或容器数据穿越。

虚拟网络设备 bridge

bridge是linux自带的虚拟交换机(网桥),其可以连接多个以太网设备,拥有智能处理MAC帧的能力,流向交换机的MAC帧将智能的被传输到相应的二层链路

网络命名空间

在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。

从逻辑上说,网络命名空间是网络栈的副本,有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。

从系统的角度来看,当通过clone()系统调用创建新进程时,传递标志CLONE_NEWNET将在新进程中创建一个全新的网络命名空间。

从用户的角度来看,我们只需使用工具ip(package is iproute2)来创建一个新的持久网络命名空间。

从系统实现来说,就是原本一个数据结构是static公共的,后来变成进程私有的,在PCB里存在一个命名空间的结构,命名空间里有着网络命名空间,网络命名空间拥有着所有跟网络相关的配置数据

默认空的网络命名空间可能只有一个未启动的lo回环网卡。

两个网络命名空间可以通过以太网揽直接连着两个网络命名空间的网卡,也可以通过以太网网桥连接。

通过以太网网桥或者以太网揽连接的两个网络命名空间只能说是在二层连通的,如果希望在三层连通,还需要给每个网络命名空间配置相应的路由表规则以及分配IP地址。

如何使用虚拟网络设备联通网络命名空间

SingleHost容器网络

none模式

本质上就是创建一个网络命名空间,里面没有路由表,也没有通过veths-pair连接任何链路,外部无法访问这个容器,容器也无法访问外部

host模式

本质上就是使用宿主机的默认网络命名空间

container模式

本质上就是将当前容器部署在另一个容器所在的网络命名空间,这样发给本地的报文最终通过回环网卡回到了本机,这是同一个网络命名空间可以互通的原因

bridge模式

桥接模式就是在这些网络命名空间通过veth-pairs连接到同一个虚拟交换机上(二层连通),同时在对应的命名空间配置对应的路由表规则,但是从图片中可以看到交换机另一端连的上网络协议栈。

也就是那些MAC帧都会被宿主机接收,但是宿主机接收并不一定会处理,比如并没有开启ip转发功能(工作于路由器模式还是主机模式),那么不是本地ip的报文都会被丢弃;或者说netfilters拒绝处理

这些奇怪的报文。

理论上,这些容器发送给其他容器的mac报文是会被虚拟交换机智能转发到对应的容器的,这是同一主机不同容器互相连通的原因

假如宿主机配备了相应的路由规则和防火墙规则,那么容器的报文说能够通过路由最终转发出去的,这也是容器访问互联网的原理

但是这种模式是没法运用在多主机的情况下,因为宿主机不知道其他宿主机里的虚拟网络的路由,当相关ip报到达宿主机时,这些ip报将会被宿主机交给默认路由(下一跳:路由器)

最终路由器会把相关的ip报丢失或者到达ttl最终丢失

MultiHost容器网络

路由方案

回顾docker的单机网络模型,我们发现多主机不能通行的原因就在于你只能给当前主机配置路由规则和防火墙规则,而其他主机并不知道这些ip在你的虚拟网络中,假如能够将这些路由信息同步到其他

宿主机,那么网络便会打通。比较直接的想法就是给每台宿主机配置路由规则。而路由规则要求下一跳必须在当前网络,所以假如宿主机是二层互联的,那么通过给这些宿主机同步这些路由规则便能够

实现一个扁平的连通的网络。

其中布置在每一台宿主机可以通过k8s的daemonSet实现,而这种数据的管理可以交给etcd来实现。

这类方案便是基于路由,基于这个方案的实现有基于静态路由的flannel的host-gateway,以及基于动态路由的calico(使用边际路由协议以及一堆深奥的名词的实现)。

下面来看看Flannel的host-gateway原理(每一台宿主机都相当于本机容器网络的路由器):

通过路由方案构建的网络,宿主机也能访问这些虚拟网络里的Pod

询问基德大佬得知国际化sit环境的k8s网络接口实现就是Flannel的Host-gateway,而我们的办公网络和集群网络之间的路由是搭建好的,所以我们应该可以直接通过podId访问pod里的服务

下面是sit环境的两个服务

跟踪路由发现符合猜想

其中10.1.9.56和10.1.1.24就是宿主机的ip,这些宿主机在一个LAN里,这些宿主机相当于虚拟网络中的路由器;

猜测我们办公网和qunhe集群在一个VLAN里(二层可达)

隧道方案

隧道方案比较典型的就是UDP和XVLAN,两者都是使用Overlay网络(覆盖网络,所谓的大二层技术);其实用隧道技术最多的是VPN应用

其中UDP是XVLAN的替代品(早期Linux没有支持XVLAN协议,通过tun/tap技术将流量引到用户空间然后解包生成包再发,因为发生在用户空间而且多次copy导致性能较差,所以一般不推荐,除非你的linux版本比较低没法用xvlan)

下面就简单介绍下XVLAN技术的大概原理,下图是XVLAN的报文格式,可以发现就是在高层协议的报文里塞了二层报文

其中XVLAN头里有一个关键的字段,VNID这是个24位的字段,每个虚拟的网络主机都有一个自身的VNID作为标识,理论上支持2的24次方个虚拟网络。

在docker的桥接网络里,是使用docker0网桥,在Flannel的xvlan方案里则是使用cni0作为网桥(和docker0没啥区别),主要的不同是cni网桥后面连接的是flannel.1这个网络设备,应该是一个虚拟网卡

这个网卡将原始报文包装成XVLAN报文(linux高版本支持xvlan报文)

这时需要的信息有 源nodeId,目标nodeId,源vnid,源macId,目标macId,源podId,目标podId

其中目标nodeId,目标macId这两个信息是不存在的;因此需要有个方式根据目标podId获取目标nodeId以及目标macId

因此需要记录如何根据目标podId获取目标macId以及目标nodeId即可

这些数据是可以托管在某个地方的,Flannel就是将这些信息记录在etcd上

在每个node上的flannel.1网络设备通过etcd来通过对方的podId获取nodeId和macId

这样最终报文就变成了一个源ip是源nodeIp,目标ip是目标nodeIp的IP报文了(两台宿主机三层可达)

原本经过虚拟网桥是直接连接网络协议栈,但在xvlan模式下,则改为连接一个flannel1,在flannel1中将对原始报文封装成overlay报文转发

udp模式类似,只是udp转发报文说通过tap连通到用户空间,用户空间对报文进行处理然后发送(因为多次内核态用户态切换且数据copy问题,性能较差,仅在不支持xvlan的低版本linux中使用)

当然xvlan是一个技术,上面只是简单介绍最简单的形式

参考:

开发内功修炼之网络篇:

K8S知识图谱:

VXLAN协议原理简介:

linux双网卡透明网桥的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux双网卡透明网桥,Linux双网卡的透明网桥概述,什么是网桥,计算机网络-k8s网络的信息别忘了在本站进行查找喔。


数据运维技术 » Linux双网卡的透明网桥概述 (linux双网卡透明网桥)