Linux虚拟网络设备之bridge
继前两篇介绍了tun/tap和veth之后,本篇将介绍Linux下常用的一种虚拟网络设备,那就是bridge(桥)。
Linux ip netns 命令-CSDN博客
veth-pair,netns-CSDN博客
图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN_veth 转发 有拷贝-CSDN博客
virsh 获取虚机IP,网桥ip,brctl,arp使用_virsh查看虚拟机ip-CSDN博客
ip tunnel 隧道技术-CSDN博客
Linux ip netns 命令-CSDN博客
本篇将通过实际的例子来一步一步解释bridge是如何工作的。
什么是bridge?
首先,bridge是一个虚拟网络设备,所以具有网络设备的特征,可以配置IP、MAC地址等;其次,bridge是一个虚拟交换机,和物理交换机有类似的功能。
对于普通的网络设备来说,只有两端,从一端进来的数据会从另一端出去,如物理网卡从外面网络中收到的数据会转发给内核协议栈,而从协议栈过来的数据会转发到外面的物理网络中。
而bridge不同,bridge有多个端口,数据可以从任何端口进来,进来之后从哪个口出去和物理交换机的原理差不多,要看mac地址。
创建bridge
我们先用iproute2创建一个bridge:
dev@debian:~$ sudo ip link add name br0 type bridge
dev@debian:~$ sudo ip link set br0 up
当刚创建一个bridge时,它是一个独立的网络设备,只有一个端口连着协议栈,其它的端口啥都没连,这样的bridge没有任何实际功能,如下图所示:
+----------------------------------------------------------------+ | | | +------------------------------------------------+ | | | Newwork Protocol Stack | | | +------------------------------------------------+ | | ↑ ↑ | |..............|................................|................| | ↓ ↓ | | +----------+ +------------+ | | | eth0 | | br0 | | | +----------+ +------------+ | | 192.168.3.21 ↑ | | | | | | | +--------------|-------------------------------------------------+↓Physical Network
这里假设eth0是我们的物理网卡,IP地址是192.168.3.21,网关是192.168.3.1
将bridge和veth设备相连
创建一对veth设备,并配置上IPdev@debian:~$ sudo ip link add veth0 type veth peer name veth1
dev@debian:~$ sudo ip addr add 192.168.3.101/24 dev veth0
dev@debian:~$ sudo ip addr add 192.168.3.102/24 dev veth1
dev@debian:~$ sudo ip link set veth0 up
dev@debian:~$ sudo ip link set veth1 up
将veth0连上br0dev@debian:~$ sudo ip link set dev veth0 master br0
#通过bridge link命令可以看到br0上连接了哪些设备
dev@debian:~$ sudo bridge link
6: veth0 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2
这时候,网络就变成了这个样子:
+----------------------------------------------------------------+ | | | +------------------------------------------------+ | | | Newwork Protocol Stack | | | +------------------------------------------------+ | | ↑ ↑ | ↑ | |............|............|..............|............|..........| | ↓ ↓ ↓ ↓ | | +------+ +--------+ +-------+ +-------+ | | | .3.21| | | | .3.101| | .3.102| | | +------+ +--------+ +-------+ +-------+ | | | eth0 | | br0 |<--->| veth0 | | veth1 | | | +------+ +--------+ +-------+ +-------+ | | ↑ ↑ ↑ | | | | | | | | +------------+ | | | | +------------|---------------------------------------------------+↓Physical Network
这里为了画图方便,省略了IP地址前面的192.168,比如.3.21就表示192.168.3.21
br0和veth0相连之后,发生了几个变化:
-
br0和veth0之间连接起来了,并且是双向的通道
-
协议栈和veth0之间变成了单通道,协议栈能发数据给veth0,但veth0从外面收到的数据不会转发给协议栈
-
br0的mac地址变成了veth0的mac地址
相当于bridge在veth0和协议栈之间插了一脚,在veth0上面做了点小动作,将veth0本来要转发给协议栈的数据给拦截了,全部转发给bridge了,同时bridge也可以向veth0发数据。
下面来检验一下是不是这样的:
通过veth0 ping veth1失败:
dev@debian:~$ ping -c 1 -I veth0 192.168.3.102
PING 192.168.2.1 (192.168.2.1) from 192.168.2.11 veth0: 56(84) bytes of data.
From 192.168.2.11 icmp_seq=1 Destination Host Unreachable--- 192.168.2.1 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
为什么veth0加入了bridge之后,就ping不通veth2了呢? 先抓包看看:
#由于veth0的arp缓存里面没有veth1的mac地址,所以ping之前先发arp请求 #从veth1上抓包来看,veth1收到了arp请求,并且返回了应答
dev@debian:~$ sudo tcpdump -n -i veth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth1, link-type EN10MB (Ethernet), capture size 262144 bytes
21:43:48.353509 ARP, Request who-has 192.168.3.102 tell 192.168.3.101, length 28
21:43:48.353518 ARP, Reply 192.168.3.102 is-at 26:58:a2:57:37:e9, length 28
#从veth0上抓包来看,数据包也发出去了,并且也收到了返回
dev@debian:~$ sudo tcpdump -n -i veth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:44:09.775392 ARP, Request who-has 192.168.3.102 tell 192.168.3.101, length 28
21:44:09.775400 ARP, Reply 192.168.3.102 is-at 26:58:a2:57:37:e9, length 28
#再看br0上的数据包,发现只有应答
dev@debian:~$ sudo tcpdump -n -i br0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:45:48.225459 ARP, Reply 192.168.3.102 is-at 26:58:a2:57:37:e9, length 28
从上面的抓包可以看出,去和回来的流程都没有问题,问题就出在veth0收到应答包后没有给协议栈,而是给了br0,于是协议栈得不到veth1的mac地址,从而通信失败。
给bridge配上IP
通过上面的分析可以看出,给veth0配置IP没有意义,因为就算协议栈传数据包给veth0,应答包也回不来。这里我们就将veth0的IP让给bridge。
dev@debian:~$ sudo ip addr del 192.168.3.101/24 dev veth0
dev@debian:~$ sudo ip addr add 192.168.3.101/24 dev br0
于是网络变成了这样子:
+----------------------------------------------------------------+ | | | +------------------------------------------------+ | | | Newwork Protocol Stack | | | +------------------------------------------------+ | | ↑ ↑ ↑ | |............|............|...........................|..........| | ↓ ↓ ↓ | | +------+ +--------+ +-------+ +-------+ | | | .3.21| | .3.101 | | | | .3.102| | | +------+ +--------+ +-------+ +-------+ | | | eth0 | | br0 |<--->| veth0 | | veth1 | | | +------+ +--------+ +-------+ +-------+ | | ↑ ↑ ↑ | | | | | | | | +------------+ | | | | +------------|---------------------------------------------------+↓Physical Network
其实veth0和协议栈之间还是有联系的,但由于veth0没有配置IP,所以协议栈在路由的时候不会将数据包发给veth0,就算强制要求数据包通过veth0发送出去,但由于veth0从另一端收到的数据包只会给br0,所以协议栈还是没法收到相应的arp应答包,导致通信失败。
这里为了表达更直观,将协议栈和veth0之间的联系去掉了,veth0相当于一根网线。
再通过br0 ping一下veth1,结果成功
dev@debian:~$ ping -c 1 -I br0 192.168.3.102
PING 192.168.3.102 (192.168.3.102) from 192.168.3.101 br0: 56(84) bytes of data.
64 bytes from 192.168.3.102: icmp_seq=1 ttl=64 time=0.121 ms--- 192.168.3.102 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.121/0.121/0.121/0.000 ms
但ping网关还是失败,因为这个bridge上只有两个网络设备,分别是192.168.3.101和192.168.3.102,br0不知道192.168.3.1在哪。
dev@debian:~$ ping -c 1 -I br0 192.168.3.1
PING 192.168.3.1 (192.168.3.1) from 192.168.3.101 br0: 56(84) bytes of data.
From 192.168.3.101 icmp_seq=1 Destination Host Unreachable--- 192.168.3.1 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
将物理网卡添加到bridge
将eth0添加到br0上:
dev@debian:~$ sudo ip link set dev eth0 master br0
dev@debian:~$ sudo bridge link
2: eth0 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4
6: veth0 state UP : mtu 1500 master br0 state forwarding priority 32 cost 2
br0根本不区分接入进来的是物理设备还是虚拟设备,对它来说都一样的,都是网络设备,所以当eth0加入br0之后,落得和上面veth0一样的下场,从外面网络收到的数据包将无条件的转发给br0,自己变成了一根网线。
这时通过eth0来ping网关失败,但由于br0通过eth0这根网线连上了外面的物理交换机,所以连在br0上的设备都能ping通网关,这里连上的设备就是veth1和br0自己,veth1是通过veth0这根网线连上去的,而br0可以理解为自己有一块自带的网卡。
#通过eth0来ping网关失败
dev@debian:~$ ping -c 1 -I eth0 192.168.3.1
PING 192.168.3.1 (192.168.3.1) from 192.168.3.21 eth0: 56(84) bytes of data.
From 192.168.3.21 icmp_seq=1 Destination Host Unreachable--- 192.168.3.1 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
#通过br0来ping网关成功
dev@debian:~$ ping -c 1 -I br0 192.168.3.1
PING 192.168.3.1 (192.168.3.1) from 192.168.3.101 br0: 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=27.5 ms--- 192.168.3.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 27.518/27.518/27.518/0.000 ms
#通过veth1来ping网关成功
dev@debian:~$ ping -c 1 -I veth1 192.168.3.1
PING 192.168.3.1 (192.168.3.1) from 192.168.3.102 veth1: 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=68.8 ms--- 192.168.3.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 68.806/68.806/68.806/0.000 ms
由于eth0已经变成了和网线差不多的功能,所以在eth0上配置IP已经没有什么意义了,并且还会影响协议栈的路由选择,比如如果上面ping的时候不指定网卡的话,协议栈有可能优先选择eth0,导致ping不通,所以这里需要将eth0上的IP去掉。
#在本人的测试机器上,由于eth0上有IP, #访问192.168.3.0/24网段时,会优先选择eth0
dev@debian:~$ sudo route -v
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.3.1 0.0.0.0 UG 0 0 0 eth0
link-local * 255.255.0.0 U 1000 0 0 eth0
192.168.3.0 * 255.255.255.0 U 0 0 0 eth0
192.168.3.0 * 255.255.255.0 U 0 0 0 veth1
192.168.3.0 * 255.255.255.0 U 0 0 0 br0
#由于eth0已结接入了br0,所有它收到的数据包都会转发给br0, #于是协议栈收不到arp应答包,导致ping失败
dev@debian:~$ ping -c 1 192.168.3.1
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
From 192.168.3.21 icmp_seq=1 Destination Host Unreachable--- 192.168.3.1 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
#将eth0上的IP删除掉
dev@debian:~$ sudo ip addr del 192.168.3.21/24 dev eth0
#再ping一次,成功
dev@debian:~$ ping -c 1 192.168.3.1
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=3.91 ms--- 192.168.3.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.916/3.916/3.916/0.000 ms
#这是因为eth0没有IP之后,路由表里面就没有它了,于是数据包会从veth1出去
dev@debian:~$ sudo route -v
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 * 255.255.255.0 U 0 0 0 veth1
192.168.3.0 * 255.255.255.0 U 0 0 0 br0
#从这里也可以看出,由于原来的默认路由走的是eth0,所以当eth0的IP被删除之后, #默认路由不见了,想要连接192.168.3.0/24以外的网段的话,需要手动将默认网关加回来#添加默认网关,然后再ping外网成功
dev@debian:~$ sudo ip route add default via 192.168.3.1
dev@debian:~$ ping -c 1 baidu.com
PING baidu.com (111.13.101.208) 56(84) bytes of data.
64 bytes from 111.13.101.208: icmp_seq=1 ttl=51 time=30.6 ms--- baidu.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 30.690/30.690/30.690/0.000 ms
经过上面一系列的操作后,网络变成了这个样子:
+----------------------------------------------------------------+ | | | +------------------------------------------------+ | | | Newwork Protocol Stack | | | +------------------------------------------------+ | | ↑ ↑ | |.........................|...........................|..........| | ↓ ↓ | | +------+ +--------+ +-------+ +-------+ | | | | | .3.101 | | | | .3.102| | | +------+ +--------+ +-------+ +-------+ | | | eth0 |<--->| br0 |<--->| veth0 | | veth1 | | | +------+ +--------+ +-------+ +-------+ | | ↑ ↑ ↑ | | | | | | | | +------------+ | | | | +------------|---------------------------------------------------+↓Physical Network
上面的操作中有几点需要注意:
-
如果是在虚拟机上做上述操作,记得打开网卡的混杂模式(不是在Linux里面,而是在虚拟机的配置上面,如VirtualBox上相应虚拟机的网卡配置项里面),不然veth1的网络会不通,因为eth0不在混杂模式的话,会丢掉目的mac地址是veth1的数据包
-
上面虽然通了,但由于Linux下arp的特性,当协议栈收到外面的arp请求时,不管是问101还是102,都会回复两个arp应答,分别包含br0和veth1的mac地址,也即Linux觉得外面发给101和102的数据包从br0和veth1进协议栈都一样,没有区别。由于回复了两个arp应答,而外面的设备只会用其中的一个,并且具体用哪个会随着时间发生变化,于是导致一个问题,就是外面回复给102的数据包可能从101的br0上进来,即通过102 ping外面时,可能在veth1抓不到回复包,而在br0上能抓到回复包。说明数据流在交换机那层没有完全的隔离开,br0和veth1会收到对方的IP应答包。为了解决上述问题,可以配置rp_filter, arp_filter, arp_ignore, arp_announce等参数,但不建议这么做,容易出错,调试比较麻烦。
-
在无线网络环境中,情况会变得比较复杂,因为无线网络需要登录,登陆后无线路由器只认一个mac地址,所有从这台机器出去的mac地址都必须是那一个,于是通过无线网卡上网的机器上的所有虚拟机想要上网的话,都必须依赖虚拟机管理软件(如VirtualBox)将每个虚拟机的网卡mac地址转成出口的mac地址(即无线网卡的mac地址),数据包回来的时候还要转回来,所以如果一个IP有两个ARP应答包的话,有可能导致mac地址的转换有问题,导致网络不通,或者有时通有时不通。解决办法就是将连接进br0的所有设备的mac地址都改成和eth0一样的mac地址,因为eth0的mac地址会被虚拟机正常的做转换。在上面的例子中,执行下面的命令即可:
dev@debian:~$ sudo ip link set dev veth1 down #08:00:27:3b:0d:b9是eth0的mac地址 dev@debian:~$ sudo ip link set dev veth1 address 08:00:27:3b:0d:b9 dev@debian:~$ sudo ip link set dev veth1 up
bridge必须要配置IP吗?
在我们常见的物理交换机中,有可以配置IP和不能配置IP两种,不能配置IP的交换机一般通过com口连上去做配置(更简单的交换机连com口的没有,不支持任何配置),而能配置IP的交换机可以在配置好IP之后,通过该IP远程连接上去做配置,从而更方便。
bridge就属于后一种交换机,自带虚拟网卡,可以配置IP,该虚拟网卡一端连在bridge上,另一端跟协议栈相连。和物理交换机一样,bridge的工作不依赖于该虚拟网卡,但bridge工作不代表机器能连上网,要看组网方式。
删除br0上的IP:
dev@debian:~$ sudo ip addr del 192.168.3.101/24 dev br0
于是网络变成了这样子,相当于br0的一个端口通过eth0连着交换机,另一个端口通过veth0连着veth1:
+----------------------------------------------------------------+ | | | +------------------------------------------------+ | | | Newwork Protocol Stack | | | +------------------------------------------------+ | | ↑ | |.....................................................|..........| | ↓ | | +------+ +--------+ +-------+ +-------+ | | | | | | | | | .3.102| | | +------+ +--------+ +-------+ +-------+ | | | eth0 |<--->| br0 |<--->| veth0 | | veth1 | | | +------+ +--------+ +-------+ +-------+ | | ↑ ↑ ↑ | | | | | | | | +------------+ | | | | +------------|---------------------------------------------------+↓Physical Network
dev@debian:~$ ping -c 1 192.168.3.1
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=1.24 ms--- 192.168.3.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.242/1.242/1.242/0.000 ms
ping网关成功,说明这种情况下br0不配置IP对通信没有影响,数据包还能从veth1出去:
上面如果没有veth0和veth1的话,删除br0上的IP后,网络将会不通,因为没有设备和协议栈完全相连
bridge常用场景
上面通过例子展示了bridge的功能,但例子中的那种部署方式没有什么实际用途,还不如在一个网卡上配置多个IP地址来的直接。这里来介绍两种常见的部署方式。
虚拟机
虚拟机通过tun/tap或者其它类似的虚拟网络设备,将虚拟机内的网卡同br0连接起来,这样就达到和真实交换机一样的效果,虚拟机发出去的数据包先到达br0,然后由br0交给eth0发送出去,数据包都不需要经过host机器的协议栈,效率高。
+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+ | Host | VirtualMachine1 | VirtualMachine2 | | | | | | +------------------------------------------------+ | +-------------------------+ | +-------------------------+ | | | Newwork Protocol Stack | | | Newwork Protocol Stack | | | Newwork Protocol Stack | | | +------------------------------------------------+ | +-------------------------+ | +-------------------------+ | | ↑ | ↑ | ↑ | |..........................|.....................................|...................|.....................|....................|....................| | ↓ | ↓ | ↓ | | +--------+ | +-------+ | +-------+ | | | .3.101 | | | .3.102| | | .3.103| | | +------+ +--------+ +-------+ | +-------+ | +-------+ | | | eth0 |<--->| br0 |<--->|tun/tap| | | eth0 | | | eth0 | | | +------+ +--------+ +-------+ | +-------+ | +-------+ | | ↑ ↑ ↑ | ↑ | ↑ | | | | +-------------------------------------------+ | | | | | ↓ | | | | | | +-------+ | | | | | | |tun/tap| | | | | | | +-------+ | | | | | | ↑ | | | | | | +-------------------------------------------------------------------------------|--------------------+ | | | | | | | | | | | | | | | | +------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+↓Physical Network (192.168.3.0/24)
docker
由于容器运行在自己单独的network namespace里面,所以都有自己单独的协议栈,情况和上面的虚拟机差不多,但它采用了另一种方式来和外界通信:
+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+ | Host | Container 1 | Container 2 | | | | | | +------------------------------------------------+ | +-------------------------+ | +-------------------------+ | | | Newwork Protocol Stack | | | Newwork Protocol Stack | | | Newwork Protocol Stack | | | +------------------------------------------------+ | +-------------------------+ | +-------------------------+ | | ↑ ↑ | ↑ | ↑ | |............|.............|.....................................|...................|.....................|....................|....................| | ↓ ↓ | ↓ | ↓ | | +------+ +--------+ | +-------+ | +-------+ | | |.3.101| | .9.1 | | | .9.2 | | | .9.3 | | | +------+ +--------+ +-------+ | +-------+ | +-------+ | | | eth0 | | br0 |<--->| veth | | | eth0 | | | eth0 | | | +------+ +--------+ +-------+ | +-------+ | +-------+ | | ↑ ↑ ↑ | ↑ | ↑ | | | | +-------------------------------------------+ | | | | | ↓ | | | | | | +-------+ | | | | | | | veth | | | | | | | +-------+ | | | | | | ↑ | | | | | | +-------------------------------------------------------------------------------|--------------------+ | | | | | | | | | | | | | | | | +------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+↓Physical Network (192.168.3.0/24)
容器中配置网关为.9.1,发出去的数据包先到达br0,然后交给host机器的协议栈,由于目的IP是外网IP,且host机器开启了IP forward功能,于是数据包会通过eth0发送出去,由于.9.1是内网IP,所以一般发出去之前会先做NAT转换(NAT转换和IP forward功能都需要自己配置)。由于要经过host机器的协议栈,并且还要做NAT转换,所以性能没有上面虚拟机那种方案好,优点是容器处于内网中,安全性相对要高点。(由于数据包统一由IP层从eth0转发出去,所以不存在mac地址的问题,在无线网络环境下也工作良好)
上面两种部署方案中,同一网段的每个网卡都有自己单独的协议栈,所以不存在上面说的多个ARP的问题
-
Linux 上的基础网络设备详解
-
Harping on ARP
-
MAC address spoofing
-
It doesn't work with my Wireless card!
======================================
前言
以下针对linux 下 virt-manager 管理kvm虚拟机配置网络类型,默认为nat。
nat网络模式,虚拟机之间可通信,虚拟机和主机可通信,不可与主机外的网络通信;
桥接网络模式,虚拟机之间可通信,虚拟机和主机可通信,可与主机外的网络通信。
配置桥接模式
1、创建新的以太网桥
brctl addbr br0
2、网桥配置ip
ifconfig br0 172.1.1.143 netmask 255.255.255.0 up
3、向现有网桥添加接口
1)首先保证ens9f0是down状态
执行,(如果是远程链接的宿主机,执行后你就掉线了)
nmcli c down ens9f0
(2)网桥添加接口
brctl addif br0 ens9f0
这个步骤可能会遇到的问题
device ens9f0is already a member of a bridge :can`t enslave it to bridge br0
即已经桥接了其他网桥,这时候
执行 nmcli connection 查看
nmcli connection
再执行 nmcli c de xxx 删除网桥xxx
nmcli c de xxx
最后再网桥添加接口
brctl addif br0 ens9f0
4、重启网络
systemctl restart NetworkManager
/etc/init.d/networking restart 有可能不需要重启
重启后如果ifconfig看不见br0
那就执行
ifconfig br0 172.1.1.143 netmask 255.255.255.0 up
执行完 ,再执行ifconfig查看发现设备和网桥硬件地址一样
ifconfig
5、虚拟机配置
virt-manager
4、配置虚拟机ip
最后根据主机,配置一下虚拟机的ip即可,配置的ip和桥接的主机ip在同一网段即可。
如:
5、配置成功
ping 一下主机的ip,和主机外ip,能ping通即成功了!
最后附上网络配置的一些命令
显示所有网络连接的信息:
nmcli connection show关闭指定连接:
nmcli c down ens9f0启动指定连接:
nmcli c up ens9f0删除指定连接:
nmcli c delete ens9f0# 或
nmcli c de ens9f0使用 show 显示可用的以太网桥
brctl showaddbr 创建新的以太网桥
brctl addbr br0 配置ip
ifconfig br0 192.168.0.100 netmask 255.255.255.0 up关闭网桥STP
brctl stp br0 off使用delbr删除现有的以太网桥
brctl delbr br0 向现有网桥添加接口
brctl addif br0 ens9f0向现有网桥删除接口
brctl delif br0 ens9f0/etc/sysconfig/network-scripts//etc/network/interfacenmcli 网卡配置路径
/etc/NetworkManager/system-connections/查看网口插接状态
cat /sys/class/net/eth0/carrier
1
1表示插接如果是down的状态,需要先up下
cat /sys/class/net/eth0/operstate
ip link set dev eth1 up
然后再查看
cat /sys/class/net/eth0/carrier
相关文章:

Linux虚拟网络设备之bridge
继前两篇介绍了tun/tap和veth之后,本篇将介绍Linux下常用的一种虚拟网络设备,那就是bridge(桥)。 Linux ip netns 命令-CSDN博客 veth-pair,netns-CSDN博客 图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN_veth 转发 有拷贝-C…...

最后一个大更新!Win11 2023正式发布:Copilot终于来了
美国当地时间周二, 微软正式宣布为所有符合条件的Windows 11电脑发布Windows 11 2023更新(Windows 11 23H2)。 考虑到微软计划在2024年发布下一代Windows(可能是Windows 12),这也使得23H2成为Windows 11的最后一个重大更新。 此次更新的重点就是AI功能&a…...

pandas教程:Reading and Writing Data in Text Format (以文本格式读取和写入数据)
文章目录 Chapter 6 Data Loading, Storage, and File Formats(数据加载,存储,文件格式)6.1 Reading and Writing Data in Text Format (以文本格式读取和写入数据)1 Reading Text Files in Pieces(读取一部分文本&…...

软考高级系统架构设计师系列之:软考高级系统架构设计师论文专题
软考高级系统架构设计师系列之:软考高级系统架构设计师论文专题 一、论文相关内容二、论文专题大纲三、论文考试方式四、历年真题汇总分析五、论文常见问题六、论文评分标准七、搭建论文万能模版八、论文万能模版公式九、搭建论文万能模版—摘要十、搭建论文万能模版—背景十一…...

目标检测中的评价指标
目标检测中的评价指标 将检测目标分为正样本和负样本。 真阳性(true positives , TP) : 正样本被正确识别为正样本。 假阳性(false positives, FP): 负样本被错误识别为正样本。 假阴性(false negatives, FN&#…...

【AI编程】ai编程插件汇总iFlyCode、codegeex
1、iFlyCode 开发公司:讯飞 支持IDE: VS Code、IntelliJ IDEA、CLion、PyCharm、WebStorm 支持语言: Python、JavaScript、C、Java 下载地址:https://iflycode.xfyun.cn/ iFlyCode 快捷键列表: Tab 采纳建议 Esc 拒绝建议 Alt\ 主动…...

算法通关村第八关|黄金挑战|二叉树的最近公共祖先
二叉树的最近公共祖先 找p和q就行,找不到p和q的节点就返回null,找到的就层层返回p或q,其他的还是返回null。直到某一层的left和right都不为null说明得到了最近公共节点,再将这个节点层层返回。如果p和q存在祖先和子节点的关系&am…...

亚马逊云科技产品测评』活动征文|通过使用Amazon Neptune来预测电影类型初体验
文章目录 福利来袭Amazon Neptune什么是图数据库为什么要使用图数据库什么是Amazon NeptuneNeptune 的特点 快速入门环境搭建notebook 图神经网络快速构建加载数据配置端点Gremlin 查询清理 删除环境S3 存储桶删除 授权声明:本篇文章授权活动官方亚马逊云科技文章转…...

【获奖论文】2023年数学建模国赛优秀获奖论文
论文篇幅过长,本文仅展示少部分;共计14篇完整PDF获奖论文。 关注在微信公众号:数学建模BOOM,回复“2023国赛”获取。 注意!是在公众号回复,不是在b站。 优秀论文部分内容展示: 更多A~E题的完…...

美团三年,总结的10条血泪教训
在美团的三年多时光,如同一部悠长的交响曲,高高低低,而今离开已有一段时间。闲暇之余,梳理了三年多的收获与感慨,总结成10条,既是对过去一段时光的的一个深情回眸,也是对未来之路的一份期许。 …...

【CSP认证考试】202309-1:坐标变换(其一)100分解题思路+代码
解题思路 暴力解决,不考虑时空开销就一直用for循环也可以做出来。按照题目意思输入两个数组,然后将第一个输入的数组的x部分累加起来记作x,再将y部分累加起来记作y。再将第二个数组的x部分都加上x,y部分加上y。最后输出第二个数组…...

剩余参数和展开运算符的区别
一、剩余参数 剩余参数语法允许在函数定义时,将多个参数表示为一个参数数组。 使用剩余参数,可以将不定数量的参数作为一个数组接收,并在函数内部对其进行操作。剩余参数使用三个点 (…) 加上一个参数名来表示,通常用于函数的最后…...

ES6的基础用法
本文会着重讲解es6,帮助大家熟悉es6和掌握es6的写法 1,let 没有变量提升,使用变量在变量定义之前,这点和var有很大区别 不允许重复声明 只在块级作用域里有效 暂时性死区 console.log(a) //报错,因为在未定义前调用l…...

standard_init_linux.go:211: exec user process caused “exec format error“
在使用docker搭建hue的过程中出现了如下错误: standard_init_linux.go:211: exec user process caused "exec format error"docker日志 [roots14 bin]# docker logs fa5b1c4e0614 standard_init_linux.go:211: exec user process caused "exec format error&q…...

python的format函数的用法及实例
目录 1.format函数的语法及用法 (1)语法:{}.format() (2)用法:用于格式化字符串。可以接受无限个参数,可以指定顺序。返回结果为字符串。 2.实例 (1)不设置位置&…...

BigDecimal 类型的累加操作
BigDecimal 累加操作 .add操作...

基于单片机的土壤温湿度控制系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、温湿度控制系统的整体规划2.3系统的总体构架 二、温度湿度控制系统硬件设计3.1系统硬件概述 三、 温湿度系统软件…...

服务器数据库中了elbie勒索病毒怎么办,elbie勒索病毒解密,数据恢复
网络技术的不断成熟,为企业的生产运营提供了强有力的支撑,但是,随之而来的网络安全威胁也不断增加。云天数据恢复中心陆陆续续接到很多企业的求助,企业的服务器数据库e遭到了elbie勒索病毒攻击,导致企业计算机系统瘫痪…...

接口测试及接口测试工具
首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你…...

JUC包工具类介绍二
JUC包工具类介绍二 异步任务 Callable Callable接口定义一个异步任务,当Callable接口提交到ExecutorService进行异步执行时,返回结果通过Java Future获取。Callable接口同样可以获取任务执行时的异常。 public class MyCallable implements Callable&…...

第8章_聚合函数
文章目录 1 聚合函数介绍1.1 AVG和SUM函数1.2 MIN和Max函数1.3 COUNT函数演示代码 2 GROUP BY2.1 基本使用2.2 使用多个列分组2.3 演示代码 3 HAVING3.1 基本使用3.2 WHERE和HAVING的对比3.3 演示代码 4 SELECT的执行过程4.1 查询的结构4.2 SELECT执行顺序4.3 SQL的执行原理演示…...

Mysql8与mariadb的安装与常用设置
一、v10服务器mariadb的安装与常用设置 V10服务器默认安装了mariadb数据库。也可使用命令sudo yum install mariadb手动安装或升级默认安装的版本。 1.1 修改数据库密码 systemctl restart mariadb,重启mariadb服务;mysql -u root -p,要求输入密码直接回车&#…...

深入剖析Golang中单例模式
前言 虽说Golang并不是C、Java这种传统的面向对象语言,而是偏向于面向接口编程的语言。但是Golang依旧有接口、结构体、组合等概念去模拟所谓面向对象中非常重要的设计模式。基于面向对象的模型去编写代码往往能编写成高内聚、低耦合、扩展性极强、难出bug的高质量…...

Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】
一、Gateway整合sentinel限流 网关作为内部系统外的一层屏障,对内起到-定的保护作用,限流便是其中之- - .网关层的限流可以简单地针对不同路由进行限流,也可针对业务的接口进行限流,或者根据接口的特征分组限流。 1、添加依赖 <dependency><groupId>c…...

深入解析 Redis 分布式锁原理
一、实现原理 1.1 基本原理 JDK 原生的锁可以让不同线程之间以互斥的方式来访问共享资源,但如果想要在不同进程之间以互斥的方式来访问共享资源,JDK 原生的锁就无能为力了。此时可以使用 Redis 来实现分布式锁。 Redis 实现分布式锁的核心命令如下&am…...

[unity]多脚本情况下update函数的执行顺序
序 有的时候,执行某些脚本时会有先后顺序的要求。unity是按什么顺序来执行脚本的?如何设置? 默认的执行顺序 官方文档里面有个很长的图: Unity - Manual: Order of execution for event functions (unity3d.com) 根据文档&…...

Maven中<scope>中等级的区别
标签指定了依赖项的级别吗,默认是compile (编译)。意味着依赖项将会在编译时和运行时都被包含在项目中 <scope> 标签指定了依赖项的级别为 import 。除了 import 级别,Maven还支持以下几种级别: compile &#x…...

小明和完美序列(HashMap、Map、Entry)
小明和完美序列 知识点: //导包:HashMap、Map、Entry import java.util.HashMap; import java.util.Map; import java.util.Map.Entry;public class Main {public static void main(String [] args) { //创建Map(HashMap)对象 M…...

【hexo博客配置】hexo icarus主题配置
配置icarus 步骤一:下载icarus github网址:[hexo-theme-icarus](ppoffice/hexo-theme-icarus: A simple, delicate, and modern theme for the static site generator Hexo. (github.com)) 可以从这个网址上下载zip文件,解压后,…...

建表时如何合理选择字段类型
前言 我们在建表的时候关于字段类型的选择会有这么几类人: 严谨型 严格调研每个字段可能的大小,然后根据不同字段类型的限制,进行选择,这一类人在创建关系型数据表的时候是没有问题的。图自己省事型 把所有字段都设置为String&a…...